FileInputStream中文乱码,read()和read(byte[] b)区别

要读取的文件

文件编码格式为UTF-8

编码

测试代码只涉及运行类中的main方法,所以没设置tomcat控制台乱码相关(有关控制台乱码不同情况处理方式,https://www.cnblogs.com/vhua/p/idea_1.html)

读取代码

使用read()方法

read()方法为按字节读取内容,汉字大于一个字节,控制台会乱码

package com.accu.ecs.liu;

import java.io.*;

public class Test1 {
    private String name = "ss";


    public static void main(String[] args) throws IOException {
        InputStream io = null;
        try {
            File file1 = new File("C:\\Users\\YF-JGJ\\Desktop\\cubic安装.txt");
            byte[] bt = new byte[100];
            io = new FileInputStream(file1);
            int len = io.read();
            // int len = io.read(bt);
            while (len > 0) {
                System.out.print((char) len);
                len = io.read();
                // System.out.println(new String(bt));
                // len = io.read(bt);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            io.close();
        }

    }
}

 结果:

 使用read(byte[] b)方法

read(byte[] b)方法为从该输入流读取最多b.length字节的数据到字节数组

b.length最好指定为文件大小,代码中的100是我随便写的

package com.accu.ecs.liu;

import java.io.*;

public class Test1 {
    private String name = "ss";


    public static void main(String[] args) throws IOException {
        InputStream io = null;
        try {
            File file1 = new File("C:\\Users\\YF-JGJ\\Desktop\\cubic安装.txt");
            byte[] bt = new byte[100];
            io = new FileInputStream(file1);
            //int len = io.read();
            int len = io.read(bt);
            while (len > 0) {
                //System.out.print((char) len);
                //len = io.read();
                System.out.println(new String(bt));
                len = io.read(bt);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            io.close();
        }

    }
}

 结果:

总结

FileInputStream的read方法,不传递byte数组做参数,则按字节读取数据,汉字的字节数大于1,导致打印到控制台乱码,传递byte数组做参数以后,通过String的构造方法,可以正常读取数组中的字节,并转为中文展示。


顺带测试了直接使用cmd编译运行的时候的效果

问题点:

  1. 编译完成后,运行显示找不到主类
  2. 解决问题1以后,打印汉字乱码

解决

问题一(编译完成后,运行显示找不到主类)

去掉上述测试代码的package行,然后重新编译运行(找不到主类的具体原因与类的路径有关,除了去掉package还有别的解决办法)

// package com.accu.ecs.liu;

问题二(打印汉字乱码)

原因是在cmd运行javac命令和java命令的时候,没有指定使用的编码,

javac -encoding UTF-8 Test1.java

java -Dfile.encoding=utf-8 Test1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章