2016-04-16 7 views
-2

は、私はこのコードのスニペットを持っている:FileWriterは書きませんか?

私はranit、それは文字列 sequencemySink内部のそれのインデックスを印刷
 try { 
      f1 = new File("sink.txt"); 
      f1.createNewFile(); 
      fw = new FileWriter(f1); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     ... code ... 
     System.out.println(sequence); 
     System.out.println(mySink.indexOf(sequence)); 
     String result = ""; 
     int firstIndex = mySink.indexOf(sequence); 
     if (firstIndex >= 0) { 
      System.out.println(true); 
      int secondIndex = mySink.indexOf(sequence, firstIndex + sequence.length()); 
      if (secondIndex >= 0) { 
       System.out.println(true); 
       result = mySink.substring(firstIndex, secondIndex + sequence.length()); 
       System.out.println(result); 
      } 
     } 
     try { // Write it to file 
      fw.write(result); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("done"); 

。その後、if文の中に入り、2つのtrueを印刷してresultを印刷したので、は正常に初期化されています。しかし、私がファイルsink.txtを見ると、それは空白だと分かります。なぜそれがこのように動作していますか?私のコードで何かが恋しいですか?それは前に働いていたし、もう少しコードを追加しました。私はプログラムの実行中にFileWriterまたはFileに触れることはありません。前もって感謝します!

これが私の出力であるあなたが見たい場合:

[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89] 
2000466 
true 
true 
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89] 
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 59, 48, 43, 47, 89] 
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 81, 59, 48, 43, 47, 89] 
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 81, 98, 48, 43, 47, 89] 
[93, 73, 74, 81, 89, 70, 50, 80, 51, 83, 62, 13, 50, 0, 40, 98, 48, 43, 47, 89] 
done 
+4

あなたは 'FileWriter'を終了していません。 'fw.close()' –

+0

フォローアップ:ファイルを開くときにtry-with-resourcesを使うと、常に正しく閉じられます。 – Andreas

+0

try-catchブロックを削除します。例外をキャッチしてそれを無視する、すなわち、次のコードが実行を継続できるようにすると、カスケード障害が発生するだけです。例:ファイルを作成/置換できない場合、 'IOException'が発生し、' fw'は決して割り当てられません。 'fw.write(result)'は 'NullPointerException'で失敗します。このエラーは原因を誤解させることになります。 – Andreas

答えて

1

短い答えはあなたがクローズ(またはフラッシング)あなたのFileWriterされていないということです。つまり、ファイルバッファにまだ格納されている未書き込みのデータでアプリケーションが終了します。

コードには他にもいくつかの間違いがあります。トップ最低料金:

try { 
     f1 = new File("sink.txt"); 
     f1.createNewFile(); 
     fw = new FileWriter(f1); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
  1. createNewFile呼び出しが冗長です。次のnew FileWriterはファイルを作成します。

  2. 何も起こっていないかのように例外をキャッチしています。あなたは>> < <これらの例外から続けることはできません。残りのコードは、ファイルのオープンに成功した場合にのみ正常に動作します。

  3. 異なる扱いをしない限り、FileNotFoundExceptionをキャッチする必要はありません。キャッチはIOExceptionで十分です。これは前者のスーパークラスだからです。この時点で

  4. 、あなたのtry-と、リソース使用する必要があります。

    f1 = new File("sink.txt"); 
    try (FileWriter fw = new FileWriter(f1)) { 
    
        // compute stuff 
    
        // write stuff to file 
    
    } catch (FileNotFoundException ex) { 
        System.out.println(ex.getMessage()); 
    } catch (IOException ex) { 
        // This is ugly for a real app. However, an IOException that 
        // is not a FileNotFoundException is "unexpected" at this point 
        // and providing a user-friendly explanation would be tricky. 
        ex.printStackTrace(); 
    } 
    

    を試してみてください、との資源は時にブロックが終了fwが自動的にクローズされます。作家を閉じると、まずそれがフラッシュされます。

関連する問題