废话少说,上测试代码
package com.example.demo.utils;
import java.io.*;
import java.util.Scanner;
public class TestCode {
public static void main(String[] args) throws Exception,IOException{
// testCode();
// getFileContent();
// getFileContentTwo();
getFileContentThree();
}
//方法一
public static void getFileContent() throws IOException{
FileReader fr = new FileReader("E:\\testfile\\test_utf8.txt");
BufferedReader br = new BufferedReader(fr);
while(br.ready()){
System.out.println(br.readLine());
}
}
//方法二
public static void getFileContentTwo() throws IOException{
String encoding="GBK";
File file=new File("E:\\testfile\\test.txt");
//判断文件是否存在
if(file.isFile() && file.exists()) {
//考虑到编码格式
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while ((lineTxt = bufferedReader.readLine()) != null) {
System.out.println(lineTxt);
}
read.close();
}else {
System.out.println("该文件不存在");
}
}
//方法三
public static void getFileContentThree() throws IOException{
Scanner in = new Scanner(new File("E:\\testfile\\test_utf8.txt"));
while (in.hasNextLine()) {
System.out.println(in.nextLine());
}
}
/**
*
*@param:
*@return:获得txt文件编码格式
*@Date:2019/8/26
*/
public static void testCode() throws Exception{
BufferedInputStream bin=new BufferedInputStream(new FileInputStream("E:\\testfile\\test.txt"));
int p=(bin.read()<<8)+bin.read();
String code=null;
switch (p){
case 0xefbb:
code="UTF-8";
break;
case 0xfffe:
code="Unicode";
break;
case 0xfeff:
code="UTF-16BE";
break;
default:
code="GBK";
}
System.out.println(String.format("测试文件的编码格式是:"+code));
}
}
相同点:
三种方法都可以读取到本地磁盘下的tex文件内容
三种方法读取编码格式为utf-8的文件,都可以正常输出
区别:
方法一、方法三输出编码格式为GBK的文件,会有问题 ———— 方法一控制台输出的文件内容会乱码、方法三则什么也不输出
方法二读取编码格式为GBK的文件,可以正常输出
测试结果
方法一、方法二、方法三
文件编码:utf_8
方法一
文件编码:GBK
方法二
文件编码:GBK
方法三
文件编码:GBK
概念:
计算机中文件都用一堆二进制的数字 0 、1保存的。文件的编码格式指的是这个文件的内容和0、 1的一个对应关系。因此,可以得到两个结论:
1.一个文件的编码格式有且仅有一种。(要么是utf-8,要么是gbk,要么是其他编码,不能几种同时存在)
2.文件的编码格式可以改变。
分析:读取文件乱码的原因是什么?
文件的编码格式指的是一个对应关系。对应关系错了,肯定拿不到文件中的内容。所以乱码的根源就是保存文件的编码格式和读取文件的编码格式不同。
知道了文件乱码的原因就好解决问题了
java中只有在转换流中才能设置读取流文件中编码格式。(代码示例详见上述方法二)
其他字节流,字符流读取的文件格式都是默认的utf-8,无法设置编码格式。这种方法读取utf-8的文件不会有问题,一旦非utf-8就会出错。
所以,上面方法二虽然代码量最多,但优势也显而易见——健壮性、稳定性、扩展性都优于方法一、三。
补充:
字符流:txt文件。该流只能处理字符,但处理字符速度很快
字节流:txt文件,Excel文件,word文件、图片、视频等文件。可以处理所有以bit为单位储存的文件,也就是说可以处理所有的文件,但是在处理字符上的速度不如字符流
除了字符流和字节流之外,还有转换流:
- InputStreamReader:
- OutputStreamWriter:
转换流可以把字节流转化为字符流,可以解决编码格式和解码格式不一致的问题。
字符流文件和字节流文件的区别在于计算机用来保存文件的二进制编码0 、1的位数。
字符流就是一个字符由一个8位数的二进制数表示;
字节流表示一个基本存储单元的二进制数可能是8位,也可能是16位,32位等。
因此字符流可以理解为特殊的字节流。