0

我从命令行(示例)中读取了以下字符串:

abcgefgh0111010111100000

我将其作为流处理以到达二进制的第一个位置(在本例中为位置 9)。代码如下:

String s=args[0];
    ByteArrayInputStream  bis=new ByteArrayInputStream(s.getBytes());
    int c;
    int pos=0;
    while((c=bis.read())>0)
    {
        if(((char)c)=='0' || ((char)c)=='1') break;
        pos++;
    }

bis.mark(pos-1);\\this does not help
    bis.reset();\\this does not help either
    System.out.println("Data begins from : " + pos);
    byte[] arr=new byte[3];
    try{
    bis.read(arr);
    System.out.println(new String(arr));
    }catch(Exception x){}

现在 Arraystream 将从位置 10('1') 开始读取。
如何使其后退一个位置以实际从第 9 位的第一个二进制数字('0')开始再次读取。
bis.mark(pos-1)否则重置无济于事。

4

1 回答 1

0

跟随bis.mark(pos-1),与bis.reset()

reset() 会将流的读取光标定位在最后标记的位置(pos-1在这种情况下。)

来自文档:

将缓冲区重置为标记位置。标记的位置为 0,除非标记了另一个位置或在构造函数中指定了偏移量。

像这样重写你的循环:

String s = "abcgefgh0111010111100000";
ByteArrayInputStream bis = new ByteArrayInputStream(s.getBytes());
int c;
int pos = 0;
while (true) {
    bis.mark(10);
    if ((c = bis.read()) > 0) {
        if (((char) c) == '0' || ((char) c) == '1')
            break;
        pos++;
    } else
        break;
}
bis.reset();// this does not help either
System.out.println("Data begins from : " + pos);
byte[] arr = new byte[3];
try {
    bis.read(arr);
    System.out.println(new String(arr));
} catch (Exception x) {
}

此代码存储最后读取字节的位置。您的代码之前无法正常工作,因为它在读取您想要的字节之后存储了位置。

于 2013-08-22T17:46:20.290 回答