3

TFTP サーバーを作成しています。ファイルを正常に転送できましたが、ほとんどのファイルは相手側に到着しても開かれません。これは、受信したすべてのパケットからのファイル バイトを格納するために使用する ArrayList im の出力が、ファイルの先頭にバイトの負荷を追加するためです。例えば。"¬í sr java.util.ArrayListxÒ™Ça I sizeexp w ur [B¬óøTà xp ü!". そもそも List を使用する理由は、作成中のサーバーが、受信中のファイルのファイル サイズを知る方法がないためです。したがって、私が知る限り、これは設定された長さで初期化する必要があるため、byte[] を使用することはできません。これを回避する方法はありますか?

            WRQ WRQ = new WRQ();
            ACK ACK = new ACK();
            DatagramPacket outPacket;
            byte[] bytes;
            byte[] fileOut;
            List fileBytes = new ArrayList();
            outPacket = WRQ.firstPacket(packet);
            socket.send(outPacket);

            socket.receive(packet);

            while (packet.getLength() == 516){

            bytes = WRQ.doWRQ(packet);
            fileBytes.add(bytes);

            outPacket = ACK.doACK(packet);
            socket.send(outPacket);

            socket.receive(packet); 

            }

            bytes = WRQ.doWRQ(packet);
            fileBytes.add(bytes);

            outPacket = ACK.doACK(packet);
            socket.send(outPacket);

            ObjectOutputStream os;

            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000);
            os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
            os.flush();
            os.writeObject(fileBytes);
            os.flush();
            byte[] outFile = byteStream.toByteArray();
            os.close();

            FileOutputStream foStream = new FileOutputStream(filename);
            foStream.write(outFile);
            foStream.close();
4

1 に答える 1

4

メソッドを使用して、バイト配列を ArrayList に格納し、ObjectOutputStream にラップされた ByteArrayOutputStream に ArrayList 全体を書き込みますwriteObject()

これは、ネイティブ オブジェクトのシリアル化メカニズムを使用して、ArrayList オブジェクトを保存します。リスト内のすべてのバイト配列を次々に書き込むわけではありません。明確にするために、オブジェクトのシリアル化プロトコルを使用して、クラス名と ArrayList の内部構造を書き込みます。

ArrayList は必要ありません。ByteArrayOutputStream に直接書き込むか、FileOutputStream に直接書き込みます。そのまま、あなたはしようとしています

  • バイトをリストに書き込む
  • リスト内のバイトをバイト配列に書き込みます
  • バイト配列をファイルに書き込みます。

出力ファイル (バッファリングのために BufferedOutputStream にラップされている) に直接書き込む方がはるかに簡単 (かつ効率的) です。

于 2012-05-20T14:47:49.150 に答える