• 在Java中使用FileReader.read()进行读取文件时,为什么乱码?两个方法解决


    1. public class FileReader_ {
    2. public static void main(String[] args) {
    3. }
    4. @Test
    5. public void m1() {
    6. String filePath = "e:\\hello.txt";
    7. FileReader fileReader = null;
    8. try {
    9. fileReader = new FileReader(filePath);
    10. //循环读取 使用read
    11. while (fileReader.read()!=-1){
    12. System.out.print((char) fileReader.read());//默认输出的是int,因此需要转化为char
    13. }
    14. } catch (IOException e) {
    15. e.printStackTrace();
    16. } finally {
    17. try {
    18. if (fileReader != null) {
    19. fileReader.close();
    20. }
    21. } catch (IOException e) {
    22. e.printStackTrace();
    23. }
    24. }
    25. }
    26. }

     以上代码是有可能出现代码输出混乱的情况的,输出效果如下:

    可能会出现乱码的问题:

    原因可能是文件编码与程序读取时使用的编码不一致。在创建FileReader对象时,没有指定文件的编码格式,因此默认使用的是系统默认的编码格式。如果文件中包含非系统默认编码格式的字符,那么在读取时就会出现乱码。

    为了解决这个问题,可以在创建FileReader对象时指定文件的编码格式。例如,如果文件是使用UTF-8编码的,可以这样修改代码:

    1. public void m1() {
    2. String filePath = "e:\\hello.txt";
    3. FileReader fileReader = null;
    4. int data = 0;
    5. try {
    6. // 指定字符编码为UTF-8
    7. fileReader = new FileReader(filePath, StandardCharsets.UTF_8);
    8. //循环读取 使用read
    9. while ((data=fileReader.read())!=-1){
    10. System.out.print((char) data); // 修改这里
    11. }
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. } finally {
    15. try {
    16. if (fileReader != null) {
    17. fileReader.close();
    18. }
    19. } catch (IOException e) {
    20. e.printStackTrace();
    21. }
    22. }
    23. }

    上面这种方法,按理说也可以,但是我使用后发现报错了,不能调用UTF-8,感兴趣的小伙伴,自行尝试 ~

    在Java中,FileReader.read()方法返回的是读取到的字节(int类型),而不是字符(char类型)。因此,需要使用强制类型转换将其转换为字符。

     我们需要使用int类型的date来,接受fileReader.read(),当接受的数据不为空时,一直循环下去,直到接受到最后一个字符,然后每接受一个数据,就强制转换成 char 打印到控制台,就不会出现乱码的情况了

    1. public class FileReader02_ {
    2. public static void main(String[] args) {
    3. }
    4. @Test
    5. public void m1() {
    6. String filePath = "e:\\hello.txt";
    7. FileReader fileReader = null;
    8. int date=0;
    9. try {
    10. fileReader = new FileReader(filePath);
    11. //循环读取 使用read
    12. while ((date=fileReader.read())!=-1){
    13. System.out.print((char) date);
    14. }
    15. } catch (IOException e) {
    16. e.printStackTrace();
    17. } finally {
    18. try {
    19. if (fileReader != null) {
    20. fileReader.close();
    21. }
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. }
    27. }

     控制台打印输出:

  • 相关阅读:
    python django 小程序博客源码
    js 回到顶部逻辑实现和elementUI源码解析
    基于Gazebo的无人机管道检测
    计算机网络——应用层网络应用模型、DNS系统、文件传输协议、电子邮件、万维网和HTTP协议
    2023.09.09青少年软件编程(Python)等级考试试卷(四级)
    为什么不建议你用 MongoDB 这类产品替代时序数据库?
    Redux(mvc、flux、react-redux)
    C#/.NET/.NET Core优秀项目和框架精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
    [暑假]什么叫做原型?原型链?原型对象? [待补充]
    Python基础——下载安装、卸载和系统环境配置
  • 原文地址:https://blog.csdn.net/qq_58341172/article/details/134066255