출력 스트림에 문자열 쓰기


139

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

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

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

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


2
확실하지는 않지만 여기에서 바퀴를 재발 명하려고하는 것처럼 들립니다 .Commons IO API뿐만 아니라 Java Base API를 살펴 보셨습니까?
posdef

답변:


149

스트림 ( 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();
}

3
따라서 사용 PrintWriter은을 사용 하는 것과 같습니다 String.getBytes(). JVM의 기본값이되는 임의의 임의 인코딩을 사용합니다. 운이 좋을 때만 작동합니다.
Christoffer Hammarström

106

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

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

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


3
다음 줄로 추가하십시오. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel

32

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

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

2
PrintStream은 바이트로 변환하기 위해 어떤 문자 세트를 사용합니까?
Dean Hiller 2016 년

20

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

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

3
참고 w.close()닫습니다 out뿐만 아니라.
Franklin Yu

12

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.