Java读取文件时遇到的乱码问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 19:35   1319   0

最近要做一个Java爬虫,需要从txt文件中读取数据,然后遇到了一些问题。

我的txt文件:

Java读txt文件的语句:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\word.txt")));
String line = "";
while((line = reader.readLine())!= null) {
 System.out.println(line);
}

读取到的结果存在乱码现象:

寻思着可能是文件的编码格式在作祟。所以我去查看了一下txt的编码格式,发现是utf8,感觉这应该没问题呀。于是我又去查看Java API。

找到InputStreamReader类,查看它的构造方法,它一共有4个构造方法,这里我只选取了与本问题相关的两个构造方法,如下:

Constructor and Description
InputStreamReader(InputStream in)

创建一个使用默认字符集的InputStreamReader。

InputStreamReader(InputStream in, Charset cs)

创建一个使用给定字符集的InputStreamReader

看来原因是我们使用的是第一个构造方法,它创建了一个使用默认字符集的InputStreamReader,于是在读取文件时进行了编码转换,然后就导致了一些问题的出现。

那么我们再试一试使用第二个构造方法,我们指定字符集为utf8。

修改后的Java读txt文件的语句:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\word.txt"),"UTF-8"));
String line = "";
while((line = reader.readLine())!= null) {
 System.out.println(line);
}

结果如下:

这个 “?” 是什么鬼。。。

其实现在完全可以忽略 “?” 的问题,只需要在txt文件中第一行添加一个空行,然后在读取的时候,丢弃第一行,从第二行开始读取即可。

1. 在txt中第一行添加一个空行。

2. 在读取时,丢弃第一行,从第二行开始读取:在while循环读取前添加一行:line = reader.readLine();

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\word.txt"),"UTF-8"));
String line = "";
line = reader.readLine();
while((line = reader.readLine())!= null) {
 System.out.println(line);
}

后面,我百度了那个问号出现的原因,有一位高人说明了原因:

附:UTF8最好不要带BOM,附许多经典评论(一篇文章);

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP