java nio 方面的,我不明白while(true)表示啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java nio 方面的,我不明白while(true)表示啥?相关的知识,希望对你有一定的参考价值。

while(true),就是始终都会循环执行里面的内容,除非遇到跳出。里面if(r==-1)break;,就是跳出while循环,是跳出循环,不是跳出判断。 参考技术A while
(true)
表示条件永远为真,这里要结束这个循环是靠if
(r
==
-1)

break;
结束的,意思是当读取完
C:\\copy.sql中的数据时就结束这个循环。
参考技术B 你好!
int
r
=
fcin.read(buffer);
if
(r
==
-1)

从fcin中往buffer里读数据,当返回值r为-1时,代表fcin中已经读到结束或尾部,不能读出。
返回值r为0或正数时,代表实际读出字节的数量。
如果对你有帮助,望采纳。

Java:NIO 和 NIO.2 到底有啥区别?

【中文标题】Java:NIO 和 NIO.2 到底有啥区别?【英文标题】:Java: what exactly is the difference between NIO and NIO.2?Java:NIO 和 NIO.2 到底有什么区别? 【发布时间】:2014-10-21 15:49:10 【问题描述】:

我不太明白它们之间有什么不同,所以我对这两个包有一些疑问。

在 Google 上浏览了一下之后,似乎 Oracle 决定使用更新和增强的 NIO.2 软件包更新 NIO 软件包,作为 JDK7 版本的一部分。

    NIO 包的性能与NIO.2 包相比如何? 从NIONIO.2 有哪些重大变化? (例如新方法、新功能) 为什么必须更新原来的NIO 包? 现在NIO.2 只是NIO 包的同义词吗?

我并不是想在我的代码中使用 legacy 包,我只是对此很好奇。请告诉我他们的区别?

【问题讨论】:

NIO2 引入了异步 I/O 和 java.nio.files 包。 是这样吗?我的印象是 NIO.2 是一个巨大的东西。 首先他们有 IO。然后他们介绍了“新IO”。然后他们想引入更多功能,所以他们巧妙地将其命名为“New IO 2”。 谢谢,我想通了。那么这是否意味着“New IO 2”在各方面都优于其他两个?我正在阅读“The Java Tutorial”这本书,它讲授了 NIO.2,但它也有一个关于 IO 的部分。 @JohnHuynh 不,这意味着它引入了新功能。如果您不需要它们,请不要使用它们。 【参考方案1】:

Java 最初是通过在 java.io 包中提供 File 类来访问文件系统而开始的。该对象代表一个文件/目录,并允许您执行一些操作,例如检查文件/目录是否存在、获取属性并删除它。不过,它也有一些缺点。仅举几例:

File 类缺少一些重要的功能,例如复制方法。 它还定义了许多返回boolean 的方法。可以想象,如果发生错误,false 会被返回,而不是抛出异常。开发人员确实无法知道失败的原因。 未提供对符号链接支持的良好处理。 提供了一组有限的文件属性。

为了克服这些问题,java 4 中引入了 java.nio 包。主要特点是:

通道和选择器:通道是对较低级别文件系统功能的抽象,例如内存映射文件。 缓冲区:所有原始类的缓冲(布尔值除外)。 字符集:用于映射字节和 Unicode 符号的字符集 (java.nio.charset)、编码器和解码器

在 java 7 中引入了 java.nio.file 包,为处理符号链接、文件属性访问提供了更好的支持,并特别支持通过 Path、Paths 和 Files 等类扩展文件系统。您可能想查看java.nio.file package description 以获取更多详细信息。

考虑到这一点:

从 NIO 到 NIO.2 有哪些重大变化? (例如新方法, 功能)?

它们有不同的用途。要指出重大变化,您可能需要查看全新软件包 java.nio.file

为什么要更新原来的 NIO 包?

它没有。引入而不是更新了一个新包。

现在 NIO.2 只是 NIO 包的代名词吗? NIO包的性能与NIO.2包相比如何?

不,它们不是同义词。比较它们之间的性能也没有多大意义,因为它们用于不同的目的。 NIO 是一种更抽象的低级数据 I/O,而 NIO2 则专注于文件管理。

希望这会有所帮助。

[参考书目:Oracle Certified Professional Java SE7 - 全面的 OCJP7 认证指南, S.G.Ganesh 和 Tushar Sharma - 第 9 章]

【讨论】:

【参考方案2】:

NIO.2 引入asynchronous i/o

异步 ​​I/O 是一种 NIO 不支持的非阻塞 I/O 方法。

NIO:选择器/反应器模式

NIO.2:完成处理程序/proactor pattern

因此,当在 Windows 上时,NIO.2 uses I/O Completion Ports,应该会提高性能。除了,没有人知道,因为没有人在服务器端使用 Windows,如果他们这样做,他们可能这样做是因为他们在 .net 上投入了大量资金,因此很可能不会考虑使用 Java。

【讨论】:

永远不要说永远。有许多基于 Windows 的服务器正在使用中,尤其是在预计的工作负载不那么高的情况下。 reactor vs proactor 是我最注意到的 我的公司有很多 Windows 服务器,这是一家领先的金融机构,我们主要使用 Java。【参考方案3】:

我的看法:

短版

它是 java.nio.file 包的添加,它具有高度增强的高级文件和文件系统功能。 从网络套接字或低级文件访问的角度来看,NIO == NIO.2 具有一些便利性改进。

加长版

Java IO

包裹:java.io 旧的阻塞 I/O API

Java NIO

在 Java 1.4 中添加了新的非阻塞 API。 包:java.nio Java 非阻塞 IO。 SelectorSelectorKeyChannel 等类。 在我看来,NIO 是网络 I/O 的一大步(SelectorSelectorKeySocketChannelServerSocketChannelBuffer),对于文件 I/O(FileChannel 和仅限Buffer,包括内存映射文件)。 这是一个相当低级的 API,适用于网络和文件部分。

Java NIO.2

在 Java 7 中添加。它主要是关于添加大大改进的文件和文件系统操作和寻址 API。新的文件和文件系统相关的API是比较高级的。

包:java.nio.file 和父级java.nio 的一些补充。 此添加用于文件 I/O,仅对网络 I/O 或低级文件 API 进行了少量添加。

最值得注意的低级、非必要文件相关的 API 添加是 AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它们为某些方法添加了回调变体。的异步版本主要是为了方便添加;此类映射接口甚至可以在以前被破解,但现在它们在 JRE 中开箱即用。

新的文件 API 带来了很多好东西——更有用的文件系统寻址,使用自定义文件系统提供程序,大大改进了 ZIP 文件操作,特殊文件属性访问,许多方便的方法,比如用一个命令读取整个文件,用一个命令等复制文件。但它都是文件/文件系统相关的,而且都是相当高级的。

重申我上面已经说过的,从网络套接字或低级文件访问的角度来看,NIO == NIO.2

相关链接

Java NIO - non-blocking channels vs AsynchronousChannels 误导性命名的问题; Channel 和 Socket 的同步和异步变体确实是非阻塞的。 https://docs.oracle.com/javase/7/docs/technotes/guides/io/enhancements.html#jdk7 – 仅提及 NIO.2 部分下与文件相关的更改。

【讨论】:

以上是关于java nio 方面的,我不明白while(true)表示啥?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA NIO原理剖析

java:while循环-在进入花括号之间的语句之前使用分号语句?

java.nio.channels.ServerSocketChannel未正确关闭

Java NIO- Selector 使用示例

Java之NIO

Java NIO 实现文件复制