2016-12-06 3 views
-2

버퍼링 된 입력 스트림을 파악하는 데 문제가 있습니다. Java로 텍스트 편집기 프로그램을 만들어야합니다. 나는 수업에서 몇 가지 예를 지침으로 가지고 있지만 아직도 그것을 파악할 수 없었다. 필자가 이해할 수 있도록 루프를 읽기 시작한 다음 편집기로 전체 파일을 읽어야합니다. 읽은 문자를 char 형식으로 변환 한 다음 .toString을 사용하여 문자열로 설정했습니다. 이제는 컴파일되지만 프로그램이 정지되므로 무한 루프가 있어야하지만 이유는 확실하지 않습니다.Java 버퍼링 된 입력 스트림이 읽히지 않습니다.

 //File open 
    openItem.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     JFileChooser jfc = new JFileChooser(); 
     jfc.setCurrentDirectory(new File(".")); 
     int result = jfc.showOpenDialog(null); 
     if (result == JFileChooser.APPROVE_OPTION) 
      { 
      File selectedFile = jfc.getSelectedFile(); 
      BufferedInputStream bis = null; 
      try 
      { 
       bis = new BufferedInputStream(new FileInputStream(selectedFile)); 
       char inChar = (char)bis.read(); 
       while(inChar != -1) 
       { 
       //inChar = (char)bis.read(); 
       String charToString = Character.toString(inChar); 
       textArea.setText(charToString); 
       } 
      } 
      catch (Exception e2) 
      { 
       e2.printStackTrace(); 
      } 
      } 
     } 
    }); 
+0

char로 char 파일을 읽고 모든 루프의 필드 내용을 덮어 씁니다. –

+2

@MattClark 루프 내부에서 char을 읽는 라인이 주석 처리되었다는 것을 고려하면, 파일이 전혀 읽히지 않고있다. – BackSlash

+0

이 맞다. 'String string = ""; 그 논리를 적용한 후에 프로그램을 실행하면 여전히 멈추고 ((inChar = (char) bis.read())! = -1) {string + = inChar;} System.out.println (string); ' –

답변

2

여기에 몇 가지 문제가 있습니다.

문제 1 : BufferedInputStream#read()은 문자가 아닌 바이트를 읽습니다. ASCII 스트림에 대해서는 "작동"하지만 UTF-8과 같은 다른 멀티 바이트 인코딩에는 실패합니다.

문제 2 : 표현 inChar != -1 항상 진실 있도록 char 값은 자바 부호 있습니다. 내 생각에 이것이 응용 프로그램이 멈추는 원인입니다.

문제점 3 : 파일을 사용한 후에 파일을 닫지 않습니다.

String으로 파일 내용을 읽는 일반적인 작업은 코드의 다른 곳에서 유용 할 수 있으므로이 기능을 별도의 방법으로 구현하는 것이 좋습니다.

현재 구조를 유지하려면 다음 코드와 같이 작동해야하지만 에는 여전히 1이라는 문제가 있습니다.

public static String readFileAsString(File inputFile) throws IOException { 
    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile))) { 
    StringBuilder sb = new StringBuilder(); 
    for (int in = bis.read(); in != -1; in = bis.read()) { 
     sb.append((char)in); 
    } 
    return sb.toString(); 
    } 
} 

전체 파일을 Java로 String으로 읽는 더 쉬운 방법이 있습니다. 문자 바이트를 변환하는 디폴트 캐릭터 세트를 사용

public static String readFileAsString(File inputFile) throws IOException { 
    return new String(Files.readAllBytes(inputFile.toPath())); 
} 

: Java8에 하나의 가능성은이 같은 것입니다.

+0

또는'new String (readbytes_result, StandardCharsets.ISO_8859_1) '은 cast-int-containing-byte-to-char 접근법과 동일한 변환을 확실히 제공한다. –

관련 문제