[java] 출력 스트림에 문자열 쓰기

OutputStream을 구현하는 여러 출력 리스너가 있습니다. stdout 또는 File에 쓰는 PrintStream이거나 메모리 나 다른 출력 대상에 쓰는 것일 수 있습니다. 따라서 메서드에서 OutputStream을 (an) 인수로 지정했습니다.

이제 나는 String을 받았다. 스트림에 쓰는 가장 좋은 방법은 무엇입니까?

Writer.write (message.getBytes ())를 사용해야합니까? 바이트를 줄 수는 있지만 대상 스트림이 문자 스트림이면 자동으로 변환됩니까?

대신 브리지 스트림을 사용해야합니까?



답변

스트림 ( InputStreamOutputStream)은 이진 데이터를 전송 합니다. 문자열을 스트림에 쓰려면 먼저이를 바이트로 변환하거나 다른 말로 인코딩 해야합니다. String.getBytes(Charset)메소드를 사용하여 수동으로 (권장대로) 수행 할 수 있지만 String.getBytes()이식 가능한 방식으로 안정적으로 예측 할 수없는 JVM의 기본 인코딩을 사용하므로 메소드를 피해야합니다 .

그러나 문자 데이터를 스트림에 쓰는 일반적인 방법은 스트림을 (또는 ) 메서드 를 호출 할 때 변환 하는 Writer, (종종 a PrintWriter) 로 래핑하는 것입니다. InputStreams의 해당 랩퍼는 Reader 입니다.write(String)print(String)

PrintStreamOutputStream문자열을 자동으로 인코딩하는 메소드도 포함한다는 점에서 특수 구현입니다 (내부적으로 작성자를 사용함). 그러나 여전히 스트림입니다. 스트림이 PrintStream다른 스트림 구현 이든 관계없이 스트림을 라이터로 안전하게 래핑 할 수 있습니다 . 이중 인코딩의 위험이 없습니다.

OutputStream이있는 PrintWriter의 예 :

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}


답변

OutputStream은 바이트를 쓰고 String은 문자를 제공합니다. 문자열을 byte []로 인코딩하려면 Charset을 정의해야합니다.

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

UTF-8선택한 문자셋으로 변경하십시오 .


답변

OutputStream을 감싸는 PrintStream을 만든 다음 print (String)를 호출하면됩니다.

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();


답변

설계 상 다음과 같이 수행됩니다.

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush


답변

와의 OutputStream 랩 의 PrintWriter 그 클래스에서 인쇄 방법을 사용합니다. 그들은 문자열을 가지고 당신을 위해 일을합니다.


답변

Apache Commons IO를 사용할 수 있습니다 .

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}

답변