Java如何识别并读取不同编码的txt文本文件

说明

在Java中读取不同编码的文本文件时出现乱码问题,通常是因为文件的编码格式与程序中指定的编码格式不匹配。例如,如果你的文件是用UTF-16编码的,而你尝试用UTF-8来读取,就会导致乱码。

情况1:已知文件编码

1、确定文件的编码格式
首先,你需要确定你的文本文件的编码格式。常见的编码格式有UTF-8、GBK、GB2312、ISO-8859-1等。你可以使用一些工具(如Notepad++、Sublime Text、VSCode等)来查看或修改文件的编码格式。

2、使用正确的编码读取文件
在Java中,你可以使用java.nio.file.Files类或java.io.InputStreamReader类来读取文件,并指定正确的字符集(编码)。

3、代码示例

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class ReadFileExample {
    public static void main(String[] args) {
        try {
            // 指定文件路径和编码
            List<String> lines = Files.readAllLines(Paths.get("path/to/your/file.txt"), StandardCharsets.UTF_8);
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

情况2:不知文件编码

如果你不确定文件的编码,或者想要程序能够自动处理多种编码,可以考虑使用第三方库如Apache Commons IO,它提供了更灵活的编码处理方式。
1、先添加依赖到你的项目中

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

2、代码示例

import org.apache.commons.io.input.BOMInputStream;
import org.apache.commons.io.ByteOrderMark;
import java.io.*;
import org.apache.commons.io.input.AutoDetectReader;
import java.nio.charset.Charset;
 
public class ReadFileExample {
    public static void main(String[] args) {
        try (AutoDetectReader reader = new AutoDetectReader(new FileInputStream("path/to/your/file.txt"), 
                                                           new ByteOrderMark[] { ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE }, 
                                                           "UTF-8")) { // Default encoding if no BOM is found or cannot be determined
            char[] buffer = new char[1024];
            int numCharsRead;
            while ((numCharsRead = reader.read(buffer)) != -1) {
                System.out.println(new String(buffer, 0, numCharsRead));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文作者:盗梦笔记

本文链接:https://www.cnblogs.com/zhaojinhui/p/18702210

版权声明:本作品采用zhaojh许可协议进行许可。

posted @   盗梦笔记  阅读(42)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示