操作bytearray流

时间:2013-08-22 17:45:03

标签: java inputstream bytearrayinputstream

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

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)或重置无效。

1 个答案:

答案 0 :(得分:0)

使用bis.mark(pos-1)关注bis.reset()

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

来自doc:

  

将缓冲区重置为标记位置。除非标记了另一个位置或在构造函数中指定了偏移量,否则标记的位置为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) {
}

此代码存储最后读取字节的位置。您的代码之前没有工作,因为它是在读取您想要的字节之后存储位置