我需要从Java中读取来自InputStream的以零结尾的字符串。
是否有类似于BufferedReader.readLine()方法来读取以零结尾的字符串?
答案 0 :(得分: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("--------------------------------");
}
}
}
答案 1 :(得分:1)
没有。 Java无法识别以零结尾的字符串。您必须阅读InputStream
并查找0字节。
请注意,这并未解决字符编码问题。 InputStream
将为您提供字节流,然后您必须通过Reader
对字符进行编码。如果您有多字节字符编码,则问题会变得更加复杂。
答案 2 :(得分:1)
您还需要了解“零”的含义。输入/输出流处理字节,而读/写器处理字符。如果你想匹配零字符,那么字节到字符转换编码将起作用。
答案 3 :(得分: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);
}