2015-09-07 258 views
0

我写一个字符串到一个文件中,该字符串很长,大约100K,这里是我的代码:BufferedWriter将截断字符串

public static void main(String[] args) throws IOException { 
    String s = "kkkk"; 

    BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/liaoliuqing/Downloads/1.txt",true),1024); 
    bw.write(s); 
    bw.flush(); 
    bw.close(); 
} 

当字符串短,效果很好。但是当字符串非常长时,字符串将被截断,只有一些字符被写入文件。

是什么问题?

这是我的代码,它可以在很多线程中使用。

private void writeToFile(String filterName, String messageToWrite) 
     throws IOException { 
    if(!messageToWrite.contains("2015")){ 
     LOG.warn(messageToWrite); 
    } 
    bufferWritter = getBufferWriter(filterName, messageToWrite); 
    bufferWritter.write(messageToWrite); 
    if(!messageToWrite.contains("2015")){ 
     LOG.warn(messageToWrite); 
    } 
    bufferWritter.flush(); 
} 

我很确定messageToWrite是完整的字符串,因为我记录它。但只是字符串的后半部分被写入文件。

它在约10个线程中工作。

我发现这个问题。当一个线程正在写入文件时,则是另一个线程运行的时候,第一个线程的内容会与第二个线程混淆。 我尝试

returnWriter = new BufferedWriter(new FileWriter(fileName, true),64*1024); 

到incread的bufferwriter的缓冲区大小,但它不能正常工作。它仍然只向文件写入8192(默认缓冲区大小)。 如何解决这个问题?

+4

嗯,我非常怀疑这是'BufferedWriter'的问题。我的猜测是,这与您查看文件的方式有关,但我们没有足够的信息来帮助您。你能制作一个简短但完整的程序来证明问题吗? –

+2

你确定你的字符串是完整的吗?获取字符串可能存在问题。我很难怀疑java会在这么短的时间之后以这样简单的任务失败。 –

+0

如果你试图写大于缓冲区大小的消息,我很确定它不工作,因为你只写'一次'。 – Fincio

回答

0

您需要确保一次只有一个线程可以使用缓冲写入器。一个简单的解决方案是使writeToFile方法同步。否则,你可以使用某种锁定机制。您可以使用Object.wait/notify或使用java.util.concurrent包中的信号量。

+0

不只是一些线程,还有一些进程会写入同一个文件。所以我似乎同步不起作用。 –

+0

如果你想要一个跨进程的锁定机制,你需要寻找其他解决方案。一种典型的方式是使用文件作为锁。如果一个进程可以创建锁文件,它会继续并在最后删除文件。所有进程都等待,直到他们可以创建文件。虽然我怀疑这个解决方案能帮助你。 – KDM