【问题标题】:Why is my DataInputStream only reading 114 bytes?为什么我的 DataInputStream 只读取 114 个字节?
【发布时间】:2015-08-18 09:01:04
【问题描述】:

我正在尝试从我的 jar 中提取一个文件并将其复制到 temp 目录中。 要读取 jar 中的文件,我使用的是 DataInputStream,要在 temp 目录中写入文件,我使用的是 DataOutputStream

我尝试提取的文件的文件大小为 310 KB,在我调用我的方法后,我复制的文件仅包含 114 个字节(这也是我的方法打印到控制台的字节数)。

这是我的方法:

private static void extractFile(String pathInJar, String fileToCopy) {
        File outputFile = new File(System.getProperty("java.io.tmpdir") + "/LDEngine/"+fileToCopy);
        boolean couldDirsBeCreated = outputFile.getParentFile().mkdirs();
        if(couldDirsBeCreated && !outputFile.exists()) {
            int x;
            int actualBytesRead = 0;
            byte[] tmpByteArray = new byte[4096];
            try(
                    DataOutputStream output = new DataOutputStream(new FileOutputStream(outputFile));
                    DataInputStream in = new DataInputStream(LibLoader.class.getResourceAsStream("/libs/natives/"+pathInJar))
            ){
                while((x=in.read(tmpByteArray)) != -1) {
                    output.write(tmpByteArray);
                    actualBytesRead += x;
                }
            } catch(Exception e) {
                System.err.println("Fatal error: Could not write file!");
                System.exit(1);
            }
            System.out.println(actualBytesRead);
        }
    }

我要复制的文件是.dll,所以我正在处理的是二进制数据。

问题是为什么会发生这种情况,我做错了什么?

【问题讨论】:

  • 提个醒:有许多经过良好测试的库(如 Google Guava),它们的功能与您所做的完全相同。例如。 Resources.copy(Resources.getResource(SomeRef.class, "/dir/SomeResource.txt"), someOutputStream);。这最大限度地减少了代码和测试“开销”。祝你的项目好运。

标签: java datainputstream


【解决方案1】:

这并不能解释为什么你的方法这么快就停止了,但你需要注意它,否则你会遇到一个更奇怪的问题,结果数据完全乱码。

来自 DataInputStream.read() 的 API 文档:

从包含的输入流中读取一些字节并将它们存储到缓冲区数组 b 中。实际读取的字节数以整数形式返回。

您需要使用该返回值并调用获取偏移量和长度的 write() 方法。

【讨论】:

  • 刚才试过了,没区别。
  • @JackWhiteIII:是的,我意识到这并不能解释为什么你的方法会提前停止,但你仍然需要修复它。您是否将输出文件的内容与输入文件进行了比较?
  • 我还没有测试过,但是我发现了另一个错误:我在创建 InputStream 时没有连接 pathInJar 和文件。现在测试一下。
  • 就是这样。但是因为提示我 DataInputStream.read(array, offset, length),我接受你的回答。
猜你喜欢
  • 2015-06-26
  • 2016-03-02
  • 2014-11-19
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多