Channel
基本上,所有的 IO 在NIO 中都从一个Channel 开始。Channel 有点象流。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。这里有个图示:
JAVA NIO中的一些主要Channel的实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
其中后三个主要用于网络编程,第一个是对文件的操作。
FileChannel类
Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。
FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。
一、创建FileChannel
主要有两种创建方式:
第一种:使用一个InputStream、OutputStream或RandomAccessFile来获取一个FileChannel实例。
第二种:JDK1.7之后才能使用, FileChannel.open()方法。
//InputStream、OutputStream或RandomAccessFile,创建FileChannel
RandomAccessFile raf = new RandomAccessFile("D:\\Java\\gp.txt", "r");
FileChannel channel = raf.getChannel();
FileInputStream fis = new FileInputStream("D:\\Java\\gp.txt");
FileChannel channel1 = fis.getChannel();
FileChannel channel2 = new FileOutputStream("D:\\Java\\gp.txt").getChannel();
//FileChannel.open()方法创建Channel
//Paths.get()获取路径,StandardOpenOption.READ表示读的模式
FileChannel readChannel = FileChannel.open(Paths.get("D:\\Java\\gp.jpg"), StandardOpenOption.READ);
//CREATE,如果文件存在就不创建,不存在就创建
FileChannel writeChanne1 = FileChannel.open(Paths.get("D:\\Java\\gp.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
//APPEND表示追加写入
FileChannel fileChannel = FileChannel.open(Paths.get("D:\\Java\\gp.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
二、从FileChannel读取数据
//读取数据,但是隐含“写”的过程,另外如果读到流的结尾,可能返回0或-1,
int read(ByteBuffer dst);
long read(ByteBuffer[] dsts);
long read