【问题标题】:Reading a binary file into a string将二进制文件读入字符串
【发布时间】:2023-03-18 08:51:01
【问题描述】:

这一定很明显,但我想不通。 为此,我花了将近一整天的时间。 我很乐意为可以减轻我体重的人买啤酒。

File file = new File(filePath);
byte[] bytes = new byte[(int)file.length()];
DataInputStream dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
dataInputStream.readFully(bytes);           
dataInputStream.close();            
return new String(bytes);

这是我的代码。 我看到字节数组大小不合适,但我无法确定正确的大小。 除此之外,内容也不对。 好像只有文字字符没问题。

似乎从二进制文件中取出数据是一件很痛苦的事,我真的很郁闷。

还有一点:文件内容不是文本,它可以是图片、视频或 pdf 之类的任何内容。

【问题讨论】:

    标签: java android file stream io


    【解决方案1】:

    如果您正在读取二进制文件,则应该尝试将其视为编码文本。将其转换为这样的字符串是不合适的 - 您应该将其保留为字节数组。如果你真的需要它作为文本,你应该使用 base64 或 hex 来表示二进制数据 - 其他方法可能会丢失数据。

    如果readFully 无异常返回,则表明它读取的数据与您请求的一样多,应该是整个文件。您已经设法相当容易地从二进制文件中获取数据(尽管 close() 调用应该在 finally 块中) - 它只是将其转换为文本,这是一个坏主意。

    【讨论】:

    • 背景:我需要将文件数据以base64编码格式发布到服务器。我所做的是:我将结果字符串编码为 Base64,这太疯狂了。此外,现在我发现我可以用一个函数解决整个故事: Base64.encodeFromFile(filePath) (Robert Harder 的第 3 方 base64,因为目标是 SDK 4) 现在所有三个解决方案,包括 Pablo 的结果相同的文件。遗憾的是仍然不行,因为生成的文件大小几乎是原始文件的 10 倍。但那是另一回事了。
    • 好的,我查了一下,问题出在网络层的某个地方。生成的 base64 编码字符串是正确的。
    【解决方案2】:

    正如 Jon Skeet 告诉你的(你应该总是听听 347k 的人!),如果它不是文本,不要将它保存在字符串中并将其保存为字节数组。另外,试试 commons-io 并使用它的辅助类。

    File file = new File(filePath);
    InputStream is  = null;
    byte[] bytes = null;
    try{
        bytes = IOUtils.toByteArray(is);
    }finally{
        IOUtils.closeQuietly(is)
    }
    

    【讨论】:

    • IOUtils 来自哪个包...?
    • org.apache.commons.io.IOUtils ...另外,您的 IDE 应该可以帮助您找到软件包
    • InputStream is 从未设置为任何内容 - 您的意思是将其设置为 FileInputStream(file) 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2020-08-28
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多