1

我的应用程序可以编辑一种称为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(char%5B%5D%2Cint% 2Cint)

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

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

非常感谢!

4

3 回答 3

4

只需传入阅读器即可。它将继续阅读它停止的地方:

TDAEntry entry = new TDAEntry(form, entryReader); 
于 2013-08-16T20:19:44.917 回答
1

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

于 2013-08-16T20:39:07.320 回答
0

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

并不是说这一定是处理这个问题的最好方法。基本上在半空中切换流是一个非常糟糕的主意。您可以创建自己的 InputStream 实现来读取标头和条目。

于 2013-08-16T20:20:01.337 回答