Я только что узнал о пакете и каналах java nio, и теперь я попытался написать действительно простую программу передачи файлов с использованием каналов. Моя цель состояла в том, чтобы избавиться от всего этого побайтового чтения. В качестве первой попытки я написал следующий код сервера:
public class Server {
public static void main(String args[]) throws FileNotFoundException, IOException {
String destination = "D:\tmp\received";
int port = 9999;
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(9999));
SocketChannel socketChannel = serverSocketChannel.accept();
FileChannel fileChannel = new FileOutputStream(destination).getChannel();
fileChannel.transferFrom(socketChannel, 0, 32);
socketChannel.close();
serverSocketChannel.close();
}
}
и следующий клиентский код:
public class Client {
public static void main(String args[]) throws FileNotFoundException, IOException {
String fileName = "D:\\dump\\file";
InetSocketAddress serverAddress = new InetSocketAddress("localhost", 9999);
FileChannel fileChannel = new FileInputStream(fileName).getChannel();
SocketChannel socketChannel = SocketChannel.open(serverAddress);
fileChannel.transferTo(0, fileChannel.size(), socketChannel);
socketChannel.close();
fileChannel.close();
}
}
для передачи предопределенного 32-байтового файла через предопределенный порт без какой-либо обработки ошибок и прочего.
Эта программа компилируется и запускается без каких-либо ошибок, но в конце файл назначения ("полученный") не записывается.
Можно ли с помощью этой методики передать файл или я что-то не так понял? Можете ли вы сказать мне, что я сделал неправильно в приведенном выше коде? После некоторых исследований я еще не нашел никакого решения, но просто нашел фрагменты кода, которые используют этот побайтовый материал (например: в то время как (есть данные) {прочитайте 32 байта и запишите их в файл}).