2017-02-13 16 views
0

在Java中,是否有任何方法来控制System.in和System.out的文件编码?Java System.in和System.out在Sun/Oracle和IBM JVM之间有所不同 - 读取写入标准字节数组的解决方案

太阳/ Oracle使用:

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之前)

但是读取在同一个文件中写出并以十六进制写出:303f09d606092a3f48 ...

Sun/Oracle显示相同的十六进制值。

有什么办法控制这些输入或切回到底层的通用输入/输出流? System.out是最终的,实现似乎取决于JVM。

更一般的情况是使用重定向一致的方式在应用程序之间传输文本/二进制数据?

任何代码显示如何正常化输入/输出数据/从System.in/out欣赏。使用Commons-IO IOUtils将流读取/写入字节数组。

+0

尽管'System.out'确实是'final',也有一个神奇的'System.setOut(PrintStream)'方法可以通过ge it(还有一个'System.setIn(InputStream)')。如果您愿意,您可以将它们更改为您自己选择的流。 – JonK

回答

0

我很长一段时间没有和IBM JDK一起工作过,但是在这里给我介绍了一些东西。 Stream和Reader之间有区别。读者有效地尝试en(de)代码字节数组到字符,他们是不一样的。 JVM提供者之间可能有不同的默认编码。

所以我建议

  • 编码的字节数组(如BASE64)把它作为一个字符,它应该给你漂亮相同的结果通过运行时无论使用阅读器或流

  • 只使用流 - 有效地传输二进制数据

+0

感谢您的建议 - 我想我已经写信给该流。我目前正在查看ConsolePrintStream的源代码,看看它是否提供了任何选项。 – Alex

+0

尝试换行:outputStream = new WriterOutputStream(new OutputStreamWriter(System.out,“ISO-8859-1”)); inputStream = new ReaderInputStream(new InputStreamReader(System.in,“ISO-8859-1”));但这并没有奏效。嗯。 – Alex

+0

根据你的输出,只有“82”字符已被改变(什么是不可打印的字符),但我相信输入/输出流不应该改变它来支持二进制流,但对于控制台它可能有其原因。恕我直言,如果你有两个部分的控制权,我建议编码数据(base64,十六进制..)。 – gusto2

相关问题