2017-10-15 6 views
-3

ファイル内の行を変更する際に問題が発生します。このコードの目的は、ファイルの最初の番号を自分自身に+1することです。何らかの理由で、まったく機能していないようで、どんな助けもありがとう!ファイル内の最初の行を変更する

public static void changenumber(String fileName) 
{ 
    ArrayList<String> list = new ArrayList<String>(); 
    File temp = new File(fileName); 
    Scanner sc; 
    try { 
     sc = new Scanner(temp); 
     while (sc.hasNextLine()) 
     { 
      list.add(sc.nextLine()); 
     } 
     sc.close(); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    String first = list.get(0); 
    int i = Integer.parseInt(first); 
    i = i+1; 
    first = Integer.toString(i); 
    list.set(0, first); 
    writenumber(list,fileName); 
} 

public static void writenumber(ArrayList<String> list, String fileName) 
{ 
    PrintWriter write; 
    try { 
     write = new PrintWriter(new FileWriter(fileName, true)); 
     for(int i = 0; i<list.size();i++) 
     { 
      write.append(list.get(i)); 
     } 
     } 
    catch(IOException err) 
    { 
     err.printStackTrace(); 
    } 

} 
+0

PrintWriterをフラッシュできますか? – jrtapsell

答えて

1

あなたの問題は、決してFileWriterを閉じなかったことです。

try-with-resourcesを使用すると、ファイルストリームが正しく閉じられます。

あなたのコードにいくつかの他の改善:

  • は、例外を無視しないでください。何も悪いことが起こらない限り、継続的な実行は多くの問題を引き起こすでしょう。例外が呼び出し側に返されるようにし、呼び出し側がファイルを更新できない場合の処理​​方法を決定させます。

  • Scannerが遅い。あなたが読んでいる行にしているので、代わりにBufferedReaderを使ってください。

  • メモリ内の行は改行文字で終わらないため、行を書き戻すときにprintln()メソッドを使用する必要があります。そうでない場合は、すべての行が1行に連結されたファイルになります。

  • 変数はよりわかりやすい名前に変更されました。

もちろん
public static void changenumber(String fileName) throws IOException { 
    ArrayList<String> lines = new ArrayList<>(); 
    try (BufferedReader in = new BufferedReader(new FileReader(fileName))) { 
     for (String line; (line = in.readLine()) != null;) { 
      lines.add(line); 
     } 
    } 
    int i = Integer.parseInt(lines.get(0)); 
    i++; 
    lines.set(0, Integer.toString(i)); 
    writenumber(lines, fileName); 
} 

public static void writenumber(List<String> lines, String fileName) throws IOException { 
    try (PrintWriter out = new PrintWriter(new FileWriter(fileName, true))) { 
     for (String line : lines) { 
      out.println(line); 
     } 
    } 
} 

は、あなたが新しい NIO.2のJava 7に追加されたクラス、特に java.nio.file.Filesクラスを使用して、非常にコードを簡素化することができます。

public static void changenumber(String fileName) throws IOException { 
    Path filePath = Paths.get(fileName); 
    List<String> lines = Files.readAllLines(filePath); 
    lines.set(0, Integer.toString(Integer.parseInt(lines.get(0)) + 1)); 
    Files.write(filePath, lines); 
} 
+0

ありがとうございました。 コードを簡略化する以外に、最初の方法よりNIOメソッドを使用する利点はありますか? – Robin

+0

NIOコードをより最適化することができます。 – Andreas

関連する問題