美文网首页
读取文件的正确方式

读取文件的正确方式

作者: 叠搭宝箱 | 来源:发表于2016-02-02 15:31 被阅读23次

缘由

最近在写一个MapReduce程序的时候,出现了读取HDFS文件截断的情况,代码如下:

//fs : FileSystem
InputStream in = null;
byte[] b = new byte[1024 * 1024 * 64];
int len = 0;
try {
    in = fs.open(new Path(fileName));
    len = in.read(b);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
return new String(b, 0, len);

理论上,bytes数组大小已经设置为了64MB, 远远大于要读取的文件,那为什么会出现这种情况呢?
一开始怀疑 InputStream.read() 方法导致截断,果然,改成用BufferedReader读取的方式就好用了。

BufferedReader reader = null;
StringBuilder sb = new StringBuilder();
try {
    reader = new BufferedReader(new InputStreamReader(fs.open(new Path(fileName))));
    String line = null;

    while((line = reader.readLine()) != null) {
        sb.append(line);
    }
    } catch (Exception ioe) {
        System.out.println(fileName + " does't exist!");
    } finally {
        try {
            reader.close();
        } catch (IOException e) {
            System.out.println("Reader close failed");
        }
    }
    return sb.toString();
}

但真实的原因真的是这样么?

分析

由上段代码可知, InputStream.read()读取的byte长度和期望值不同,我在 API Docs中发现了这么一个定义

An attempt is made to read as many as len bytes, but a smaller number may be read.

也就是说, read() 方法只是尽量的去读stream,不保证读取stream中全部的字节。类似的还有 availabe()方法,这个方法同样不保证返回正确的stream大小,而导致这些状况的原因可能有以下几点:

  1. 硬件上的buffersize比较小
  2. 网络的IO比较慢
  3. 文件是分布式的,组合在一起时需要花费一些时间

最后关于解决方法,除了使用Reader一行一行读以外, 使用 DataInputStream.readFully() 也能避免这种问题。

THE END

相关文章

  • 读取文件的正确方式

    缘由 最近在写一个MapReduce程序的时候,出现了读取HDFS文件截断的情况,代码如下: 理论上,bytes数...

  • python 文件操作

    fp=open("文件路径","方式") 文件读取 文件写入 文件关闭 文件读取写入方式

  • 算法技术面

    . R语言的文件读取:csv文件的读取方式(read.csv),txt文件的读取方式(read.table) 2....

  • python3读写文件的方式:

    一、读取文本格式的文件:open 读取内容的方式: 写文件方式: 例: 二、读取csv格式的文件: 例:

  • numpy总结

    1、文件读取 np.genfromtxt(文件路径,delimiter=分割方式,dtype=读取方式) 2、nu...

  • node基本模块之fs

    异步方式 读取文本文件 读取二进制文件

  • shell下怎么读取文件

    shell读取文件的方式有两种,while循环读和for循环读 while循环读取方式 for循环读取方式

  • Java读取Properties文件的几种方式

    读取Properties文件的几种方式 读取 Properties 文件 1.在xml 配置文件中使用"${}" ...

  • 2021-12-22 Python-17

    文件操作 文件读取 文件读取到内存中时,可以通过一次性读取文件的全部内容,也可以每次一行方式逐步读取。1.读取整个...

  • SpringBoot 读取 YML 配置

    YML文件 读取方式1 读取方式2 新建NfsProperties 新建OssProperties pom.xml...

网友评论

      本文标题:读取文件的正确方式

      本文链接:https://www.haomeiwen.com/subject/cfzskttx.html