2009-11-06 2 views

ответ

1

№. Java не распознает строку с нулевым завершением как таковую. Вам нужно будет прочитать InputStream и искать 0 байт.

Обратите внимание, что это не относится к проблеме кодирования символов. InputStream предоставит вам поток байтов, и вам придется кодировать символы с помощью Reader. Если у вас многобайтовая кодировка символов, проблема становится более сложной.

+0

Если это работает, это зависит от кодировки символов. На самом деле ему нужно читать из Reader и искать символ 0, а не 0 байт. – jarnbjo

+1

Он явно запрашивает строки с нулевым завершением из * InputStream *. Это сбивает с толку, так как он тогда упоминает BufferedReader –

+1

Поскольку вы не можете читать символы и строки из InputStream, разве вам было бы приятно сказать ему, что вместо того, чтобы смутить его наполовину неправильным ответом? – jarnbjo

0

Вы можете создать метод, аналогичный описанному ниже. Создайте 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

Это отбросит все после первого 0-байта до следующего EOL. Если ваш файл содержит только 0-байтовый разделитель 'String', вы получите только одну строку String. – Bombe

+0

BufferedReader передается по ссылке для примера, поэтому сохраняет свое состояние. Во втором вызове он начнется там, где он остановился. – Gordon

+1

Это решение не обрабатывает многобайтовые кодированные символы. Решение @ dennis.zhdanov делает. – JoG

1

вы также должны понимать, что то, что "ноль" означает. потоки ввода/вывода относятся к байтам, тогда как читатели/писатели имеют дело с символами. если вы хотите совместить с нулевым символом, тогда вступает в действие кодировка преобразования байта в символ.

6
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("--------------------------------"); 
     } 
    } 
} 
+0

Это. Сканер должен быть самым доступным классом 'java.util. *'. – corsiKa