私はこの非常に奇妙な問題と戦っています。誰かが理由を説明してくれることを願っています。
ソケット接続を介してファイルからデータを転送するためのこのコードがあります。
byte[] chunk = new byte[Constants.TRANSFER_CHUNK_SIZE];
try (InputStream fileInputStream = new FileInputStream(sourceFile); BufferedInputStream buffFileInputStream = new BufferedInputStream(fileInputStream)) {
while (offset < sourceFileSize) {
int numBytes = buffFileInputStream.read(chunk, 0, Constants.TRANSFER_CHUNK_SIZE);
Message chunkMessage = new Message(MessageType.SPM_TRANSFER_CHUNK, numBytes, null, chunk);
this.sendMessage(chunkMessage);
}
}
メソッド sendMessage は特別なことは何もしません。オブジェクトを ObjectOutputStream 経由で送信するだけです。
private void sendMessage(Message message) {
try {
this.conOutputStream.writeObject(message);
this.conOutputStream.flush();
} catch (IOException ex) {
......
}
}
Message クラス自体は次のようになります。
public class Message implements Serializable {
protected final MessageType type;
protected final int intValue;
protected final String stringValue;
protected byte[] data;
protected final long longValue;
public Message(MessageType type, int intValue, long longValue, String stringValue, byte[] data) {
this.type = type;
this.intValue = intValue;
this.stringValue = stringValue;
this.data = data;
this.longValue = longValue;
}
................
}
送信機側でチャンク配列を印刷すると、データは問題ありませんが、受信機側では常に最初のチャンクからデータを受信します (最初の 3 バイトのみが印刷されます)。
RC: 73 68 51
RC: 73 68 51
RC: 73 68 51
RC: 73 68 51
.......
私がすでに知っていること:
- 問題は輸送中ではありません。
- while サイクルのすべてのループで新しい配列を作成すると、この問題が解決されます (ただし、メモリが非効率的であるため、変更しました。)
前もって感謝します。