nio的一些特性

注:更多特性详见workspace中nio项目

一.缓冲区(Buffer):在java NIO中负责数据的存取。缓冲区就是数组,用于存储不同类型的数据
根据数据类型的不同,提供相应的缓冲区(boolean 除外)
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区

二.缓冲区存取数据的两个核心方法
put():存入数据
get():取出数据

三.缓冲区的四个核心属性
capacity:容量,缓冲区能够存储的数据大小,一旦声明不能改变
limit:界限,缓冲区中可以操作数据的大小
position:位置,缓冲区中正在操作的数据位置
mark:标记,用来记录当前position的位置,可以通过reset()使position恢复到mark记录的位置
0 <= mark <= position <= limit <=capacity

四.直接缓冲区和非直接缓冲区
非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM的内存中
直接缓冲区:allocateDirect()方法分配缓冲区,将缓冲区建立在操作系统的物理内存中,这是可以提高效率的
注:只有ByteBuffer支持直接缓冲区的方式,其他都不行


一.通道(Channel):用于源节点和目标节点的连接。在java NIO中负责缓冲区的数据传输。Channel本身不存储数据,
因此需要配合缓冲区进行传输

二.通道的主要实现类
    FileChannel
    SocketChannel
    ServerSocketChannel
    DatagramChannel

三.获取通道
1.java针对支持通道的类提供了getChannel()方法
    本地IO:
    FileInputStream/FileOutputStream
    RandomAccessFile

    网络IO:
    Socket
    ServerSocket
    DatagramSocket

2.在java1.7中NIO.2针对各个通道提供了静态发放open()
3.在java1.7中NIO.2的Files工具类的newByteChannel()

四.通道间的数据传输,使用这两个方法也是属于直接缓冲区的方法
transferFrom()
transferTo()

五.分散(Scatter)和聚集(Gather)
分散读取(Scattering Reads):将通道中的数据分散到多个缓冲区中
聚集写入(Gathering Writes):将多个缓冲区的数据聚集到通道中
注:这个是会按照顺来读取或写入,跟以前的相比就是原来是操作缓冲区,现在是操作缓冲区数组

六、字符集:Charset
编码:字符串 -> 字节数组
解码:字节数组  -> 字符串


一、使用 NIO 完成网络通信的三个核心:
1. 通道(Channel):负责连接
      java.nio.channels.Channel 接口:
         |--SelectableChannel
            |--SocketChannel
            |--ServerSocketChannel
            |--DatagramChannel

            |--Pipe.SinkChannel
            |--Pipe.SourceChannel

2. 缓冲区(Buffer):负责数据的存取

3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况


















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FileChannel是Java NIO中的一个类,它用于从文件中读取数据或向文件写入数据。FileChannel是非阻塞的,这意味着当调用FileChannel的读写方法时,线程不会被阻塞。相反,它会立即返回一个Future对象,你可以在后面调用这个对象的get()方法来获取实际读写操作的结果。 例如,你可以使用FileChannel来读取文件的内容,代码如下: ``` Path path = Paths.get("file.txt"); FileChannel channel = FileChannel.open(path, StandardOpenOption.READ); ByteBuffer buffer = ByteBuffer.allocate(1024); Future<Integer> result = channel.read(buffer, 0); int bytesRead = result.get(); ``` 你也可以使用FileChannel向文件写入数据,代码如下: ``` Path path = Paths.get("file.txt"); FileChannel channel = FileChannel.open(path, StandardOpenOption.WRITE); ByteBuffer buffer = ByteBuffer.wrap("Hello, World!".getBytes()); Future<Integer> result = channel.write(buffer, 0); int bytesWritten = result.get(); ``` 需要注意的是,FileChannel只能用于文件,如果你想要从网络或其他非文件源读取数据,你需要使用Java NIO中的其他类,例如SocketChannel或ServerSocketChannel。 ### 回答2: FileChannel是Java NIO中表示文件的通道。它是对文件进行读取和写入的通道,类似于传统IO中的InputStream和OutputStream。 通过FileChannel,我们可以使用缓冲区(Buffer)来读取和写入文件的数据。我们可以创建一个FileChannel对象来操作文件,这可以通过FileInputStream、FileOutputStream或RandomAccessFile等类的getChannel()方法来获取。 FileChannel支持阻塞式和非阻塞式的IO操作。我们可以使用read()方法从通道中读取数据,使用write()方法将数据写入通道。还可以使用transferTo()和transferFrom()方法在通道之间直接传输数据,避免了传统IO中需要使用缓冲区来进行数据复制的过程。 FileChannel还提供了其他的一些有用的方法,比如position()和position(long newPosition)用于获取和设置文件指针的位置;size()方法用于获取文件的大小;truncate(long size)用于截断文件等。 在操作文件时,通常需要首先打开一个FileChannel,然后创建一个缓冲区来进行数据的读取和写入。一般的操作流程是,首先从通道中读取数据到缓冲区中,然后进行相应的处理,最后将数据写入到文件中。 总之,FileChannel是Java NIO中用于操作文件的通道,它提供了更加灵活和高效的文件操作方式。通过FileChannel,我们可以使用缓冲区来读取和写入文件的数据,还可以直接在通道之间传输数据。同时,FileChannel还提供了一些方便的方法来操作文件的指针和大小等属性。使用FileChannel可以提高文件IO操作的效率和灵活性。 ### 回答3: NIO(New Input/Output)中的FileChannel是用于文件的通道类,它提供了一种在文件中读取、写入和操作数据的方式。 FileChannel可以通过Java程序对文件进行各种操作,包括读取文件内容、写入数据到文件,以及对文件指定位置进行读写操作等。 FileChannel的一些主要功能包括: 1. 读取文件内容:可以使用FileChannel的read()方法来读取文件中的数据,可以一次读取一定数量的字节,也可以读取整个文件的内容。 2. 写入文件内容:使用FileChannel的write()方法,可以将数据写入文件,可以一次写入一定数量的字节,也可以覆盖原有内容或者追加到文件末尾。 3. 文件位置操作:FileChannel的position()方法可以获取当前位置,也可以通过position(long newPosition)方法设置新的位置。可以根据实际需要在文件中进行定位,进行读写操作。 4. 通道之间的传输:FileChannel提供了transferFrom()和transferTo()方法用于直接在通道之间传输数据,可以高效地传输大量数据。 5. 文件的锁定:可以使用FileChannel的lock()和tryLock()方法对文件进行锁定,确保多个线程或进程之间对同一个文件的读写操作的互斥性。 总之,FileChannel是NIO中用于处理文件的通道,它提供了一系列的API方法,可以方便地读取、写入和操作文件中的数据,同时还提供了一些文件的操作特性,如文件位置操作、通道之间的数据传输以及文件的锁定等。使用FileChannel可以更灵活地对文件进行操作,并且相比于传统的IO操作,它在性能上可以得到一定的提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值