java 读取文件 乱码详解编程语言

前言

  我们在开发中经常会遇到java读取文件乱码的问题,也许快速的百度能解决问题,但只有掌握了内部原理,我们才算真正的“解决”掉问题。


示例:

新建一个b.txt文件,只有一个字“卡”,并保存编码格式为gbk

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
 
public class TestInputStream{ 
	 
	public static void main(String[] args){ 
		InputStream is  = null; 
		String filename = "C://Users//DELL//Desktop//b.txt"; 
		try { 
			is  = new FileInputStream(new File(filename)); 
			byte[] buffer = new byte[30]; 
			int length = 0; 
			while((length = is.read(buffer)) != -1){ 
				System.out.print(new String(buffer, 0,  length,"gbk") ); 
			} 
		} catch (FileNotFoundException e) { 
			e.printStackTrace(); 
		} catch (IOException e) { 
			e.printStackTrace(); 
		}finally{ 
			if(is!=null){ 
				try { 
					is.close(); 
				} catch (IOException e) { 
					e.printStackTrace(); 
				} 
			} 
		} 
	} 
}

结果,输出正常

java 读取文件 乱码详解编程语言

现在我们稍微,改一下程序,将

System.out.print(new String(buffer, 0,  length,"gbk") );

改为

System.out.print(new String(buffer, 0,  length,"utf8") );


编译后,重新运行,我们发现乱码了

java 读取文件 乱码详解编程语言

分析:

       这个过程中,我们只是修改了字节流转化为字符流的编码方案。

源文件保存编码格式是gbk,我们用gbk,解码,结果正常;

源文件保存编码格式是gbk,我们用utf8,解码,结果乱码;

由此我们得出,java读取文件时,字节流转化为字符流的编码方案取决于源文件的编码方案


扩展:

java在加载属性文件时,经常会出现乱码!不是获取字节流出的错误,而是字节流转化为字符流出的错误!所以,我们将字节流包装一层字符流,并指定源文件的解码方式就可以解决乱码问题。

java 读取文件 乱码详解编程语言

总结:

1、java读取文件,获取到的二进制流是固定正确的。

2、java读取文件,字节流转化为字符流的编码方案取决于源文件的编码方案。


关于操作系统默认编码,请参考我的另外一篇博文-Dfile.encoding与Charset.defaultCharset()

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20274.html

(0)
上一篇 2021年7月19日 23:18
下一篇 2021年7月19日 23:18

相关推荐

发表回复

登录后才能评论