我的文件在开头包含一些纯文本,最后是二进制内容。二进制内容的大小由我读过的一条纯文本行确定。
我使用BufferedReader
来读取各行,但它没有公开引用读取字节数组的方法。 readUTF
的{{1}}不会一直读到行尾,并且不推荐使用DataInputStream
方法。
使用底层readLine
读取返回空字节数组。关于如何解决这个问题的任何建议?
FileInputStream
答案 0 :(得分:4)
您可以使用RandomAccessFile
。使用readLine()
在开始时阅读纯文本(请注意API中所述的限制),然后使用readByte()
或readFully()
来读取后续的二进制数据。
使用基础
FileInputStream
读取返回空字节数组。
那是因为你把流包装在BufferedReader
中,在填充缓冲区时可能已经消耗了流中的所有字节。
答案 1 :(得分:3)
如果你真的有一个文件(而不是更难以寻找的东西,例如网络流),那么我建议这样的事情:
您可以在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。您有以下选择: