PeekInputStream 是 ObjectInputStream 类的一个内部类。
名如其类,此类用于向前“偷窥”一个字节,但并不影响 read 和 readn。
PeekInputStream 有两个重要的方法:peek 和 read。前者是偷窥,向前得到一个字节。后者是真正往前读得到一个字节,此操作将会向后移动流指针。
此类的设计思想精妙在 peek 的实现,此方法并非是直观上的实现。下面的代码给出几种直观上的实现。
int peek2() throws IOException
{
try
{
in.mark(1);
int retCh = in.read();
in.reset();
return retCh;
} catch (IOException e) {
throw new IOException("can't support mark");
}
}
int peek3() throws IOException
{
int ch = in.read();
if(-1 == ch) return ch;
long skipn = in.skip(-1);
if(-1 != skipn)
{
throw new IOException("can't support skip reverse");
}
return ch;
}
当需要向前‘偷窥’一个字节时,检查‘偷窥’缓存,如果非空直接返回;否则向后读一个字节,存入缓存(一个字节长度),再返回。
当需要向前读字节时,优先返回‘偷窥’缓存,再将缓存置空;否则按正常方式读取。
//peekb : ‘偷窥’缓存
int peek() throws IOException
{
return (peekb >= 0) ? peekb : (peekb = in.read());
}
public int read() throws IOException
{
if (peekb >= 0) {
int v = peekb;
peekb = -1;
return v;
} else {
return in.read();
}
}
本文详细解析了Java中ObjectInputStream类的内部类PeekInputStream,阐述了其设计思想及实现原理,包括如何高效地向前‘偷窥’字节而不影响后续操作。
2311

被折叠的 条评论
为什么被折叠?



