平博百家乐博彩平台提现_一篇学会 Java NIO Channel 的使用
发布日期:2023-10-30 01:31    点击次数:177

平博百家乐博彩平台提现_一篇学会 Java NIO Channel 的使用

平博百家乐博彩平台提现_

亚星捕鱼

本文转载自微信公众号「SH的全栈条记」,作家SH的全栈条记。转载本文请干系SH的全栈条记公众号。

Java NIO 中的 Channel 分类:

FileChannel SocketChannel ServerSocketChannel DatagramChannel

channel 分类

FileChannel: 主要用于文献的读写,不错从磁盘上读取文献,也不错向磁盘上写入文献。

SocketChannel:用于 Socket 的 TCP 研究的数据读写,既不错从 Channel 读数据,也不错向 Channle 中写入数据

ServerSocketChannel:通过 ServerSocketChannel 不错监听 TCP 研究,奇迹端监听到研究之后,会为每个申请创建一个 SocketChannel

DatagramChannel:用于 UDP 公约的数据读写

接下来就分手先容一下。

FileChannel

主要用于操作文献,谣言未几说,顺利看例子。

准备文献 test-file.txt ,推行 shDEQuanZhanBiJi

test-file.txt 文献

输入 FileInputStream

用于从 FileChannel 中读取数据,举例将指定文献输入到 FileChannel 中,咱们就能得到到文献的推行,接下来编写 FileChannel 的 输入流 中枢代码:

皇冠客服飞机:@seo3687
public 亚星捕鱼static void main(String[] args) throws IOException {   // 创建一个输入流   FileInputStream fileInputStream = new FileInputStream("test-file.txt");   // 通过输入流得到到 channel   FileChannel fileChannel = fileInputStream.getChannel();    // 准备好 ByteBuffer   ByteBuffer buffer = ByteBuffer.allocate(16);   // 将 输入流 的 channel 的数据读入 buffer 中   fileChannel.read(buffer);    // 肤浅打印 buffer 的推行   printBuffer(buffer); // shDEQuanZhanBiJi } 

这内部的 ByteBuffer 是 channel 进行读、写数据的中间弁言。要从 channel 中读取数据(也即是上头这个例子),需要先将数据读到 ByteBuffer 中;同理,要想向 channel 中写入数据,也需要先将数据写入 ByteBuffer(底下讲输出流的本事会讲)。

平博百家乐

对 ByteBuffer 不练习的不错先望望我之前写的《玩转 ByteBuffer》,printBuffer 的代码内部也有

输出 FileOutputStream

顾名念念义,是 FileChannel 要向外输出数据,举例将数据写入到磁盘文献上,接下来通过例子望望效用:

public static void main(String[] args) throws IOException {   // 指定需要生成的文献称呼   String generateFileName = "generate-file.txt";   // 创建一个输出流   FileOutputStream fileOutputStream = new FileOutputStream(generateFileName);   // 通过输出流得到到 channel   FileChannel fileChannel = fileOutputStream.getChannel();    // 准备好 ByteBuffer, 并向内部写入数据   ByteBuffer buffer = ByteBuffer.allocate(16);   buffer.put("shDEQuanZhanBiJi".getBytes(StandardCharsets.UTF_8));    // 将 输入流 的 channel 的数据读入 buffer 中   fileChannel.write(buffer);   fileChannel.close(); } 

相应的注目齐还是贴在对应的代码上了,细节在此不再赘述。唯独需要怜惜的是,调用 write 写文献到磁盘上时,亦然先传入的 ByteBuffer。

皇冠分红

好了,当你运行完代码你会发现,诚然文献是生成的了,然则内部却是空缺的...这其实就波及到对 ByteBuffer 的练习进度了,算是埋的一个坑。

如若不知说念为啥文献是空的,不错去望望上头讲 ByteBuffer 的著述,接下来是解答。

皇冠完整比分网

这是因为咱们创建一个 ByteBuffer 的本事默许是处于写形态的,此时如若去通过 position 和 limit 去读取数据是读不到的。是以在调用 write 之前,咱们需要先将 ByteBuffer 切换到读形态,圆善代码如下:

public static void main(String[] args) throws IOException {   // 指定需要生成的文献称呼   String generateFileName = "generate-file.txt";   // 创建一个输出流   FileOutputStream fileOutputStream = new FileOutputStream(generateFileName);   // 通过输出流得到到 channel   FileChannel fileChannel = fileOutputStream.getChannel();    // 准备好 ByteBuffer, 并向内部写入数据   ByteBuffer buffer = ByteBuffer.allocate(16);   buffer.put("shDEQuanZhanBiJi".getBytes(StandardCharsets.UTF_8));    // 将 ByteBuffer 切换到读形态   buffer.flip();   // 将 输入流 的 channel 的数据读入 buffer 中   fileChannel.write(buffer);      fileChannel.close(); } 

不错看到,文献生成了,推行也有了:

刺激博彩公司大全188金宝博登录

皇冠体育hg86a

然则呢,上头将的两种要么只可写,要么只可读。举例 FileInputStream 如若你硬要往 channel 里怼数据,法子终末会抛出 NonWritableChannelException 额外,告诉你这玩意儿写不了。

那有莫得一个既能写,又能读还能唱跳的完了呢?天然有,欧博手机app那即是 RandomAccessFile。

        据《罗马体育报》报道,罗马准备放弃今夏亚洲行,再次前往葡萄牙进行季前集训。

这里提一嘴,调用完 write 并不是立即就写入磁盘,也不错在操作系统的缓存里。如若需要立即刷盘,则调用 channel.force(true); 即可。

RandomAccessFile

若何用的呢?其实跟之前两个差未几:

public static void main(String[] args) throws IOException {   // 指定需要生成的文献称呼   String targetFileName = "target-file.txt";   // 创建 RandomAccessFile, 赋予可读(r)、可写(w)的权限   RandomAccessFile accessFile = new RandomAccessFile(targetFileName, "rw");   FileChannel fileChannel = accessFile.getChannel();    // 创建 ByteBuffer 并写入数据   ByteBuffer buffer = ByteBuffer.allocate(16);   buffer.put("shDEQuanZhanBiJi".getBytes(StandardCharsets.UTF_8));   // 切换到 buffer 的读形态   buffer.flip();   // 调用 write 将 buffer 的数据写入到 channel, channel 再写数据到磁盘文献   fileChannel.write(buffer);    // 相配于清空 buffer   buffer.clear();   // 将之前写入到 channel 的数据再读入到 buffer   fileChannel.read(buffer);    // 打印 buffer 中的推行   printBuffer(buffer);    fileChannel.close(); } 

运行之后的效用即是,会生成一个名为 target-file.txt 的文献,推行即是 shDEQuanZhanBiJi。而况撤销台会将之前写入 channel 的 shDEQuanZhanBiJi 打印出来。

老规定,细节齐在注目中。值得留神的是 new RandomAccessFile(targetFileName, "rw"); 里的 rw 。注目里也写了,代表赋予可读、可写的权限。

再值得留神的是,你不可说把 rw 改成 w。

不可这样玩,因为它即是一个单纯的字符串匹配,可供选拔的就这样些:

mode 类型

据媒体报道,某体育明星曾一次博彩活动中获得巨额奖金,并且传出某博彩公司有着不同寻常关系。 不错看到,r 必不可少...: r 只可读 rw 既能读,也能写

rws 和 rwd 功能和 rw 简略是换取的,可读、可写。唯独区别是他们会将每次篡改强制刷到磁盘,而况 rws 会将操作系统对该文献的元数据也一说念刷盘,体现即是文献的更新本事会更新,而 rwd 不会将文献的元数据刷盘

两个 SocketChannel 

由于这俩一个精采研究传输,另一个精采研究的监听,是以就放在一说念来讲了。这一末节咱们大纲领作念这件事:

客户端发送文献到奇迹器

然则为了能让世界顺利运行起来,客户端这侧就不从磁盘文献读取了,顺利用 ByteBuffer。世界不错运行起来之后,我方尝试从磁盘上去加载。如故先看代码,率先是奇迹器的:

ServerSocketChannel
public static void main(String[] args) throws IOException {   // 大开一个 ServerSocketChannel   ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();   // 绑定 8080 端口   serverSocketChannel.bind(new InetSocketAddress(8080));    // 开动招揽客户端研究   SocketChannel socketChannel = serverSocketChannel.accept();   // 得到研究顺利   System.out.printf("socketChannel %s connected\n", socketChannel);   // 准备 ByteBuffer 以从 socketChannel 中读取数据   ByteBuffer buffer = ByteBuffer.allocate(16);    // 开动读取数据   System.out.println("before read");   int read = socketChannel.read(buffer);   System.out.printf("read complete, read bytes length: %s \n", read);    printBuffer(buffer); } 

这里咱们使用的是 Java NIO 中默许的封锁形态,只是算作一个遏制,如若想要 ServerSocketChannel 插足非封锁形态,可在 open 之后,调用:

serverSocketChannel.configureBlocking(false); 

由于咱们这里是封锁形态,是以在代码运行到 serverSocketChannel.accept(); 时,会堕入封锁景象,直到有客户端过来开拓研究。同理,read 顺次亦然封锁的,如若客户端一直莫得写入数据,那么奇迹器就会一直封锁在 read 。

SocketChannel

顺利先给代码:

public static void main(String[] args) throws IOException {   // 大开一个 SocketChannel   SocketChannel socketChannel = SocketChannel.open();   // 研究到 localhost 的 8080 端口   socketChannel.connect(new InetSocketAddress("localhost", 8080));    // 准备 ByteBuffer   ByteBuffer buffer = ByteBuffer.allocate(16);   buffer.put(Charset.defaultCharset().encode("test"));    // 将 buffer 切换成读形态 & 向 channel 中写入数据   buffer.flip();   socketChannel.write(buffer); } 

先启动奇迹器,再启动客户端。不错看到奇迹器侧的撤销台有如下的输出:

博彩平台提现博乐app网址
socketChannel java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:64373] connected before read read complete, read bytes length: 4  BUFFER VALUE: test 
Datagram

这个就比拟肤浅,率先是客户端的代码:

public static void main(String[] args) throws IOException {   DatagramChannel datagramChannel = DatagramChannel.open();    // 构建 buffer 数据   ByteBuffer buffer = ByteBuffer.allocate(16);   buffer.put(Charset.defaultCharset().encode("test"));    // 切换到 buffer 的读形态   buffer.flip();   datagramChannel.send(buffer, new InetSocketAddress("localhost", 8080)); } 

然后是奇迹器:

public static void main(String[] args) throws IOException {   DatagramChannel datagramChannel = DatagramChannel.open();   datagramChannel.bind(new InetSocketAddress(8080));    ByteBuffer buffer = ByteBuffer.allocate(16);   datagramChannel.receive(buffer);    printBuffer(buffer); }