要读取的文件
文件编码格式为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以后,打印汉字乱码
解决
问题一(编译完成后,运行显示找不到主类)
去掉上述测试代码的package行,然后重新编译运行(找不到主类的具体原因与类的路径有关,除了去掉package还有别的解决办法)
// package com.accu.ecs.liu;
问题二(打印汉字乱码)
原因是在cmd运行javac命令和java命令的时候,没有指定使用的编码,
javac -encoding UTF-8 Test1.java
java -Dfile.encoding=utf-8 Test1