3

我遇到了一个奇怪的问题,我想知道是否有人知道可能是什么原因。我正在使用 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 时,它​​就不起作用了。它创建完全相同的文件(长度完全相同),但我的 Window 无法运行 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 也会创建一个工作文件。

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

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

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

最好的问候,米哈利

4

1 回答 1

0

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

于 2012-11-02T22:08:35.250 回答