2017-02-13 15 views
0

В Java есть ли способ управлять кодировкой файлов System.in и System.out?Java System.in и System.out отличаются между Sun/Oracle и IBM JVMs - решения для чтения стандартного байтового массива записи

ВС/Oracle использует:

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

IBM использует:

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

Проблема возникает на свет с JVM IBM, где выводит массив байтов данных в шестнадцатеричном дает : 308209d606092 ... (непосредственно перед записью на System.out)

но прочитайте в том же файле и выписывается как hex: 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. Читатель эффективно пытается ввести (de) код байтового массива в символы, и они не совпадают. Между поставщиками JVM может быть разное кодирование по умолчанию.

Так что я хотел бы предложить

  • закодировать массив байт (например, base64), чтобы иметь его в качестве символов, и это должно дать вам довольно одинаковые результаты по времени работы независимо вы используете читатель или поток

  • использовать поток только - эффективной передачи двоичных данных

+0

Спасибо за предложение - я думаю, что я уже пишу в поток. В настоящее время я смотрю исходный код ConsolePrintStream, чтобы узнать, предоставляет ли он какие-либо параметры. – Alex

+0

Пробная упаковка: outputStream = new WriterOutputStream (новый OutputStreamWriter (System.out, «ISO-8859-1»)); inputStream = новый ReaderInputStream (новый InputStreamReader (System.in, «ISO-8859-1»)); но это не сработало. Хм. – Alex

+0

По вашему результату был изменен только символ «82» (что является непечатаемым символом), хотя я считаю, что поток ввода/вывода не должен изменять его для поддержки бинарной потоковой передачи, но для консоли это может иметь свои причины. ИМХО, если у вас есть контроль над обеими частями, я бы предложил кодировать данные (base64, hex ..). – gusto2

Смежные вопросы