2

현재 내 코드의 출력을 텍스트 파일에 저장하려고합니다. 다른 프로젝트에서 실행하면 출력 파일이 생성되고 출력은 각각 저장됩니다. 다른 프로젝트에서 동일한 코드를 실행하면 빈 출력 파일이 생기고 실제로 문제가 무엇인지 알지 못합니다. .close() 함수와 flush 함수를 어디에 둘 것인지 혼란 스럽습니다. 미리 감사드립니다.FileWriter를 사용하여 출력 파일에 쓰려고 시도합니다.

FileWriter output = new FileWriter("set.txt"); 
    BufferedWriter writer = new BufferedWriter(output); 
    InputStream fis_n = new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"); 
    InputStreamReader isr_n = new InputStreamReader(fis_n, Charset.forName("UTF-8")); 
    BufferedReader br_n = new BufferedReader(isr_n); 

while ((input = br_n.readLine()) != null) { 
     String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + sample_text); 
      writer.newLine(); 
      break; 
     } 
} 
    writer.close(); 
    output.close(); 

편집 된 코드는 보이지만 프로그램 실행시 "set.txt"출력 파일은 여전히 ​​비어 있습니다.

 public static void dictionary(String sample_text, String text) throws FileNotFoundException, IOException { 

try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"), 
       Charset.forName("UTF-8") 
     )); 
      try { 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream("/Users/User/NetBeansProjects/Test/src/test/set.txt"), 
        Charset.forName("UTF-8") 
      )); 
      try { 
       String input; 
       while ((input = reader.readLine()) != null) { 
        String[] s = input.split(":"); 
        if (s[1].equals(text)) { 
         writer.write(s[0] + "'s result is " + sample_text); 
         writer.newLine(); 
         break; 
        } 
       } 
      } finally { 
       writer.close(); 
      } 
     } finally { 
      reader.close(); 
     } 
    } catch (IOException e) { 
     // Error handling 
    } 
    } 

이 사전 메소드가 호출되고있는 주요 방법은 다음과 같습니다

FileWriter output = new FileWriter("set.txt"); 
    BufferedWriter writer = new BufferedWriter(output); 
    InputStream fis_n = new  FileInputStream("/Users/User/NetBeansProjects/Test/src/test/sample.txt"); 
    InputStreamReader isr_n = new InputStreamReader(fis_n, Charset.forName("UTF-8")); 
    BufferedReader br_n = new BufferedReader(isr_n); 

    try { 
     while ((input = br_n.readLine()) != null) { 

      String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + sample_text); 
      writer.newLine(); 
      break; 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      writer.close(); 
      fis_n.close(); 
      isr_n.close(); 
      br_n.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    // fis_n.close(); 
    //isr_n.close(); 
    //br_n.close(); 
} 

이 같은 최종 코드는 모습입니다.

public static void main(String[] args) throws FileNotFoundException, IOException { 

case 2: { 
       BufferedReader d_br = new BufferedReader(new InputStreamReader(
         new FileInputStream("/Users/User/NetBeansProjects/Test/src/test/input_file.txt"), 
         Charset.forName("UTF-8") 
       )); 

       try { 

        String d_line; 
        while ((d_line = d_br.readLine()) != null) { 

        String h_input = test(d_line); 
        dictionary(d_line, h_input); 

        } 
       } catch(IOException e){ 

       }finally { 
        d_br.close(); 
       } 
       break; 
      } 
    } 
+0

당신이 기대하는 위치에 쓰고 있습니까? ''set.txt ''는 상대 경로입니다. 이것은 프로그램의 _working directory_에 상대적입니다. 빈'set.txt'는 프로그램에 의해 생성 된 _not_이 아니라 현재 호출되고 있습니다. 이것을 확인하는 쉬운 방법은 빈'set.txt'을 삭제하고 프로그램을 다시 실행하는 것입니다. 귀하의 프로그램이 빈'set.txt'를 대체하여 그것을 대체합니까? – Birchlabs

+0

@Birchlabs 예, 프로그램을 다시 실행할 때마다 새로운 "set.txt"파일이 만들어집니다. – Scarl

답변

3

당신은 finally 섹션에 while 루프 후 writer.close()하고, 바람직를 넣어해야합니다.

(대부분의 경우와 같이) 부분 처리 된 파일을 저장할 필요가없는 경우 flush을 전혀 삭제할 수 있습니다. 다른 경우에는 그대로 두는 편이 낫습니다. 다음과 같은

자바 7+에 자원 사용의 일반적인 경우 (이 구문은 try-with-resources라고 보인다 :

try (
    Resource resource1 = // Resource 1 initialization 
    Resource resource2 = // Resource 2 initialization 
    ... 
) { 
    // Resource utilization 
} catch (XXXException e) { 
    // Something went wrong 
} 

자원이 자동으로 시도 -과 - 자원에 의해) (해제 폐쇄

합니다. Java 6 또는 그 이전 버전을 사용해야하는 경우 위의 코드를 대략 다음과 같이 번역 할 수 있습니다 (실제로이 미세한 수준에서는 중요하지 않은 약간의 미묘한 차이가 있습니다).

try { 
    Resource1 resource1 = // Resource initialization 
    try { 
     Resource2 resource2 = // Resource initialization 
     try { 
      // Resource utilization 
     } finally { 
      // Free resource2 
      resource2.close(); 
     } 
    } finally { 
     // Free resource1 
     resource1.close(); 
    } 
} catch (XXXException e) { 
    // Something went wrong 
} 

중첩 된 try-finally 블록이 자원 관리에 사용되는 방법에 유의하십시오. 사전 Java7 구문을 사용하여,

try (
     // Notice, we build BufferedReader for the file in a single expression 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       new FileInputStream("sample.txt"), 
       StandardCharsets.UTF_8 // Better replacement for Charset.forName("UTF-8") 
     )); 
     // Alternative way to do the same 
     // BufferedReader reader = Files.newBufferedReader(Paths.get("sample.txt"), StandardCharsets.UTF_8); 

     // Output charset for writer provided explicitly 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
       new FileOutputStream("set.txt"), 
       StandardCharsets.UTF_8 
     )) 
     // Alternative way to do the same 
     // BufferedWriter writer = Files.newBufferedWriter(Paths.get("set.txt"), StandardCharsets.UTF_8) 
) { 
    String input; 
    while ((input = reader.readLine()) != null) { 
     String[] s = input.split(":"); 
     if (s[1].equals(text)) { 
      writer.write(s[0] + "'s result is " + text); 
      writer.newLine(); 
      break; 
     } 
    } 
} catch (IOException e) { 
    // Error handling 
} 

을 또는 : 같은 모양의 코드는 다음 있도록 ReaderWriter : 특정 경우

우리는 두 개의 자원을 관리 할 필요가

try { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      new FileInputStream("sample.txt"), 
      Charset.forName("UTF-8") 
    )); 
    try { 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
       new FileOutputStream("set.txt"), 
       Charset.forName("UTF-8") 
     )); 
     try { 
      String input; 
      while ((input = reader.readLine()) != null) { 
       String[] s = input.split(":"); 
       if (s[1].equals(text)) { 
        writer.write(s[0] + "'s result is " + text); 
        writer.newLine(); 
        break; 
       } 
      } 
     } finally { 
      writer.close(); 
     } 
    } finally { 
     reader.close(); 
    } 
} catch (IOException e) { 
    // Error handling 
} 
+0

이것은 여전히 ​​출력 파일에 아무것도 포함하지 않습니다. – Scarl

+0

수정 된 코드를 게시하십시오. – kgeorgiy

+0

방금 ​​질문에서 코드를 수정했습니다. – Scarl

2

우선 현재 버퍼를 즉시 쓰고 싶을 때마다 flush 라이터 메소드를 호출한다. 출력에 중간 작업을하지 않고 파일을 완전히 작성하는 경우 close 호출을 통해 명시 적으로 호출 할 필요가 없으므로 명시 적으로 호출 할 필요가 없습니다.

둘째, 당신은 단지 귀하의 경우 BufferedWriter 최상위 독자 또는 작가의 close 메서드를 호출합니다. close 호출은 지정된 다른 독자 또는 작성자에게 전달됩니다. 여러 번 연속 close 호출이 닫힌 인스턴스에 영향을주지 않습니다 (here 참조).finally 블록이 항상 실행

// This writer must be declared before 'try' to 
// be visible in the finally block 
AnyWriter writer = null; 

try { 

    // Instantiate writer here, because it can already 
    // throw an IOException 
    writer = new AnyWriter(); 

    // The the writing in a loop or as you wish 
    // If you need to write out the buffer in 
    // between, call flush 

} catch (IOException e) { 

    // Something went wrong while writing 

} finally { 

    try { 
     if (writer != null) 
      writer.close(); 
    } catch (IOException e) { 
     // Exception while trying to close 
    } 

} 

: 일반적인 참고로

독자와 작가를 사용하여,이 패턴을 고려하십시오. 좀 더 압축 된 구문이 필요하고 Java 7 이상을 사용하는 경우 try-with 표기 here을 살펴볼 수 있습니다.

+0

br_n 및 기타 누락 된 변수를 반영하도록 코드를 편집했습니다. 그리고 출력 파일은 여전히 ​​비어 있습니다. o – Scarl

+0

@Scarl 변수'input'와'sample_text'는 여전히 없으며 수정 된 코드도 대괄호를 빠뜨립니다. 그럼에도 불구하고, 나는 그것을 테스트하고 그것을 작동합니다. 'c :/test/sample.txt'와'c :/test/set.txt'와 같은 두 파일 모두 ** bold ** 절대 경로 ** bold **로 테스트 해보십시오. 출력 파일이 만들어졌고 다른 종속성이 없다고 언급 했으므로 입력 파일을 읽는 데 문제가 있다고 가정합니다. – thatguy

+0

제 답변에 설명되어있는 일반 체계는 더 쉽고 덜 상용구가 포함되어 있습니다 (두 리소스 예제에는 여기 제공된 단일 리소스 예제와 같은 수의 문이 포함되어 있습니다). – kgeorgiy