8

これがコードスニペットです。

read = new FileReader("trainfiles/"+filenames[i]);
                br = new BufferedReader(read);
                while((lines = br.readLine())!=null){
                    st = new StringTokenizer(lines);
                    while(st.hasMoreTokens()){
                        bw = new BufferedWriter(new FileWriter("files/file.txt"));
                        bw.write(st.nextToken());
                        bw.newLine();
                    }
                }

編集:ディレクトリからファイルを読み取っています。したがって、すべてのループでリーダーを開く必要があります。いくつか変更を加えましたが、そのファイルに書き込んでいません。コードは次のとおりです。

for(i=0;i==0;i++){
            if(filenames[i].matches(".*ham.*")){
                System.out.println("ham:"+filenames[i]);
                read = new FileReader("trainfiles/"+filenames[i]);
                br = new BufferedReader(read);
                while((lines = br.readLine())!=null){
                    st = new StringTokenizer(lines);
                    while(st.hasMoreTokens()){
                        System.out.println(st.nextToken());
                       bw.write(st.nextToken());
                    }
                }
                bw.close();
                br.close();

            }else{
                System.out.println("spam:"+filenames[i]);
            }
                        }

編集:コードを変更しましたが、成功しませんでした。

while((lines = br.readLine())!=null){
                    st = new StringTokenizer(lines);
                    bw = new BufferedWriter(new FileWriter("files/file.txt"));
                    while(st.hasMoreTokens()){
                        System.out.println(st.nextToken());
                       bw.write(st.nextToken());
                    }
                    bw.close();
                }

                br.close();

そして、私はこのエラーが発生しています:Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) at Test.main(Test.java:30)

編集:みんなありがとう..私はそれを理解しました。実際、私はEclipseでディレクトリを作成しましたが、コンテンツを表示するためにディレクトリを更新しませんでした。そのばかげた...とにかく。どうもありがとう

4

3 に答える 3

17

いくつかのこと:

  1. ループを通過するたびに新しいFileWriterを作成します。これにより、毎回ファイルが切り捨てられます。
  2. BufferedWriterはバッファリングされており、バッファをフラッシュすることはありません。bw.flush()を呼び出すか、さらに良いことに、完了したらライターを閉じる必要があります。
于 2010-12-13T15:08:01.463 に答える
15
  • ループ内にFileWritterを作成しているため、各サイクルで常にファイルが切り捨てられます。
  • ライターを閉じる/フラッシュするのを忘れた
  • しかし、運が良ければ(プログラムを終了するとライターがフラッシュする可能性があります)、ファイルには入力ファイルの最後の単語が含まれますが、これは新しい行であると推測でき、ファイルを開いてコンテンツを確認したときに見逃した可能性があります。

内側のループは次のようになります。

try (BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"))) {
    while (st.hasMoreTokens()) {
        bw.write(st.nextToken());
        bw.newLine();
    }
}
于 2010-12-13T15:17:44.753 に答える
1

理想的には、次のコンストラクターを使用してFileWriter、を作成する必要があります。

bw = new BufferedWriter(new FileWriter("files/file.txt",true));

2番目のパラメーターtrueは、新しいデータを追加するためのものです。FileWriter以前の書き込みは切り捨てられません。

読者は適切なデータを読み取ることができます。

于 2014-05-04T06:25:45.117 に答える