养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

java文件操作字节流之读取重复

时间:2024-10-19 14:34:12

由于螅岔出礤在项目开发的过程中经常会用到文件操作,特别是文件的读取,把数据从文件中读到程序中进行操作。今天就特地花时间总结一下文件操作,包括几种经常会用到的文件读取方式,比如从磁盘中读取斤舻浑趸、从项目的resource中读取。文件读的时候有一个坑,就是有时候发现读取到的文件信息重复了,这个是我踩过的坑,今天就详细分析一下。首先文件是全英文,因为英文的每隔字符只占用一个字节,所以使用字节流读取;如果是文档有大量中文,建议使用字符流。本文将会提到文件读取的时候的细节,关于字符和int型的细节问题。

工具/原料

io

read

方法/步骤

1、先来看重复是怎么发生的。首先准备一个txt文件,放到d盘的data目录下。

java文件操作字节流之读取重复

2、编写测试类,如下图的代码,这是我刚开始写文件操作,经常会写的代码,现在感觉有点遣瀑霰澧幼稚,这个代码会读重复。先分析一下代码:创建一个StringBuilder存储读取到的文件信息。2斤舻浑趸、从磁盘中获取文件流,参数是文件的绝对地址。定义一个50大小的字节数组定义循环:将文件流中的数据读取到b数组中,直到read返回-1;-1表示已经到达文件末尾。将每次读取到的数据存储到StringBuilder中。关闭文件流,并输出读取到的数据到控制台(注意最好是写在finally中,我这是方便截图,,,,)。

java文件操作字节流之读取重复

3、查看结果,发现真的发生了重复,文件中最后一个字符是“?”号,结果不是,发现?后面还有数据,并且这些数据是重复的。

java文件操作字节流之读取重复

4、分析问题:sb.append(newStri艘绒庳焰ng(b));每次都把b中的50个字节数据存储到sb中;试想最后一次,假设最后一关骇脘骱次只有10个字符,此时把这50个字节的数据存储到b中;但是b的后40字节还存在,并且是上一次循环的数据;此时把b存储到StringBuilder中,后40个并不是我们想要的字符,结果发生了重复。

5、如何避免:且看is.read(b),方法的API解释,其返回值是读取的流的真实字节数。我们就可以利用这个返回值len,再每次存储数据到sb中时指定长度为len。

java文件操作字节流之读取重复

6、修改后的代码:test2方法,可以完美输出。

java文件操作字节流之读取重复

java文件操作字节流之读取重复

7、当然了,也可以一个字节一个字节的读取,也是可以正确输出。使用is.read();但是有一点需要注意,就是此方法返回的是一个字节的整数,再将其存储到内存中时,需要先将每一位转换成字符char。

java文件操作字节流之读取重复

8、还有一种方式是使用FileInputStream的available()方法,此方法可以返回文件流的字节长度,但是不建议使用它来确定字节数组的大小,如果是本地测试,是没有问题的,如果有网络传输,等情况则可能会得不到正确的值。所以这个方法,一般用于大概的和获取字节流的大小。

java文件操作字节流之读取重复

java文件操作字节流之读取重复

java文件操作字节流之读取重复

© 一点知识