2

我需要从 Java 中的 InputStream 中读取以零结尾的字符串。

是否有类似于 BufferedReader.readLine() 方法来读取以零结尾的字符串?

4

4 回答 4

8
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("--------------------------------");
        }
    }
}
于 2009-11-06T12:03:43.657 回答
1

您还需要了解“零”是什么意思。输入/输出流处理字节,而读取器/写入器处理字符。如果你想匹配一个零字符,那么字节到字符的转换编码就会发挥作用。

于 2009-11-06T11:37:44.963 回答
1

不,Java 不能识别以零结尾的字符串。您必须阅读InputStream并查找 0 字节。

请注意,这并没有解决字符编码的问题。将为您提供InputStream字节流,然后您必须通过Reader. 如果您有一个多字节字符编码,那么问题就会变得更加复杂。

于 2009-11-06T10:41:11.013 回答
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);

}
于 2009-11-06T10:57:20.133 回答