2017-10-15 2 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 자바 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

관련 문제