I need to read zero-terminated strings from InputStream in Java.
Is there similar to BufferedReader.readLine() method for reading zero-termianted strings?
I need to read zero-terminated strings from InputStream in Java.
Is there similar to BufferedReader.readLine() method for reading zero-termianted strings?
No. Java doesn't recognise a zero-terminated string as such. You'll have to read the InputStream
and look for a 0 byte.
Note that this doesn't address the issue of character-encoding. The InputStream
will give you the stream of bytes, and you'll then have to encode to characters via a Reader
. If you have a multi-byte character encoding then the issue becomes more complex.
You could enter create a method similar to the one bellow. Creating a BufferedReader from an InputStream. BufferedReader passed by reference so will retain state. Could be easily stored as an instance variable either.
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);
}
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("--------------------------------");
}
}
}