-2

ファイルが正しく書き込まれたかどうか、つまり最後に EOF があるかどうかを確認する方法はありますか? ファイルを取得し、それらを非常に大きなファイルにマージしてから、それを使用して統計を取得するプログラムがあるため、私はそれを求めています。ポイントは、ファイルの終わりを認識しないため、2 番目の部分が終了しないことです。

コードの関連部分は次のとおりです: (重要な理由で投稿できないため、コード全体を要求しないでください)

    FileWriter file=null;
    PrintWriter pw = null;
    String pathToRead=null;
    InputStreamReader isr = null;
    BufferedReader br = null ;
    FileInputStream fis = null ;
    TestJFileChooser d=new TestJFileChooser();
    int c=1;
            String line=null;

    ....

    //here i select the files

    selectedFile=new File(pathToRead);

    //here I get one buffer reader for each file got with listFiles()

    for(File file_sel:app){
        if (file_sel.getName().startsWith("gtou")){
            System.out.println(file_sel.getName());
            fis = null;
            try {
                fis = new FileInputStream(file_sel);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            isr=new InputStreamReader(fis);
            br=new BufferedReader(isr);
            map.put(i, br);
            num_file++;
            i++; 
        }
    }

    //then I select the output file and open a print writer for it

    fileToWrite=new File(pathToRead);
        try {
            file = new FileWriter(fileToWrite);
            pw= new PrintWriter(file);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        //merging part
        ....
        line=br.readLine();
        while(line!=null){
        System.out.println("line is:"+line);
        ....
        line=br.readLine();
        }   


       //end of merging ....

        pw.flush();
        pw.close();

        try {
            if (file!=null) file.close();
            fis.close();
            isr.close();
            br.close();
            for(int fi=0;fi<num_file;fi++){
                br2=map.get(fi);
                br2.close();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        so.kill();
        Runtime r=Runtime.getRuntime();
        r.gc();

    //this is a popup that comes out 
    GlitchSquad gli=new GlitchSquad("Completed");

問題は、出力として次のようになることです。

line is: null ; 
line is: null ; 
line is: null ;

など そして、「完了」ポップアップに到達しない =(

コントロール ライン!=null が機能しないため、null とは何かを正確に理解できません。また、そのnullを文字列として使用しようとしました..しかし何も..ストリームを閉じる方法に問題があると思いましたが、今ではコードは正しいようです..しかし、それを止める方法はまだありません..

提案?前もって感謝します!

psストリームに焦点を当てるために要約されたバージョンです..変数は正しく宣言されており、インポートなどについても同じです

編集:コードが更新されました

4

3 に答える 3

0

あなたの質問の核心はこのコードです:

    BufferedReader br = ...
    String line = br.readLine();
    while (line != null) {
        System.out.println("line is:" + line);
        ...
        line = br.readLine();
    }

あなたはこれが繰り返しこれを出力すると言います:

line is: null ;
line is: null ;

(最後の「;」に注意してください!!!)

発生する可能性がある唯一の方法は、読み取っているファイルに次のような行が少なくとも1行含まれている場合です。

null ;

実際、「...」コードにcontinueステートメントが含まれていない限り、入力ファイルにはこれらの行が多数含まれている必要があります。


ファイルが正しく書き込まれたかどうかを確認する方法はありますか?

うん。テキストエディタを使用してそれを見て、および/またはそのファイルサイズを確認してください。

最後にEOFがあるかどうかということですか?

最新のファイルシステムでは、EOFはマーカーではなく位置です。具体的には、ファイルの最後のバイトの後の位置です。したがって、ファイルにEOFがないことは論理的に不可能です。( EOFが存在しないようにするには、長さが無限のファイルが必要です。)

于 2012-06-06T11:11:23.250 に答える
0

問題が解決するかどうかはわかりませんが、代わりに次のコードを使用します。

try {
    fis = new FileInputStream(file_sel);
    isr=new InputStreamReader(fis);
    br=new BufferedReader(isr);
    map.put(num_file++, br);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

そうしないと、「マップ」にキャッチされない「NullPointer」例外または奇妙な BufferedReaders が存在する可能性があります。(私は今、どのようnew InputStreamReader(null)に動作するかわかりません。)

i と num_file の値は常に等しいように見えるので、単に i を削除してください。または、LinkedList を使用して両方をドロップします。

特別なマージが必要ない場合は、次のようにします。

OutputStream os;
try {
    os = new FileOuputStream(outfile);
} catch (FileNotFoundException e) {
    os = null;
    e.printStackTrace();
}
if (os != null) {
    for(File file_sel:app) {
        if (file_sel.getName().startsWith("gtou")) {
            System.out.println(file_sel.getName());
            InputStream is = null;
            try {
                is = new FileInputStream(file_sel);
                byte[] buffer = new byte[1024];
                int readBytes = 0;
                while ((readBytes = is.read(buffer)) > 0) {
                    os.write(buffer, 0, readBytes);
                }
                fos.flush();
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

異なるエンコーディングでファイルを読み取る場合は、もちろん、少なくとも読み方を変更する必要があります。

うまくいかない場合は、「要約された」実行可能なサンプル プログラムを作成することをお勧めします。

于 2012-06-06T09:33:46.303 に答える
0

EOF は EOF です。これ以上のデータはありません。ファイル内に予想される EOF マークがない限り、または EOF マークがあるべき場所を示す自己記述型プロトコルがない限り、ファイルが完全に書き込まれたかどうかを判断する方法はありません。

于 2012-06-06T09:47:37.810 に答える