缓冲写入器在写作过程中停止

由于某种原因,此代码会导致截断的text.txt文件。 应该(根据我)写出1000个结果,但输出文件有不同的行数(取决于运行)。 奇怪的是,对文件的写入在写入命令的中间停止,这样一条线可能不完整。 目前,最新运行的文本文件的最后三行如下:

749, 78.97988, 97.80454, 99.6625, 94.00000015258789 750, 4.1745043, 86.64212, 107.59311, 71.00000008583069 751, 

就是这样。 之后别无其他。

这是代码:

 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Random; public class ColorGrayScale { /** * @param args * @throws IOException */ @SuppressWarnings("resource") public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Writer out = new BufferedWriter(new FileWriter("test.txt"),16*1024); Random generator = new Random(); float red = 0, green = 0, blue = 0; int i = 0; while (i<1000) { float grey = generator.nextInt(127) + 64; int sequence = generator.nextInt(6) + 1; // to pick from 1 of six // orders switch (sequence) { // the various orders that red green and blue // are going to be in case 1: red = (float) (generator.nextFloat() * (grey / .21)); green = (float) (generator.nextFloat() * ((grey - (red * .21)) / .71)); blue = (float) ((grey - (red * .21) - (green * .71)) / 0.08); break; case 2: red = (float) (generator.nextFloat() * (grey / .21)); blue = (float) (generator.nextFloat() * ((grey - (red * .21)) / .08)); green = (float) ((grey - (red * .21) - (blue * .08)) / 0.71); break; case 3: green = (float) (generator.nextFloat() * (grey / .71)); red = (float) (generator.nextFloat() * ((grey - (green * .71)) / .21)); blue = (float) ((grey - (red * .21) - (green * .71)) / .08); break; case 4: green = (float) (generator.nextFloat() * (grey / .71)); blue = (float) (generator.nextFloat() * ((grey - (green * .71)) / .08)); red = (float) ((grey - (green * .71) - (blue * .08)) / .21); break; case 5: blue = (float) (generator.nextFloat() * (grey / .08)); red = (float) (generator.nextFloat() * ((grey - (blue * .08)) / .21)); green = (float) ((grey - (blue * .08) - (red * .21)) / .71); break; case 6: blue = (float) (generator.nextFloat() * (grey / .08)); green = (float) (generator.nextFloat() * ((grey - (blue * .08)) / .71)); red = (float) ((grey - (blue * .08) - (green * .71)) / .21); break; } if (red < 256 && blue < 256 && green < 256) { out.write("" + i + ", " + red + ", " + green + ", " + blue + ", " + (.21 * red + .71 * green + 0.08 * blue + "\n")); i++; } } } 

}

你忘了关闭()编写器,所以你从来没有给它机会将缓冲输出刷新到磁盘。

两件事情。

  1. 冲洗流
  2. 关闭流

尝试以下方法:

  Writer out = null; try { out = new BufferedWriter(new FileWriter("test.txt"),16*1024); // Write some stuff out.flush(); } finally { try { out.close(); } catch (Exception exp) { } } 

试着记住,这是一个“缓冲区”。 这意味着它会保留存储在内存中的内容,直到它确定需要写入或明确要求它“刷新”它的内容为止。

此外,您应该始终close您的流。 这可以防止可能的锁定文件问题和文件句柄问题:P

您应该考虑在每次写入后刷新流。 尝试这样的事情:

 try{ //your code out.write("" + i + ", " + red + ", " + green + ", " + blue + ", " + (.21 * red + .71 * green + 0.08 * blue + "\n")); i++; }finally{ //Close the stream out.close(); } 

此外,您应该确保在操作结束时关闭流。 构建程序的好方法可能是:

 Random generator = new Random(); float red = 0, green = 0, blue = 0; int i = 0; Writer out = null; try{ out = new BufferedWriter(new FileWriter("test.txt"), 16 * 1024); while (i < 1000) { //your logic if (red < 256 && blue < 256 && green < 256) { out.write("" + i + ", " + red + ", " + green + ", " + blue + ", " + (.21 * red + .71 * green + 0.08 * blue + "\n")); i++; } } }finally{ if(out != null){ out.close(); } }