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

2022年7月4日 28点热度 0人点赞

由于在项目开发的过程中经常会用到文件操作,特别是文件的读取,把数据从文件中读到程序中进行操作。

今天就特地花时间总结一下文件操作,包括几种经常会用到的文件读取方式,比如从磁盘中读取、从项目的resource中读取。

文件读的时候有一个坑,就是有时候发现读取到的文件信息重复 了,这个是我踩过的坑,今天就详细分析一下。

首先文件是全英文,因为英文的每隔字符只占用一个字节,所以使用字节流读取;如果是文档有大量中文,建议使用字符流。

本文将会提到文件读取的时候的细节,关于字符和int型的细节问题。

工具/原料

  • io
  • read

方法/步骤

  1. 1

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

  2. 2

    编写测试类,如下图的代码,这是我刚开始写文件操作,经常会写的代码,现在感觉有点幼稚,这个代码会读重复。

       先分析一下代码:

       1、创建一个StringBuilder存储读取到的文件信息。

       2、从磁盘中获取文件流,参数是文件的绝对地址。

       3、定义一个50大小的字节数组

       4、定义循环:将文件流中的数据读取到b数组中,直到read返回-1;-1表示已经到达文件末尾。将每次读取到的数据存储到StringBuilder中。

       5、关闭文件流,并输出读取到的数据到控制台(注意最好是写在finally中,我这是方便截图,,,,)。

  3. 3

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

  4. 4

    分析问题:

    sb.append(new String(b));每次都把b中的50个字节数据存储到sb中;

    试想最后一次,假设最后一次只有10个字符,此时把这50个字节的数据存储到b中;但是b的后40字节还存在,并且是上一次循环的数据;

    此时把b存储到StringBuilder中,后40个并不是我们想要的字符,结果发生了重复。

  5. 5

    如何避免:

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

  6. 6

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

  7. 7

    当然了,也可以一个字节一个字节的读取,也是可以正确输出。

    使用is.read();但是有一点需要注意,就是此方法返回的是一个字节的整数,再将其存储到内存中时,需要先将每一位转换成字符char。

  8. 8

    还有一种方式是使用FileInputStream的available()方法,此方法可以返回文件流的字节长度,但是不建议使用它来确定字节数组的大小,

    如果是本地测试,是没有问题的,如果有网络传输,等情况则可能会得不到正确的值。所以这个方法,一般用于大概的和获取字节流的大小。

    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部

laozhao

这个人很懒,什么都没留下

文章评论