Java 缓冲写作在写作中途停止

Java 缓冲写作在写作中途停止,java,text-files,bufferedwriter,Java,Text Files,Bufferedwriter,由于某些原因,此代码会导致一个截断的text.txt文件。它应该(根据我的说法)写出1000个结果,但是输出文件有不同数量的行(取决于运行)。奇怪的是,写入文件的写入在写入命令的中间停止,这样一行可能无法完成。目前,最新运行的文本文件的最后三行如下所示: 749, 78.97988, 97.80454, 99.6625, 94.00000015258789 750, 4.1745043, 86.64212, 107.59311, 71.00000008583069 751, 就这样。之后就没有

由于某些原因,此代码会导致一个截断的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++;
        }
    }
}
导入java.io.BufferedWriter;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.Writer;
导入java.util.Random;
公共类彩色灰度{
/**
*@param args
*@抛出异常
*/
@抑制警告(“资源”)
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
Writer out=new BufferedWriter(new FileWriter(“test.txt”),16*1024;
随机生成器=新随机();
浮动红=0,绿=0,蓝=0;
int i=0;

(i)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();
    }
}
Random generator=new Random();
浮动红=0,绿=0,蓝=0;
int i=0;
Writer out=null;
试一试{
out=新的BufferedWriter(新的FileWriter(“test.txt”),16*1024;
而(i<1000){
//你的逻辑
如果(红色<256&&蓝色<256&&绿色<256){
写出(“+i+”、“+red+”、“+green+”、“+blue+”)
+“,”+(.21*红色+.71*绿色+0.08*蓝色+“\n”);
i++;
}
}
}最后{
if(out!=null){
out.close();
}
}
两件事

  • 冲水
  • 关闭小溪
  • 尝试以下方法:

     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) {
        }
    }
    
    试着记住,它是一个“缓冲区”。这意味着它将把东西存储在内存中,直到它决定需要写入或者你明确要求它“刷新”它的内容

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

    您忘记关闭()写入程序,因此您从未给它机会将缓冲输出刷新到磁盘。

    一旦您打开io(读卡器、写入器或缓冲器/W,…),您必须稍后关闭它才能关闭该流并释放资源。 如果代码具有嵌套流(文件、文件读取器、缓冲读取器)或(Writer1、Writer2),
    您必须在(BufferedReader、FileReader、File)或(Writer1.close(),然后再使用Writer2)之后单独关闭它。

    我认为您应该确保
    close()
    out
    对象上被调用。为什么每次迭代后都刷新?效率不是很高吗?如果默认的缓冲区大小不是所需的大小,可能可以显式设置缓冲区大小,让编写器决定何时刷新。@Vikdor-我同意。效率很低。更新了我的答案!感谢您指出:)在java.io包中的标准writer和OutputStreams上的
    flush()
    之前调用
    close()
    是多余的。它们都确保在调用
    close()
    时刷新输出。无需
    flush()
    流,除非其他人想在你写完它之前开始读取它,或者有可能永远不会调用
    close()
    。@AdrianPronk我只是偏执狂:D