Java读取文件的方式总体可以分为两类:按字节读取和按字符读取。按字节读取就是采用InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,最后经常用new String(byte[]);把字节数组转换成String。在最后一步隐藏了一个编码的细节,new String(byte[]);会使用操作系统默认的字符集来解码字节数组,中文操作系统就是GBK。而我
们从输入流里读取的字节很可能就不是GBK编码的,因为从输入流里读取的字节编码取决于被读取的文件自身的编码。举个例子:我们在D:盘新建一个名为demo.txt的文件,写入”我们。”,并保存。此时demo.txt编码是ANSI,中文操作系统下就是GBK。此时我们用输入字节流读取该文件所得到的字节就是使用GBK方式编码的字节。那么我们最终new String
(byte[]);时采用平台默认的GBK来编码成String也是没有问题的(字节编码和默认解码一致)。试想一下,如果在保存demo.txt文件时,我们选择UTF-8编码,那么该文件的编码就不在是ANSI了,而变成了UTF-8。仍然采用输入字节流来读取,那么此时读取的字节和上一次就不一样了,这次的字节是UTF-8编码的字节。两次的字节显然不一样,一个很明显的区
别就是:GBK每个汉字两个字节,而UTF-8每个汉字三个字节。如何我们最后还使用new String(byte[]);来构造String对象,则会出现乱码,原因很简单,因为构造时采用的默认解码GBK,而我们的字节是UTF-8字节。正确的办法就是使用new String(byte[],”UTF-8”);来构造String对象。此时我们的字节编码和构造使用的解码是一致的,不会出现乱码问题了。
再来研究一下字节输出流。
我们知道如果采用字节输出流把字节输出到某个文件,我们是无法指定生成文件的编码的(假设文件以前不存在),那么生成的文件是什么编码的呢?经过测试发现,其实这取决于写入的字节编码格式。比如以下代码:
OutputStream out = new FileOutputStream("d:\\demo.txt");
out.write("我们".getBytes());
getBytes()会采用操作系统默认的字符集来编码字节,这里就是GBK,所以我们写入demo.txt文件的是GBK编码的字节。那么这个文件的编码就是GBK。如果稍微修改一下程序:out.write("我们".getBytes(“UTF-8”));此时我们写入的字节就是UTF-8的,那么demo.txt文件编码就是UTF-8。这里还有一点,如果把”我们”换成123或abc之类的ascii码字符,那么无论是采用getBytes()或者getBytes(“UTF-8”)那么生成的文件都将是GBK编码的。
总之,InputStream中的字节编码取决文件本身的编码,而OutputStream生成文件的编码取决于字节的编码。
符输入流来读取文件。
首先,我们需要理解一下字符流。其实字符流可以看做是一种包装流,它的底层还是采用字节流来读取字节,然后它使用指定的编码方式将读取字节解码为字符。说起字符流,不得不提的就是InputStreamReader。以下是java api对它的说明: InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的
字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说到这里其实很明白了,InputStreamReader在底层还是采用字节流来读取字节,读取字节后它需要一个编码格式来解码读取的字节,如果我们在构造InputStreamReader没有传入编码方式,那么会采用操作系统默认的GBK来解码读取的字节。还用上面demo.txt的例子,假设demo.txt编码
方式为GBK,我们使用如下代码来读取文件:
InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”));
那么我们读取不会产生乱码,因为文件采用GBK编码,所以读出的字节也是GBK编码的,而InputStreamReader默认采用解码也是GBK。如果把demo.txt编码方式换成UTF-8,那么我们采用这种方式读取就会产生乱码。这是因为字节编码(UTF-8)和我们的解码编码(GBK)造成的。解决办法如下:
InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);
给InputStreamReader指定解码编码,这样二者统一就不会出现乱码了。
字符输出流。
字符输出流的原理和字符输入流的原理一样,也可以看做是包装流,其底层还是采用字节输出流来写文件。只是字符输出流根据指定的编码将字符转换为字节的。字符输出流的主要类是:OutputStreamWriter。Java api解释如下:OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。说的很明白了,它需要一个编码将写入的字符转换为字节,如果没有指定则采用GBK编码,那么输出的字节都将是GBK编码,生成的文件也是GBK编码的。如果采用以下方式构造OutputStreamWriter:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);
那么写入的字符将被编码为UTF-8的字节,生成的文件也将是UTF-8格式的。
分享到:
相关推荐
利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码...
3 编码:根据编码表对输入的字符串进行编码压缩 并将编码后的字符串输出到compress txt文件中 4 译码:对compress txt中的压缩字符进行解压缩 把解压的答案输出到文件decompress txt文件中 5 比较decompress txt和...
本文档主要解决 Windows10+Qt5.8.0 中文编译乱码问题(包括代码设置的中文,编译输出乱码以及文件保存中文路径乱码等问题)。亲测有效。
利用哈夫曼编码进行对已有文件进行重新编码可以大大提高减小文件大小,减少存储空 间。但是,这要求在首先对一个现有文件进行编码行成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,...
FPGA Editor相关文件如下。 (1)输入文件.NCD:该文件由映射(Map)流程或布局... (3)输入文件.NMC:该文件是一个物理宏库文件,其中包含物理宏库的定义,同时这个物理宏可以在FPGA Editor及HDL编码中被例化。 :
用c数据结构写成的哈夫曼编码器,支持文件输入输出。 可以进行译码。
1. 需求描述 输入:文本文件(压缩文件) 输出:压缩文件(文本文件)(压缩率) ...对字符在文件中的输入是以二进制代码的形式读入,在将压缩后的二进制码输入文本中时则将每八位看作是一个新的字符
3、 输出:压缩后的数据文件 4、 源程序格式要整齐清晰,注释简单明了。 试验步骤;: 1、 打开软件C++创建一个工程,并且在工程新建一个源文件LZW.cpp和头文件LZW.h 2、 输入以下代码 3、 在工程文件夹里新建一个 ...
建立一个文本文件,统计该文件中各字符频率,对各字符进行Huffman编码,将该文件翻译成Huffman编码文件,再将Huffman编码文件翻译成原文件。压缩文件即读文件,统计文件中的字符个数,对文件进行哈夫曼编码和译码,...
NULL 博文链接:https://ywsm.iteye.com/blog/557825
(4)对文件名进行输入校验,显示时进行输出编码。 3. 文件存储: (1)上传文件应保存在指定路径下。 (2)对上传文件进行随机数重命名,避免文件被覆盖。 (3)设置上传文件路径, 使用户不能轻易访问自己上传的...
MATLAB实现BP神经网络多输入多输出预测(完整源码和数据) 数据为多输入多输出预测数据,输入10个特征,输出3个变量,程序乱码是由于版本不一致导致,可以用记事本打开复制到你的文件。 运行环境MATLAB2018b及以上。
问题描述 在数据加密和数据压缩中常需要对特殊的字符串进行数字编号。给定的字母表 A 由 26 个小写英文字母组成 A={a,b,…,z}。该字母表产生的升序字符串是指字符串中字母按照从左 到右出现的次序与字母在字母表中...
压缩文件时采用两遍源文件扫描,第一遍扫描统计文件中实际出现的符号种类数以及各符号出现的概率(符号出现次数/文件字节长度),然后建立Huffman二叉树,第二遍扫描源文件则实现Huffman编码以及压缩文件的输出。
哈弗曼编码压缩文件c语言实现,课设的结果!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
包括文件的导入,huffman树的建立,打印,编码与解码。有算法的详细分析,流程图,原代吗,运行结果。
数据结构课程设计要求实现的Huffman 编码译码器,里面包含实验报告;
MATLAB实现RBF径向基神经网络多输入多输出预测(完整源码和数据)数据为多输入多输出预测数据,输入10个特征,输出3个变量,程序乱码是由于版本不一致导致,可以用记事本打开复制到你的文件。运行环境MATLAB2018b及...
基于cyclone2 (EP2C8Q)设计的8位输入3位输出编码器Verilog源码 quartus 9.0工程 module ENCODE_8_3_tb; reg [7:0] DATA; wire [2:0] CODE; //Instance DUT. ENCODE_8_3 I_ENCODE_8_3 ( .DATA (DATA), .CODE ...
centos7文件导入的乱码问题 #1.查看是否安装中文包 可以使用下面的命名查看系统是否安装了中文安装包。 下面展示一些 locale -a |grep zh_CN 没有输出,说明没有安装,输入下面的命令安装: yum groupinstall ...