由于某种原因,此代码会导致截断的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++;
}
}
}
}
答案 0 :(得分:17)
你忘了关闭()编写器,所以你从未给它机会将缓冲输出刷新到磁盘。
答案 1 :(得分:2)
每次写入后都应考虑刷新流。尝试这样的事情:
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();
}
}
答案 2 :(得分: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
答案 3 :(得分:0)
一旦打开io(阅读器,写入器或BufferR / W,...),则必须稍后将其关闭以关闭该流并释放资源。 如果您的代码具有嵌套流(文件,FileReader,BufferedReader)或(Writer1,Writer2), 您必须在紧接着(BufferedReader,FileReader,File)或(Writer1.close()之后再使用Writer2)单独关闭它