2017-02-13 1 views
0

Java에서 System.in과 System.out의 파일 인코딩을 제어하는 ​​방법이 있습니까?Java System.in과 System.out은 Sun/Oracle과 IBM JVM간에 다릅니다 - 표준 바이트 배열 읽기 쓰기 솔루션

일/오라클 사용

java.io.BufferedInputStream - Stdin java.io.PrintStream - Stdout

IBM이 사용

com.ibm.jvm.io.ConsoleInputStream - Stdin com.ibm.jvm.io.ConsolePrintStream - Stdout

문제는 헥사 데이터 바이트 배열을 출력하여 제공하는 IBM의 JVM으로 발각 : 308209d606092 ... (System.out에 쓰기 직전)

읽기 같은 파일에 쓰고 16 진수로 쓰면 : 303f09d606092a3f48 ...

Sun/Oracle은 동일한 16 진수 값을 표시합니다.

입력을 제어하거나 기본 공통 입력/출력 스트림으로 다시 잘라내려면 어떤 방법이 있습니까? System.out은 final이며, 구현은 JVM에 의존하는 것처럼 보입니다.

더 일반적으로 응용 프로그램간에 텍스트/이진 데이터를 전송하는 일관된 방법으로 리디렉션을 사용합니까?

System.in/out에서 입출력 데이터를 정규화하는 방법을 보여주는 코드. Commons-IO IOUtils를 사용하여 바이트 배열로 스트림을 읽고 씁니다.

+0

'System.out'은'final'이지만 실제로는 'System.setOut (PrintStream)'메서드가 있습니다. 그것은 (System.setIn (InputStream)도있다). 원한다면 원하는 스트림으로 변경할 수 있습니다. – JonK

답변

0

저는 IBM JDK에서 오랫동안 일 해본 적이 없지만, 여기에 뭔가 저를 겁니다. 스트림과 리더의 차이점은 무엇입니까? 독자는 효과적으로 바이트 배열을 문자로 인코딩 (en)하려고 시도하지만 문자는 동일하지 않습니다. JVM 공급자간에 기본 인코딩이 다를 수 있습니다.

그래서 바이트 배열 (예 : 64 기수가) 문자로 가지고

  • 인코딩을 건의 할 것와 관계없이 당신이 리더 또는 스트림을 사용하여 런타임을 통해 당신에게 꽤 동일한 결과를 제공한다

  • 스트림 만 사용 - 이진 데이터를 효과적으로 전송하기

+0

제안 해 주셔서 감사합니다. 이미 스트림에 글을 남겼습니다. 현재 ConsolePrintStream의 소스 코드에서 옵션을 제공하는지 살펴보고 있습니다. – Alex

+0

시도한 배치 : outputStream = new WriterOutputStream (새 OutputStreamWriter (System.out, "ISO-8859-1")); inputStream = 새 ReaderInputStream (새 InputStreamReader (System.in, "ISO-8859-1"))); 그러나 이것은 효과가 없습니다. 흠. – Alex

+0

출력에 따르면 "82"문자가 변경되었습니다 (인쇄 할 수없는 문자). 입출력 스트림이 이진 스트리밍을 지원하도록 변경해서는 안되지만 콘솔의 경우 그 이유가있을 수 있습니다. IMHO 두 부분을 모두 제어 할 수 있다면 데이터 (16 진수, 16 진수)를 인코딩하는 것이 좋습니다. – gusto2