Java:在一个InputStream上使用两个读卡器



我的应用程序可以编辑一种类型的文本文件,称为TDAEntry。每个这样的条目都基于另一种描述其格式的文件类型,称为TDAFormTDAEntry文本文件中的第一行是它所属表单的名称,然后是其余数据(以文本形式)。

对于现在打开这样一个文件,这里是我的代码,简化为:

InputStream entryInput = new FileInputStream(file);
BufferedReader entryReader = new BufferedReader(
    new InputStreamReader(entryInput)); // PROBLEMATIC #1
String formName = entryReader.readLine();
TDAForm form = new TDAForm(formName);
// create an entry with the right form and the data which follows in entryInput
TDAEntry entry = new TDAEntry(form, entryInput); // PROBLEMATIC #2

问题来了。当读取InputStreamReader的源代码时,您将最终读取此类的代码:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/cs/StreamDecoder.java#StreamDecoder.read(字符%5B%5D%2int%2int)

这意味着它提前读取大约8000个字节。这导致"Problematic#2"行的InputStream为空,并且位于错误的位置,而我希望它继续,就好像只读取了文件的第一行一样。在TDAEntry的构造函数中,我可能想在流上构造另一种读取器,或者做其他事情。

一个显而易见的解决方案是编写一个新的解码器,它不会占用前面的字节。但我想知道是否有更简单的方法可以做到这一点。你将如何解决这个问题,或者你建议用另一种编程结构来完成同样的事情?

非常感谢!

只需传入读卡器即可。它将继续读取它停止的位置:

TDAEntry entry = new TDAEntry(form, entryReader); 

您可以尝试将FileInputStream包装到BufferedInputStream中,因为缓冲版本支持mark()和reset()。

如果只想限制缓冲区,就不需要编写自己的类。您可以使用第二个构造函数,即new BufferedReader(new InputStreamReader(entryInput), 20);来限制缓冲区大小。

并不是说这一定是处理这个问题的最佳方式。基本上,在半空中切换气流是个坏主意。您可以创建自己的InputStream实现,该实现读取标头和条目。

最新更新