从同一个FileInputStream中读取字符串和二进制文件

7 java io stream

我有一个文件,在开始时包含一些纯文本,最后是二进制内容.二进制内容的大小由我读过的一条纯文本行确定.

我使用a BufferedReader来读取各行,但它没有公开任何方法来引用读取字节数组.所述readUTF用于DataInputStream犯规读一路到行的结束,并且readLine方法被弃用.

使用底层FileInputStream读取返回空字节数组.关于如何解决这个问题的任何建议?


private DOTDataInfo parseFile(InputStream stream) throws IOException{
DOTDataInfo info = new DOTDataInfo();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
int binSize = 0;
String line;
while((line = reader.readLine()) != null){
    if(line.length() == 0)
        break;
    DOTProperty prop = parseProperty(line);
    info.getProperties().add(prop);
    if(prop.getName().equals("ContentSize"))
        binSize = Integer.parseInt(prop.getValue());
}
byte[] content = new byte[binSize];
stream.read(content); //Its all empty now. If I use a DataInputStream instead, its got the values from the file
return info;
}
Run Code Online (Sandbox Code Playgroud)

Zac*_*ena 5

您可以使用RandomAccessFile。使用readLine()读一开始的纯文本(注意这个局限性,如API中所述),然后readByte()readFully()读取后续二进制数据。

使用底层FileInputStream 读取返回空字节数组。

这是因为您将流包装在中BufferedReader,当填充缓冲区时,该流可能已消耗了流中的所有字节。


Jon*_*eet 4

如果您确实有一个文件(而不是更难查找的文件,例如网络流),那么我建议如下:

  • 作为 FileInputStream 打开文件
  • 将其包装在 InputStreamReader 和 BufferedReader 中
  • 阅读文本,了解其中有多少内容
  • 关闭BufferedReader(这将关闭InputStreamReader,这将关闭FileInputStream)
  • 重新打开文件
  • 跳至(总文件长度 - 二进制内容长度)
  • 正常读取其余数据

如果您想避免重新打开文件,您可以只mark()在 FileInputStream 的开头调用,然后调用reset()andskip()到达正确的位置。(我一直在寻找一个InputStream.seek(),但我看不到 - 我不记得以前在 Java 中想要过它,但它真的没有吗?哎呀。)