我给一个文件写了一个字符串,字符串很长,大约100K,这是我的代码:
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);
但它不起作用。它仍然只写8192(默认缓冲区大小)到文件。 怎么解决这个?
答案 0 :(得分:0)
您需要确保一次只有一个线程可以使用缓冲的编写器。一个简单的解决方案是使writeToFile
方法同步。否则你可以使用某种锁定机制。您可以使用Object.wait/notify
或使用java.util.concurrent包中的信号量。