ファイルの読み取りに問題があります。私はNIOには全く新しいです。サーバーに送信するファイルの実際のサイズは、ほとんど900MBであり、3MBしか受信しませんでした。不完全なファイルコピーJava NIO
読書のためのサーバのサイドコード:
private void read(SelectionKey key) throws IOException{
SocketChannel socket = (SocketChannel)key.channel();
RandomAccessFile aFile = null;
ByteBuffer buffer = ByteBuffer.allocate(300000000);
try{
aFile = new RandomAccessFile("D:/test2/test.rar","rw");
FileChannel inChannel = aFile.getChannel();
while(socket.read(buffer) > 0){
buffer.flip();
inChannel.write(buffer);
buffer.compact();
}
System.out.println("End of file reached..");
}catch(Exception e){
e.printStackTrace();
}
}
これは、クライアント側の書き込み方法のための私のコードです:
private void write(SelectionKey key) throws IOException {
SocketChannel socket = (SocketChannel) key.channel();
RandomAccessFile aFile = null;
try {
File f = new File("D:/test.rar");
aFile = new RandomAccessFile(f, "r");
ByteBuffer buffer = ByteBuffer.allocate(300000000);
FileChannel inChannel = aFile.getChannel();
while (inChannel.read(buffer) > 0) {
buffer.flip();
socket.write(buffer);
buffer.compact();
}
aFile.close();
inChannel.close();
key.interestOps(SelectionKey.OP_READ);
} catch (Exception e) {
e.printStackTrace();
}
}
考えてみてください:read()は通常、読み込まれたバイト数を正確に示します。これは、すべてのバッファー・バイトが読み取られたわけではありません。少なくとも古い学校のIOでは、バッファからすべてのバイトを読み込むまでループしなければなりませんでした。 – GhostCat
'socket.read(buffer)> 0' +ノンブロッキングIO =失敗。ゼロはストリームの終わりを意味するものではなく、その時点で読み込み可能なデータがないことを意味します。だから、あなたは完全にブロックする方法で読んでいますが、明らかに機能しないNIOを扱っています。 – user3707125