- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章一篇学会 Java NIO Channel 的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Java NIO 中的 Channel 分类:
FileChannel: 主要用于文件的读写,可以从磁盘上读取文件,也可以向磁盘上写入文件.
SocketChannel:用于 Socket 的 TCP 连接的数据读写,既可以从 Channel 读数据,也可以向 Channle 中写入数据 。
ServerSocketChannel:通过 ServerSocketChannel 可以监听 TCP 连接,服务端监听到连接之后,会为每个请求创建一个 SocketChannel 。
DatagramChannel:用于 UDP 协议的数据读写 。
接下来就分别介绍一下.
FileChannel 。
主要用于操作文件,废话不多说,直接看例子.
准备文件 test-file.txt ,内容 shDEQuanZhanBiJi 。
test-file.txt 文件 。
用于从 FileChannel 中读取数据,例如将指定文件输入到 FileChannel 中,我们就能获取到文件的内容,接下来编写 FileChannel 的 输入流 核心代码:
这里面的 ByteBuffer 是 channel 进行读、写数据的中间媒介。要从 channel 中读取数据(也就是上面这个例子),需要先将数据读到 ByteBuffer 中;同理,要想向 channel 中写入数据,也需要先将数据写入 ByteBuffer(下面讲输出流的时候会讲).
对 ByteBuffer 不熟悉的可以先看看我之前写的《玩转 ByteBuffer》,printBuffer 的代码里面也有 。
顾名思义,是 FileChannel 要向外输出数据,例如将数据写入到磁盘文件上,接下来通过例子看看效果:
相应的注释都已经贴在对应的代码上了,细节在此不再赘述。唯一需要关注的是,调用 write 写文件到磁盘上时,也是先传入的 ByteBuffer.
好了,当你运行完代码你会发现,虽然文件是生成的了,但是里面却是空白的...这其实就涉及到对 ByteBuffer 的熟悉程度了,算是埋的一个坑.
如果不知道为啥文件是空的,可以去看看上面讲 ByteBuffer 的文章,接下来是解答.
这是因为我们创建一个 ByteBuffer 的时候默认是处于写模式的,此时如果去通过 position 和 limit 去读取数据是读不到的。所以在调用 write 之前,我们需要先将 ByteBuffer 切换到读模式,完整代码如下:
可以看到,文件生成了,内容也有了:
但是呢,上面将的两种要么只能写,要么只能读。例如 FileInputStream 如果你硬要往 channel 里怼数据,程序最后会抛出 NonWritableChannelException 异常,告诉你这玩意儿写不了.
那有没有一个既能写,又能读还能唱跳的实现呢?当然有,那就是 RandomAccessFile.
这里提一嘴,调用完 write 并不是立即就写入磁盘,也可以在操作系统的缓存里。如果需要立即刷盘,则调用 channel.force(true); 即可.
怎么用的呢?其实跟之前两个差不多:
运行之后的效果就是,会生成一个名为 target-file.txt 的文件,内容就是 shDEQuanZhanBiJi。并且控制台会将之前写入 channel 的 shDEQuanZhanBiJi 打印出来.
老规矩,细节都在注释中。值得注意的是 new RandomAccessFile(targetFileName, "rw"); 里的 rw 。注释里也写了,代表赋予可读、可写的权限.
再值得注意的是,你不能说把 rw 改成 w.
不能这么玩,因为它就是一个单纯的字符串匹配,可供选择的就这么些:
mode 类型 。
rws 和 rwd 功能和 rw 大致是相同的,可读、可写。唯一区别是他们会将每次改动强制刷到磁盘,并且 rws 会将操作系统对该文件的元数据也一起刷盘,体现就是文件的更新时间会更新,而 rwd 不会将文件的元数据刷盘 。
由于这俩一个负责连接传输,另一个负责连接的监听,所以就放在一起来讲了。这一小节我们大概要做这件事:
客户端发送文件到服务器 。
但是为了能让大家直接运行起来,客户端这侧就不从磁盘文件读取了,直接用 ByteBuffer。大家可以运行起来之后,自己尝试从磁盘上去加载。还是先看代码,首先是服务器的:
这里我们使用的是 Java NIO 中默认的阻塞模式,仅仅作为一个掩饰,如果想要 ServerSocketChannel 进入非阻塞模式,可在 open 之后,调用
由于我们这里是阻塞模式,所以在代码运行到 serverSocketChannel.accept(); 时,会陷入阻塞状态,直到有客户端过来建立连接。同理,read 方法也是阻塞的,如果客户端一直没有写入数据,那么服务器就会一直阻塞在 read .
直接先给代码:
先启动服务器,再启动客户端。可以看到服务器侧的控制台有如下的输出:
这个就比较简单,首先是客户端的代码:
然后是服务器:
原文链接:https://mp.weixin.qq.com/s/ythx3hMMHBxpD1BiJr_zXA 。
最后此篇关于一篇学会 Java NIO Channel 的使用的文章就讲到这里了,如果你想了解更多关于一篇学会 Java NIO Channel 的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!