2017-10-15 36 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()方法,否則結果是一個文件,所有行都連接成一行。

  • 變量重命名爲更具描述性。

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