Почему DataInputStream не может правильно прочитать char? - PullRequest
1 голос
/ 21 октября 2019

Я пытался написать String в DataInputStream, когда читал из DataInputStream один символ, но у меня ошибка.

Я ожидал, что readChar() вернет 'q', но метод:

assertEquals('q', DataInputStream("q".byteInputStream(Charsets.UTF_8)).readChar())

Исключение выдает:

java.io.EOFException at java.io.DataInputStream.readChar (DataInputStream.java:365)

1 Ответ

1 голос
/ 21 октября 2019

Пожалуйста, посмотрите на DataInput.readChar(), который гласит:

Считывает два входных байта и возвращает значение символа. Пусть a будет первым прочитанным байтом, а b будет вторым байтом. Возвращаемое значение:

(char)((a << 8) | (b & 0xff))

Этот метод подходит для чтения байтов, записанных методом writeChar интерфейса DataOutput.

Последнее предложение в основном также решение. Если вы записываете данные, используя writeChar, чтение работает как положено, то есть следующее даст вам успешный тестовый пример:

assertEquals('q', DataInputStream(ByteArrayOutputStream().apply {
                    DataOutputStream(this).use {
                      it.writeChars("q")
                    }
                  }.toByteArray().inputStream())
                  .readChar())

Следующее, даже если это не упомянуто в интерфейсе, может также сработать:

assertEquals('q', DataInputStream("q".byteInputStream(Charsets.UTF_16BE)).readChar())
...