【问题标题】:Java fileinputstream reading without .read()没有 .read() 的 Java 文件输入流读取
【发布时间】:2012-11-03 06:14:23
【问题描述】:

我遇到了一个奇怪的问题,我想知道是否有人知道可能是什么原因。我正在使用 FileInputStream 读取一个文件(一个 472 KB 的小 exe),我计划通过 RMI 连接发送文件,我有一个想法,我可以根据我已经发送了多少来显示上传的百分比与文件的总长度相比。

首先我在本地尝试了它,但我无法让它工作。这是一个例子,我在做什么。

FileInputStream fileData = new FileInputStream(file);
reads = new ArrayList<Integer>();
buffers = new ArrayList<byte[]>();
int i = 0;
while ( (read = fileData.read(buffer)) > 0) {
      System.out.println("Run : " + (i + 1));
      outstreamA.write(buffer, 0, read);
      reads.add(read);
      buffers.add(buffer);
      outstreamB.write(this.buffers.get(i), 0, this.reads.get(i));
      i = i + 1;
}

这两个 FileOutputStream 创建了两个文件(相同的只是名称不同),工作正常。但是,当我不使用 fileData.read() 而是任何其他 for / while 时,它​​就不起作用了。它创建完全相同的文件(长度完全相同)但我的窗口无法运行 exe,我收到一条错误消息: “此文件的版本与您运行的 Windows 版本不兼容...”。

这就是我尝试的方式:

//for (int i = 0; i < buffers.size(); ++i) {
  i = 0;
//while ( (read = fileData2.read(buffer)) > 0) {
  while ( i < size) {
      System.out.println("Run#2 : " + (i + 1));
      outstreamC.write(this.buffers.get(i), 0, this.reads.get(i));
      i = i + 1;
  }

fileData2 与 fileData 相同。如果我使用 fileData2.read(buffer),outstreamC 也会创建一个工作文件。

如果我运行 for 直到列表的大小,或者直到等于我输入第一个 while 的时间的“大小”,这并不重要。少了点什么,我想不通。

奇怪的是,outstreamB 创建了一个工作文件,而 outstreamC 不能,但它们使用完全相同的项目。

本来我打算每次通过RMI连接进入第一个时通过“读取”和“缓冲区”,然后在所有部件到达后将所有东西放在另一边,但现在我的计划有点死了.任何人都可能有一个想法,我该如何解决这个问题,或者实现类似的东西以便能够通过 RMI 发送文件?

最好的问候, 米哈莉

【问题讨论】:

    标签: java file fileinputstream fileoutputstream


    【解决方案1】:

    您的代码永远无法运行。您正在重复读取同一个缓冲区并将同一个缓冲区添加到列表中。因此,该列表包含您读取的最终数据的多个副本。每次循环时都需要分配一个新缓冲区。

    【讨论】:

    • 但是 outstreamC 怎么能工作,如果我把所有东西都留在第二个里面而不动,只将布尔值更改为 read = fileData2.read(buffer)
    • 你是对的,我不得不在循环中调用 buffer = new byte[8192],感谢您的快速帮助和时间。仍然有点困惑,如果我只是交换循环的条件,那么我的第二个循环如何工作。
    • @Dark 这两个问题我都不懂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2015-01-14
    • 2012-05-03
    • 2014-12-04
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多