1

私がする必要があるのは、DataStreams を使用して複数のファイルを送信することです。ファイルの名前を送信してから、ファイルのバイトを送信することでこれを行っています。ただし、未定の数のファイルを送信する必要があります。これがDataOutputStreamコードです。

            out.writeUTF(path);
            out.write(Files.readAllBytes(file.toPath()));

送信する必要があるファイルごとにそれを行います。しかし、 で正しく読む方法がわかりませんDataInputStream。これは私がこれまでに持っているものです。

    while (in.available() != 0) {
        String path = in.readUTF();
        byte bytes = in.readByte();
    }

1バイトしか読み取っていないため、明らかに機能しません。しかし、すべてのバイトを読み取らせる方法がわかりません。いくつかのファイルが送信されているため、available()すべてのファイルの最後が読み取られたときにのみ 0 になると思います。どんな助けでも大歓迎です。

言い忘れていましたが、メモリ不足にならずに大きなファイルを送信できるようにしたいのですが、うまくいかないと思います。バッファを使用する必要があると思いますが、ファイルでそれをサポートしているクラスがわかりません。

4

2 に答える 2

2

可変長メッセージを送信するときはいつでも、各メソッドの開始と終了をマークする何らかの方法が必要です。

 List<File> files = someListOfFilesYouWantToSend;
 out.writeInt(files.size());
 for(File file : files){
   out.writeUTF(path);
   out.writeLong(file.getTotalSpace());
   out.write(Files.readAllBytes(file.toPath()));
 }

次に、それを読むには、次のようにします

int filesToRead = in.readInt();    
for(int i = 0; i < filesToRead; i++){
  String path = in.readUTF();
  long bytesToRead = in.readLong();      
  FileOutputSteam fos = new FileOutputStream(path);

  byte[] buffer = new byte[1024];
  while(bytesToRead > 0){
    bytesRead = in.read(buffer,0,bytesToRead > buffer.length ? buffer.length : bytesToRead);
    bytesToRead -= bytesRead;
    fos.write(buffer);
  }
}
于 2012-04-18T20:56:53.090 に答える
0

それはそれを行う方法ではありません...送信したいすべてのファイルをアーカイブ (JAR や ZIP など) に単純にアーカイブしないのはなぜですか? 受信側では、アーカイブを抽出できます。Java には、使用できる組み込みの JAR 実装 (パッケージ java.util.jar 内) があります。

于 2012-04-18T19:35:48.920 に答える