正确的方法是使用BufferdOutputStream来编写大量不同的小文件

时间:2013-12-28 02:10:57

标签: java file fileoutputstream bufferedoutputstream

我需要编写大量不同的小文件(每个文件大约30kb).Below是我的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对象?是否有更有效的方法来编写大量的小文件?

2 个答案:

答案 0 :(得分:1)

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

在linux上使用:

cat /proc/sys/fs/file-max

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

ulimit -n unlimited

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

答案 1 :(得分:1)

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

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