我从命令行(示例)中读取以下字符串:
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)
或重置无效。
答案 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) {
}
此代码存储最后读取字节的位置。您的代码之前没有工作,因为它是在读取您想要的字节之后存储位置。