2017-06-15 22 views
0

これは間違った質問かもしれませんが、ここに行きます!ファイルへの書き込み

私はファイルに書き込もうとしていますが、上書きしませんが、何度も繰り返し書き込むので、助けが必要です。

方法:

@SuppressWarnings("resource") 
public static void writeFile(File file, String index) { 
    try { 
     boolean wri = false; 
     PrintWriter out = new PrintWriter(new FileWriter(file, true)); 
     Scanner scanner = new Scanner(file); 
     while(scanner.hasNext()) { 
      String str = scanner.nextLine(); 
      if(str.equals(index)) { 
       System.out.println(index); 
       scanner.close(); 
       wri = true; 
       break; 
      } else { 
       wri = false; 
       break; 
      } 
     } 

     if(wri != false) 
      return; 
     out.write(index); 
     out.write("\n"); 
     out.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

あなたはそれがファイルを上書きしていないことを意味しています、それぞれの呼び出しで追加されますか?そうであれば、それは 'true 'が' FileWriter'で渡されていることを示しています。しかし、私は正しく質問をgrok'd確信していません。 – KevinO

+0

コメントで暗示されているように、 'PrintWriter'の中で(' Scanner'の)読んでいるのと同じ 'file'を使っています。それは意図された行動ですか? – KevinO

+0

@KevinOはい、最初に書き込まれていないかどうかを確認したいのですが、それ以外の場合は書き込みません。 – BeastlyMC956

答えて

2

あなたのコードを試すには、エラーに満ちています。

  • nextLine()hasNext()を使用しないでください。代わりにhasNextLine()を使用してください。

  • indexが見つからない場合は、scannerを閉じないでください。

  • が見つかった場合は、outを閉じないでください。

  • 何も書き込む必要がない場合でも、書き込み用にファイルを開きます。

  • 例外は無視されます。

  • if(wri != false)は、if (wri)という非常にわかりにくい方法です。

  • メソッドを使用している場合はPrintWriterFileWriterを入れる必要はありません。あなたが明示的appendモードでFileWriter constructorを呼び出すので

、私はあなたがファイル既にそのテキストが含まれていない場合とする場合にのみ、ファイルへindexを書きたいと仮定と思います。

indexに改行文字が含まれていると、ロジックが機能しませんのでご注意ください。

Scannerは非常に大きなオーバーヘッドを持っているので、あなただけのラインを読んでいるので、あなたは、BufferedReader代わりのScannerを使用する必要があります。

リソースが不足しているとして、try-with-resourcesを使用してください。

あなたのコードは次のようにする必要があります:

public static void writeFile(File file, String index) { 
    if (file.exists()) { 
     try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
      for (String line; (line = in.readLine()) != null;) 
       if (line.equals(index)) 
        return; 
     } catch (Exception e) { 
      throw new RuntimeException("Error reading file: " + file, e); 
     } 
    } 
    try (FileWriter out = new FileWriter(file, true)) { 
     out.write(index); 
     out.write(System.lineSeparator()); 
    } catch (Exception e) { 
     throw new RuntimeException("Error appending to file: " + file, e); 
    } 
} 

テスト

File file = new File("C:/temp/test.txt"); 
writeFile(file, "Hello"); 
writeFile(file, "World"); 
writeFile(file, "Hello"); 

ファイル内容

Hello 
World 
+0

作品は完璧です! – BeastlyMC956

-1

PrintWriter out = new PrintWriter(new FileWriter(file, false)); 
+0

これを行うと、ファイルは 'Scanner'ループの前にクリアされるので、そのループのポイントは何でしょうか? – Andreas

+0

これは私が書いた最後のことだけを書いています。 – BeastlyMC956

+0

確かに意味がありません。私は彼がそれを処理する前に何か書かれたファイルを持っていると思います。とにかく私の答えは書いている間にファイルにエスケープする方法を示しています。 – Frank

関連する問題