Мне нужно прочитать строки с нулевым завершением из InputStream в Java.Java BufferedReader для строк с нулевым завершением
Есть ли способ BufferedReader.readLine() для чтения строк с нулевым завершением?
Мне нужно прочитать строки с нулевым завершением из InputStream в Java.Java BufferedReader для строк с нулевым завершением
Есть ли способ BufferedReader.readLine() для чтения строк с нулевым завершением?
№. Java не распознает строку с нулевым завершением как таковую. Вам нужно будет прочитать InputStream
и искать 0 байт.
Обратите внимание, что это не относится к проблеме кодирования символов. InputStream
предоставит вам поток байтов, и вам придется кодировать символы с помощью Reader
. Если у вас многобайтовая кодировка символов, проблема становится более сложной.
Вы можете создать метод, аналогичный описанному ниже. Создайте BufferedReader
от InputStream
. BufferedReader
передается по ссылке, чтобы сохранить состояние. Его также можно легко сохранить в переменной экземпляра.
public String readLine(BufferedReader buff) throws IOException{
int c = buff.read();
// if EOF
if (c == -1){
return null;
}
StringBuilder builder = new StringBuilder("");
// Check if new line or EOF
while (c != -1 && c != 0){
builder.append((char) c);
c = buff.read();
}
return builder.toString();
}
....
String line = reader.readLine(buff);
while (line != null)
{
System.out.println(line);
line = reader.readLine(someBufferedReader);
}
Это отбросит все после первого 0-байта до следующего EOL. Если ваш файл содержит только 0-байтовый разделитель 'String', вы получите только одну строку String. – Bombe
BufferedReader передается по ссылке для примера, поэтому сохраняет свое состояние. Во втором вызове он начнется там, где он остановился. – Gordon
Это решение не обрабатывает многобайтовые кодированные символы. Решение @ dennis.zhdanov делает. – JoG
вы также должны понимать, что то, что "ноль" означает. потоки ввода/вывода относятся к байтам, тогда как читатели/писатели имеют дело с символами. если вы хотите совместить с нулевым символом, тогда вступает в действие кодировка преобразования байта в символ.
package com;
import java.io.*;
import java.util.Scanner;
public class AAA {
private static final String ENCODING = "UTF-8";
public static void main(String[] args) throws Exception {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
bOut.write("the first line".getBytes(ENCODING));
bOut.write(0);
bOut.write("the second line\r\n (long one)".getBytes(ENCODING));
bOut.write(0);
bOut.write("the third line".getBytes(ENCODING));
printLines(new ByteArrayInputStream(bOut.toByteArray()));
}
public static void printLines(InputStream in) {
Scanner scanner = new Scanner(in, ENCODING);
scanner.useDelimiter("\u0000");
while (scanner.hasNext()) {
System.out.println(scanner.next());
System.out.println("--------------------------------");
}
}
}
Это. Сканер должен быть самым доступным классом 'java.util. *'. – corsiKa
Если это работает, это зависит от кодировки символов. На самом деле ему нужно читать из Reader и искать символ 0, а не 0 байт. – jarnbjo
Он явно запрашивает строки с нулевым завершением из * InputStream *. Это сбивает с толку, так как он тогда упоминает BufferedReader –
Поскольку вы не можете читать символы и строки из InputStream, разве вам было бы приятно сказать ему, что вместо того, чтобы смутить его наполовину неправильным ответом? – jarnbjo