【问题标题】:The right way to use BufferdOutputStream to write a large number of different small files使用BufferdOutputStream写入大量不同小文件的正确方法
【发布时间】:2014-01-15 14:42:43
【问题描述】:

我需要编写大量不同的小文件(每个文件大约 30kb)。下面是我的 java 代码:

 for(every file){
    File destFile = new File(fileName);
    try {
        FileOutputStream fos = new FileOutputStream(destFile);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // System.out.println(dr.readLine());
        bos.write(result.getBytes(
                "UTF-8"));

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

当然,对于每个文件,我都必须新建一个 File 对象。但是是否需要为每个不同的文件新建 fileOutputStream 和 BufferdOutputStream 对象?有没有更有效的方法来写入大量小文件?

【问题讨论】:

  • 不,您不能在文件之间共享FileOutputStream

标签: java file fileoutputstream bufferedoutputstream


【解决方案1】:

正如 Sotirios 所说,您不能共享 FileOutputStream。您的方法的问题是您每次迭代都创建一个新文件,而没有关闭它们。这可能会导致您的程序超出允许打开文件的限制。

在 linux 上使用:

cat /proc/sys/fs/file-max

读取您可以打开的最大文件数。

和:

ulimit -n unlimited

删除该限制(小心并调查其他 ulimit 选项)。

【讨论】:

  • 感谢@Martin 进行编辑。是时候在意大利睡觉了......凌晨 3.30 :)
【解决方案2】:

没有。如果您使用 FileOutputStream 包装到 BufferedOutputStream 中,则必须为每个文件创建两个实例。

但是如果你使用 java 7,你可以使用Files#write(Path path, byte\[\] bytes, OpenOption... options) 而不创建两个实例。这个类是从java 7引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多