8

何らかの理由で、このコードは切り捨てられたtext.txtファイルになります。(私によれば)1000の結果を書き出す必要がありますが、出力ファイルにはさまざまな量の行があります(実行によって異なります)。奇妙なことに、ファイルへの書き込みは書き込みコマンドの途中で停止するため、行が完全でない場合があります。現在、最新の実行のテキストファイルの最後の3行は次のとおりです。

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++;
        }
    }
}

}

4

4 に答える 4

17

ライターをclose()するのを忘れたので、バッファーに入れられた出力をディスクにフラッシュする機会をライターに与えたことはありません。

于 2012-08-16T01:48:55.057 に答える
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();
    }
}
于 2012-08-16T01:45:28.467 に答える
2

2つのこと。

  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

于 2012-08-16T01:45:51.347 に答える
0

io(Reader、Writter、またはBufferR / Wなど)を開いたら、後でそのストリームを閉じてリソースを解放するために閉じる必要があります。コードにネストされたストリーム(File、FileReader、BufferedReader)または(Writer1、Writer2)がある場合は、(BufferedReader、FileReader、File)または(Writer1.close()の直後に、Writer2を使用する前に個別に閉じる必要があります)

于 2018-10-31T12:00:45.180 に答える