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

时间:2009-02-20 07:40:59

标签: java io stream

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

我使用BufferedReader来读取各行,但它没有公开引用读取字节数组的方法。 readUTF的{​​{1}}不会一直读到行尾,并且不推荐使用DataInputStream方法。

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


FileInputStream

7 个答案:

答案 0 :(得分:4)

您可以使用RandomAccessFile。使用readLine()在开始时阅读纯文本(请注意API中所述的限制),然后使用readByte()readFully()来读取后续的二进制数据。

  

使用基础FileInputStream   读取返回空字节数组。

那是因为你把流包装在BufferedReader中,在填充缓冲区时可能已经消耗了流中的所有字节。

答案 1 :(得分:3)

如果你真的有一个文件(而不是更难以寻找的东西,例如网络流),那么我建议这样的事情:

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

您可以在FileInputStream的开头调用mark(),然后在reset()skip()调用,以便在需要避免重新打开文件时到达正确的位置。 (我当时正在寻找一个InputStream.seek(),但我看不到一个 - 我记不起在Java之前想要它,但它真的没有吗?Ick。)

答案 2 :(得分:2)

您需要使用InputStream。读者是为了角色数据。查看使用DataInputStream包装输入流,如:

stream=new DataInputStream(new BufferedInputStream(new FileInputStream(...)));

数据输入流将为您提供许多有用的方法来读取各种类型的数据,当然还有用于读取字节的基本InputStream方法。

(这实际上是HTTP服务器必须执行的内容读取请求。)


readUTF不读取一行,它读取以(修改的)UTF8格式编写的字符串 - 请参阅JavaDoc。

答案 3 :(得分:1)

唉,DataInputStream已弃用且不处理UTF。但这应该有所帮助(它从二进制流中读取一行,没有任何预测)。

public static String lineFrom(InputStream in) throws IOException {
    byte[] buf = new byte[128];
    int pos = 0;
    for (;;) {
        int ch = in.read();
        if (ch == '\n' || ch < 0) break;
        buf[pos++] = (byte) ch;
        if (pos == buf.length) buf = Arrays.copyOf(buf, pos + 128);
    }
    return new String(Arrays.copyOf(buf, pos), "UTF-8");
}

答案 4 :(得分:0)

正确的方法是使用某种形式的InputStream,可能是FileInputStream,除非这成为性能障碍。

你是什么意思“使用底层的FileInputStream读取返回空字节数组。”?这似乎不太可能,可能是你的错误所在。你能告诉我们你尝试过的示例代码吗?

答案 5 :(得分:0)

您可以使用BufferedReader阅读文本。当您知道二进制文件的起始位置时,您可以关闭该文件并使用RandomAccessFile打开它,并从文件中的任何位置读取二进制文件。 或者,您可以将文件读取为二进制文件,并将标识为文本的部分转换为文本。 {使用新字符串(字节,编码)}

答案 6 :(得分:0)

我建议使用DataInputStream。您有以下选择:

  • 使用DataInputStream
  • 读取文本和二进制内容
  • 打开BufferedReader,读取文本并关闭流。然后打开一个DataInputStream,跳过等于文本大小的字节并读取二进制数据。