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;
}

この2つのFileOutputStreamは、2つのファイル(同じファイルで名前が異なる)を作成し、正常に機能します。ただし、fileData.read()を使用していない場合は、/ 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は作業ファイルも作成します。

リストのサイズまで実行するか、最初に入力した時間に等しい「サイズ」まで実行するかは関係ありません。何か足りないものがあり、理解できません。

奇妙なことに、outstreamBは動作するファイルを作成しますが、outstreamCは作成できませんが、まったく同じアイテムで動作します。

もともとは、RMI接続を介して最初に入るたびに「読み取り」と「バッファ」を渡し、すべてのパーツが到着した後、すべてを反対側にまとめる予定でしたが、今では私の計画はやや死んでいます。誰かがおそらくアイデアを持っています、どうすればこれを解決できますか、またはRMIを介してファイルを送信できるようにするのと同様のことを達成できますか?

よろしく、ミハリ

4

1 に答える 1

0

あなたのコードは決して機能しません。同じバッファを繰り返し読み込んで、同じバッファをリストに追加しています。したがって、リストには、読み取った最終データのコピーがいくつか含まれています。ループの前後で毎回新しいバッファを割り当てる必要があります。

于 2012-11-02T22:08:35.250 に答える