Channel (канал):
1. Поток подобен, но различия заключаются в следующем:
Каналы могут быть одновременно читать и писать, чтение или запись только поток
канал может быть асинхронные данные записи
данных канала могут быть считаны из буфера (буфера), может также записи данных в буфер (буфер)
2.BIO поток является однонаправленным, канал в обоих направлениях, вы можете прочитать, вы можете написать
Канал 3 представляет собой интерфейс, в NIO
категория канала обычно используются: FileChannel, DatagramChannel, ServerScoketChannel и SocketChannel
FileChannel для чтения данных и файлов записи, DatagramChannel из UDP для чтения данных и записи, ServerScoketChannel для чтения и записи данных, а также TCP SocketChannel
Процесс сети связи NIO
Это создает ServerScoketChannel (ServerScoketChannelImpl) на стороне сервера, создавая SocketChannel (SocketChannelImpl) генерируется соответствующий клиенту
Канал основных методов:
1. Чтение : считывание данных из канала и помещается в буфер
2. Записать : записать канал данных в буфере
3. transferFrom : копирование данных из канала назначения для текущего канала
4. о переходе : данные из потока кАНАЛ копируются в канал назначения
следующего канала записи в операции чтения файла и записи:
запись в файл
package com.jym.nio;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: Channel学习
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel {
public static void main(String[] args) throws Exception {
String str = "hello,jym";
FileOutputStream fileOutputStream = new FileOutputStream("D:\\jym.txt");
// 通过fileOutputStream获取对应的channel,真实类型为FileChannelImpl
FileChannel fileChannel = fileOutputStream.getChannel();
// 创建一个缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
// 将str放入到byteBuffer
byteBuffer.put(str.getBytes());
// 将byteBuffer进行翻转,因为需要读
byteBuffer.flip();
// 将byteBuffer数据写入到fileChannel
fileChannel.write(byteBuffer);
fileOutputStream.close();
}
}
Прочитайте содержимое файла:
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: 读取数据
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel1 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\jym.txt");
FileInputStream fileInputStream = new FileInputStream(file);
// 通过fileInputStream 获取channel,实际类型为FileChannelImpl
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate((int)file.length());
// 将通道数据读入到缓冲区中
fileInputStreamChannel.read(byteBuffer);
// 将字节信息转成字符串
System.out.println(new String(byteBuffer.array()));
fileInputStream.close();
}
}
Давайте все вместе, и завершение копирования файлов
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: 文件拷贝练习
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel2 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\壁纸\\1.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
// 通过fileInputStream 获取channel,实际类型为FileChannelImpl
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
FileOutputStream fileOutputStream = new FileOutputStream("3.jpg");
// 通过fileOutputStream获取对应的channel,真实类型为FileChannelImpl
FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
while (true){
byteBuffer.clear();
// 将通道数据读入到缓冲区中
int read = fileInputStreamChannel.read(byteBuffer);
if(read == -1){
break;
}
// 需要写,所以得切换
byteBuffer.flip();
// 将byteBuffer数据写入到fileChannel
fileOutputStreamChannel.write(byteBuffer);
}
fileInputStream.close();
fileOutputStream.close();
}
}
Примечание: для чтения данных в цикле, когда необходимо очистить (), что, если не чистить, он был прочитан как 0, в бесконечный цикл
Перенесите метод, чтобы скопировать файл, этот процесс просто много:
package com.jym.nio;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
/**
* @program: JymNetty
* @description: transfer测试
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannel3 {
public static void main(String[] args) throws Exception {
File file = new File("D:\\壁纸\\1.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
FileChannel fileInputStreamChannel = fileInputStream.getChannel();
FileOutputStream fileOutputStream = new FileOutputStream("4.jpg");
FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
fileOutputStreamChannel.transferFrom(fileInputStreamChannel,0,fileInputStreamChannel.size());
fileInputStreamChannel.close();
fileOutputStreamChannel.close();
fileInputStream.close();
fileOutputStream.close();
}
}