Ich habe Probleme mit dem Lesen meiner Datei. Ich bin auch ziemlich neu bei NIO. Die tatsächliche Größe der Datei, die ich an den Server senden möchte, ist fast 900MB und erhielt nur 3MB.Unvollständige Datei Kopieren Java NIO
den Seitencode des Servers zum Lesen:
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();
}
}
Das ist mein Code für die Schreibmethode der Client-Seite ist:
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();
}
}
Nur zu denken: read() sagt Ihnen normalerweise die genaue Anzahl Bytes, die gelesen wurden. Das bedeutet nicht, dass ALLE Pufferbytes gelesen wurden. Zumindest in der alten Schule IO mussten Sie Schleife, bis Sie ALLE Bytes von Ihrem Puffer lesen. – GhostCat
'socket.read (buffer)> 0' + nicht blockierendes IO = Fehler, weil Null nicht das Ende des Streams bedeutet, sondern nur das Fehlen von Daten, die im Moment zum Lesen bereit sind. Sie lesen also völlig blockierend, während Sie mit NIO arbeiten, was offensichtlich nicht funktioniert. – user3707125