繁体   English   中英

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

[英]bufferedwriter stops in the middle of writing

由于某种原因,此代码会导致截断的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++;
        }
    }
}

}

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

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

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();
    }
}

两件事情。

  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

一旦打开io(Reader,Writter或BufferR / W,...),您必须稍后关闭它以关闭该流并释放资源。 如果您的代码有嵌套流(File,FileReader,BufferedReader)或(Writer1,Writer2),您必须在使用Writer2之前单独关闭它(BufferedReader,FileReader,File)或(Writer1.close())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM