【问题标题】:Writing to the same file; not overwriting写入同一个文件;不覆盖
【发布时间】:2012-09-06 05:52:12
【问题描述】:

这是我的sn-p。

File file = new File(Thread.currentThread().getName());

for(each element of the list){
createStringWriterAndPopulateDataToBeWritten
FileOutputStream fo = new FileOutputStream(file);
OutputStreamWriter out = new OutputStreamWriter(fo,"UTF-8");
out.write(sw.toString());
out.close();
}

现在说我有一个大小为SnewFixedThreadPool;我向这个线程池传递了一个要完成的工作列表。现在每次调用线程时,它都会创建一个名称为线程名称的文件,然后写入该文件,但在循环中它只是覆盖该文件。

即使再次调用线程,如何才能使其附加而不是覆盖,这在这种情况下很可能发生,因为我的线程池工作列表很长。

注意:传递给 ThreadPool 的作业列表的每个元素也是一个列表,这就是为什么在 sn-p 中有一个 for 循环的原因。

谢谢。

【问题讨论】:

    标签: append threadpool fileoutputstream


    【解决方案1】:

    但在循环中它只是覆盖文件。

    是的 - 您正在循环中创建FileOutputStream 。如果您在循环之前创建FileOutputStream(和OutputStreamWriter,那么只需在循环中进行写入,它将为整个操作创建一个文件。

    请注意,close 调用应位于 finally 块中,因此即使代码引发异常,您也可以关闭编写器。

    如果您需要在再次调用此代码时附加到文件中,只需更改以下内容:

    FileOutputStream fo = new FileOutputStream(file);
    

    FileOutputStream fo = new FileOutputStream(file, true);
    

    第二个参数,根据 the documentation,说明是追加 (true) 还是覆盖 (false)。

    【讨论】:

    • 所以即使我在循环中创建 fileOutputStream 并保持第二个参数为真;它应该工作吧?不是一个好的做法,但它仍然可以正常工作吗?
    • 因为再次调用相同的代码将等同于在循环内调用fileoutputStream?谢谢
    • @Kraken:它会起作用,但效率极低。打开文件一次,写下所有内容,然后关闭它会干净。当你需要时重新打开它以追加数据,但不是在你知道你要写更多的时候循环的每次迭代。
    • close 语句也应该在循环中吗,每次循环时我都想关闭它吗?
    • 如果它在循环之外,我如何在那里添加一个finally子句,它不应该只用一个try catch吗?
    猜你喜欢
    • 2014-02-05
    • 2014-03-21
    • 2012-04-19
    • 1970-01-01
    • 2023-03-28
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多