2009-11-06 3 views

답변

1

아니요. 자바에서는 제로 종료 문자열을 인식하지 않습니다. InputStream을 읽고 0 바이트를 찾아야합니다.

문자 인코딩 문제는 해결되지 않습니다. InputStream은 바이트 스트림을 제공하므로 Reader을 통해 문자를 인코딩해야합니다. 멀티 바이트 문자 인코딩을 사용하면 문제가 더욱 복잡해집니다.

+0

작동하는 경우 문자 인코딩에 따라 다릅니다. 실제로 그는 Reader에서 읽고 0 바이트가 아닌 0 문자를 찾아야합니다. – jarnbjo

+1

그는 * InputStream *에서 0으로 끝나는 문자열을 명시 적으로 요구합니다. 그때부터 그는 혼란 스럽네요 BufferedReader –

+1

당신이 InputStream에서 문자와 문자열을 읽을 수 없기 때문에 반쯤 틀린 대답으로 그를 혼동하지 말라고 당신에게 친절하지 않습니까? – jarnbjo

0

아래와 비슷한 방법을 만들 수 있습니다. InputStream에서 BufferedReader을 만듭니다. BufferedReader은 상태를 유지할 수 있도록 참조로 전달됩니다. 인스턴스 변수에도 쉽게 저장 될 수 있습니다.

public String readLine(BufferedReader buff) throws IOException{ 
    int c = buff.read(); 
    // if EOF 
    if (c == -1){ 
     return null; 
    } 
    StringBuilder builder = new StringBuilder(""); 
    // Check if new line or EOF 
    while (c != -1 && c != 0){ 
     builder.append((char) c); 
     c = buff.read(); 
    } 
    return builder.toString(); 
} 

는 ....

String line = reader.readLine(buff); 
while (line != null) 
{ 
System.out.println(line); 
line = reader.readLine(someBufferedReader); 

} 
+0

이렇게하면 첫 번째 0 바이트 다음의 모든 EOL을 버립니다. 당신의 파일이 0 바이트로 구분 된'String' 만 포함하고 있다면 당신은 그것으로부터 하나의'String'을 얻을 것입니다. – Bombe

+0

BufferedReader는 예제에 대한 참조로 전달되므로 상태는 유지됩니다. 두 번째 통화에서는 중단 된 부분부터 시작됩니다. – Gordon

+1

이 솔루션은 멀티 바이트 인코딩 문자를 처리하지 않습니다. @ dennis.zhdanov의 해결책이 있습니다. – JoG

1

당신은 또한 "제로"라는 뜻이 무엇인지 이해하는 것이 필요합니다. 입/출력 스트림은 바이트를 처리하지만 판독기/기록기는 문자를 처리합니다. 0 문자와 일치 시키려면 byte to char 변환 인코딩이 작동합니다.

6
package com; 

import java.io.*; 
import java.util.Scanner; 

public class AAA { 

    private static final String ENCODING = "UTF-8"; 

    public static void main(String[] args) throws Exception { 
     ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 
     bOut.write("the first line".getBytes(ENCODING)); 
     bOut.write(0); 
     bOut.write("the second line\r\n (long one)".getBytes(ENCODING)); 
     bOut.write(0); 
     bOut.write("the third line".getBytes(ENCODING)); 
     printLines(new ByteArrayInputStream(bOut.toByteArray())); 
    } 

    public static void printLines(InputStream in) { 
     Scanner scanner = new Scanner(in, ENCODING); 
     scanner.useDelimiter("\u0000"); 
     while (scanner.hasNext()) { 
      System.out.println(scanner.next()); 
      System.out.println("--------------------------------"); 
     } 
    } 
} 
+0

. 스캐너는 가장 잘 활용되지 않는'java.util. * '클래스가되어야합니다. – corsiKa