一.通道介绍
1.1 通道(channel)
- 用于在字节缓冲区和位于通道的另一测的实体(通常是文件或套接字)之间有效的传输数据。
- 多数情况下,通道与操作系统文件描述符(File Descriptor) 和 文件句柄 (File Handler) 有着一对一的关系。
1.2 通道
1.通道接口
public interface Channel extends Closeable {
// 检查通道是否开启
public boolean isOpen();
// 关闭通道
public void close() throws IOException;
}
常用的几个接口:
1).ReadableByteChannel
public interface ReadableByteChannel extends Channel {
public int read (ByteBuffer dst) throws IOException;
}
2).WritableByteChannel
public interface WritableByteChannel extends Channel {
public int write (ByteBuffer src) throws IOException;
}
3).ByteChannel
public interface ByteChannel extends ReadableByteChannel, WritableByteChannel {
}
说明:
ByteBuffer:通道是将数据传给ByteBuffer,或者从ByteBuffer 对象获取数据来传输。
ByteChannel接口:本身并不定义新的API方法,它是一种用来聚集它自己以一个新名称继承的多个接口的便捷接口
2.打开通道
1).Socket 通道可以通过Socket 通道的工厂方法直接创建:
SocketChannel sc = SocketChannel.open( );
sc.connect (new InetSocketAddress ("somehost", someport));
ServerSocketChannel ssc = ServerSocketChannel.open( );
ssc.socket( ).bind (new InetSocketAddress (somelocalport));
2).FileChannel 不能直接创建,只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel( )方法来获取。
DatagramChannel dc = DatagramChannel.open( );
RandomAccessFile raf = new RandomAccessFile ("somefile", "r");
FileChannel fc = raf.getChannel( );
二.文件通道(FileChannel)
2.1 通道(channel)
1.FileChannel 是一个反映Java 虚拟机外部一个具体对象的抽象。
2.文件通道总是阻塞式的,因此不能被置于非阻塞模式。
3.FileChannel 对象是线程安全的
- 多个进程可以在同一个实例上并发调用方法,而不会引起任何问题。
- 并非所有的操作都是多线程的(multithreaded),影响通道位置或者影响文件大小的操作都是单线程的(single-threaded)。
2.2 FileChannel 抽象接口
public abstract class FileChannel extends AbstractChannel implements ByteChannel, GatheringByteChannel, ScatteringByteChannel {
// This is a partial API listing
public abstract long position( )
public abstract void position (long newPosition)
public abstract int read (ByteBuffer dst)
public abstract int read (ByteBuffer dst, long position)
public abstract int write (ByteBuffer src)
public abstract int write (ByteBuffer src, long position)
public abstract long size( )
public abstract void truncate (long size)
public abstract void force (boolean metaData)
}
1.file position:position 决定文件中哪一处的数据接下来被读或者写。
2.FileChannel 位置 (position) 是从底层的文件描述符获得的,一个对象对该position 的更新可以被另一个对象看到。
网友评论