字节流可以读取任何文件,视频流;音频流都可以;

字符流只能读取字符;

说明:一般的汉字是2个字节,而英语字母是1个字节,如果用字节流读取中文,一个字节一个字节的输出,容易把中文汉字截断,建议用字符流读取;

import Java.io.*;

public class Test8
{

/*
* ==>本java文件采用的编码(GBK)读取GBK编码文本,

* 实现思路:
*  1.因为该byte数组只存5个元素,为单.而判断中文包含两个字节,会胜下一个元素.
*  2.两个字节判断,如果第一个为中文的一个字节,那么后面的一个也必定为中文的一个字节,两个字节合成一个中文
*  3.如果第一个不为中文的一个字节,则第二个可以是,也可能不是,两个都不为中文的字节,则输出两个字符,
*  4.如果两个字节前一个不为中文的一个字节后一个是,则把前一个输出,然后continue,这时如果这两个字节中的后一个字节是byte数组中的最后一个元素,则补充一个
*  5.否则不用补充,只把i多加1(i++)for也有个i++,这样就会多跳过一个元素,从而又是数组中两个新的字节去进行判断,再一次进入while


*/
public static void main(String[] args)
{
// 调用方法
reader();
}

public static void reader()
{
// 封装文件
File file = new File("exercise.txt");
try
{
// 创建文件读取流,通过字节流读取
FileInputStream fs = new FileInputStream(file);

// 声明长度为5的byte数组
byte[] b = new byte[5];

// 声明len变量,用于存储read()方法读取的字节个数,还有其它作用
int len;
// 声明两个int变量分别代表byte数组中的两个元素(转换成int型)
int param1;
int param2;

// 使用while循环读取文本文件
while ((len = fs.read(b)) != -1)
{
// for循环用于循环读取数组中的元素,因为有可以是5有可能最后read()方法读入到byte数组中的不到5个元素,所以用len作为一个判断条件
for (int i = 0; i < len; i++)
{
// 因为如果存入byte数组中的元素是单数,所以最后会胜下一个元素,它的元素下标为:i=len-1
if (i == len - 1)
{
// 每一次while循环的得到的byte数组的最后一个元素.
param1 = b[i];
// 如果该元素非汉字
if (param1 >= 0 && param1 <= 127)
{
// 打印该字符
System.out.print((char) param1);
}
else
// 否则为中文的一个字节
{
// 补充读取一个字节
len = fs.read();
if (len == -1)
{
return;
}
// 打印这两个字节,也就是中文
System.out.print(new String(new byte[]{
(byte) param1, (byte) len }));
}
// byte数组中最后一个元素的两种情况判断完,break;
break;
}
// while循环开始后最先执行的代码
param1 = b[i];
param2 = b[i + 1];
// 如果第一个元素param1不为中文的一个字节,那么就可能为两个非中文的字节,也有可能后一个元素param2为中文的一个字节,

if ((param1 >= 0 && param1 <= 127)// 如果param1非中文的一个字节
&& (param2 > 127 || param2 < 0))// 如果param2是中文的一个字节
{
// 打印并跳出当前循环,进行下一次循环
System.out.print((char) param1);
continue;
}
//两个字节都为中文或两个都不为中文字节.
String str = new String(new byte[]{b[i], b[i + 1] });
System.out.print(str);
i++;//打印的是两个字节,i要多加1(用于上面for循环)
}
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}

}

java中用字节流读取文本时中文乱码相关推荐

  1. Java笔记-解决读取文件时中文乱码问题(InputStreamReader设置编码)

    Java一般读取文件时使用如下代码: InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(&q ...

  2. php csv 中文乱码_php读取csv时中文乱码怎么办?

    php读取csv时中文乱码的解决办法:首先在导入csv的php脚本文件头部加上相应代码:然后使用[$row]进行转义,将中文编码读取出来:最后使用一个[fgetcsv()]方法的替代函数,防止php该 ...

  3. 使用字节流读取文本文件时,乱码问题的产生与解决

    问题: 使用字节流读取文本文件时,会将一个汉字劈成两半,一次只能读一半出来,产生了乱码,无法使用.就算是一次读取2个字节出来,也依然不能解决问题. 如何解决乱码问题,读出完整的汉字和中英文混杂的整篇文 ...

  4. 读取csv时中文乱码问题

    最近遇到csv读取出现乱码的问题,研究了下.主要原因是系统不认识读取后数据的编码格式. 从Windows 2000之后的操作系统在文件处理时默认编码采用Unicode,所以.Net 的文件默认编码也是 ...

  5. linux中js文件有乱码,解决node.js读取文件时中文乱码问题

    node.js不能很好地支持中文字符,在读取文件的时候,会出现对中文内容读取的乱码问题(linux系统下默认utf-8编码,一般不会出现该问题,但windows和部分虚拟机由于文件存储格式不同,可能会 ...

  6. .Net Core 读取文件时中文乱码问题的解决方法

    背景 今天在使用core web api上传txt文档的时候本来很顺利的,但是一测试发现读取的中文内容是乱码的,很是纳闷. 出于经验,立马把代码的Encoding.Default改成 Encoding ...

  7. Java @Value(${xxx})取properties时中文乱码

    (1)检查spring的配置文件中,properties的配置编码是否正确. (2)检查你要读取的.properties文件,编码是否正确.可以使用编辑器修改编码,或者文件另存为修改编码为UTF-8

  8. java properties读取中文_Java读取properties文件中文乱码

    Java读取properties文件中文乱码 之前读取properties配置文件时候全都是英文或者数字之类的,最近项目有个需求要properties配置文件中有中文字符存在,那么读取java pro ...

  9. 导入项目时中文乱码的消除

    导入项目时中文乱码一般是因为导入的java文件编码和Eclipse对java文件的默认编码不一致导致的,通过设置改变java文件的默认编码设置可以消除乱码. java文件默认编码设置: Window ...

最新文章

  1. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里
  2. 你为世界杯而战,我为生活而战!
  3. ctf 文件头crc错误_[CTF隐写]png中CRC检验错误的分析
  4. 【MATLAB统计分析与应用100】案例001:matlab使用Importdata函数导入文本txt数据
  5. 广州.NET俱乐部 VSTS活动报道
  6. Node.js对MongoDB进行增删改查操作
  7. ARM 编译 phddns
  8. 多线程中的事务回滚,你真的用对了吗?
  9. c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
  10. 使用idea开发SpringBoot应用,添加@SpringBootApplication注解时,不能自动提示
  11. php aes java_AES php java 互转
  12. 自制的基Ogre的场景编辑器—OgreSE
  13. javascript(js)实现字符串转json对象的四种方法
  14. 布置工作五步法,让工作布置跟高效
  15. js设为首页和加入收藏
  16. Linux架设代理服务器
  17. MFC应用程序中嵌入一个谷歌cef浏览器
  18. 架构师之路16年精选50篇_2011年精选
  19. 计算机常用快捷键(世上最全)
  20. 1、ABP 文档介绍

热门文章

  1. 06.full_text multi_match查询
  2. 操作系统(2) -- 进程管理
  3. 【最详细】数据结构(C语言版 第2版)第三章课后习题答案 严蔚敏 等 编著
  4. 进程P1、P2、P3、P4和P5的前趋图如下图所示。若用PV操作控制进程P1~P5并发执行的过程,则需要设置6个信号S1、S2、S3、S4,且信号量S1~S4的初值都等于0。下图中a和b处应分别填写(
  5. pom文件报错_maven-resources-plugin修改了我的文件
  6. netty java开发文档_《Netty官方文档》设置开发环境
  7. mysql数据库sql语句中使用变量_mysql数据库sql语句中使用变量
  8. java webapps路径_java 获取服务器端的webapps路径 | 学步园
  9. 为什么属龙的有二婚命_76年属龙的二婚在什么时候,76属龙女人婚姻命运怎么样...
  10. python卷积神经网络cnn的训练算法_【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理...