词条 | Non-blocking I/O (Java) |
释义 |
Features and organizationThe APIs of NIO were designed to provide access to the low-level I/O operations of modern operating systems. Although the APIs are themselves relatively high-level, the intent is to facilitate an implementation that can directly use the most efficient operations of the underlying platform. The Java NIO APIs are provided in the {{Javadoc:SE|package=java.nio|java/nio}} package and its subpackages. The documentation by Oracle identifies these features.
NIO buffersNIO data transfer is based on buffers ({{Javadoc:SE|package=java.nio|java/nio|Buffer}} and related classes). These classes represent a contiguous extent of memory, together with a small number of data transfer operations. Although theoretically these are general-purpose data structures, the implementation may select memory for alignment or paging characteristics, which are not otherwise accessible in Java. Typically, this would be used to allow the buffer contents to occupy the same physical memory used by the underlying operating system for its native I/O operations, thus allowing the most direct transfer mechanism, and eliminating the need for any additional copying. In most operating systems, provided the particular area of memory has the right properties, transfer can take place without using the CPU at all. The NIO buffer is intentionally limited in features in order to support these goals. There are buffer classes for all of Java's primitive types except UsageNIO buffers maintain several pointers that dictate the function of their accessor methods. The NIO buffer implementation contains a rich set of methods for modifying these pointers:
ChannelsChannels (classes implementing the interface {{Javadoc:SE|package=java.nio.channels|java/nio/channels|Channel}}) are designed to provide for bulk data transfers to and from NIO buffers. This is a low-level data transfer mechanism that exists in parallel with the classes of the higher-level I/O library (packages {{Javadoc:SE|package=java.io|java/io}} and {{Javadoc:SE|package=java.net|java/net}}). A channel implementation can be obtained from a high-level data transfer class such as {{Javadoc:SE|package=java.io|java/io|File}}, {{Javadoc:SE|package=java.net|java/net|ServerSocket}}, or {{Javadoc:SE|package=java.net|java/net|Socket}}, and vice versa. Channels are analogous to "file descriptors" found in Unix-like operating systems. File channels ({{Javadoc:SE|package=java.nio.channels|java/nio/channels|FileChannel}}) can use arbitrary buffers but can also establish a buffer directly mapped to file contents using memory-mapped file. They can also interact with file system locks. Similarly, socket channels ({{Javadoc:SE|package=java.nio.channels|java/nio/channels|SocketChannel}} and {{Javadoc:SE|package=java.nio.channels|java/nio/channels|ServerSocketChannel}}) allow for data transfer between sockets and NIO buffers.
SelectorsA selector ({{Javadoc:SE|package=java.nio.channels|java/nio/channels|Selector}} and subclasses) provides a mechanism for waiting on channels and recognizing when one or more become available for data transfer. When a number of channels are registered with the selector, it enables blocking of the program flow until at least one channel is ready for use, or until an interruption condition occurs. Although this multiplexing behavior could be implemented with threads, the selector can provide a significantly more efficient implementation using lower-level operating system constructs. A POSIX-compliant operating system, for example, would have direct representations of these concepts, select(). A notable application of this design would be the common paradigm in server software which involves simultaneously waiting for responses on a number of sessions. Character setsIn Java, a character set is a mapping between Unicode characters (or a subset of them) and bytes. The {{Javadoc:SE|package=java.nio.charset|java/nio/charset}} package of NIO provides facilities for identifying character sets and providing encoding and decoding algorithms for new mappings. ReceptionIt is unexpected that a Channel associated with a Java IO RandomAccess file closes the file descriptor on an interrupt, whereas RandomAccessFiles own read method does not do this. [4] JDK 7 and NIO.2{{Anchor|NIO.2}}{{Expand section|date=December 2009}}JDK 7 includes a {{Javadoc:SE|package=java.nio.file|java/nio/file}} package which, with the {{Javadoc:SE|java/nio/file|Path}} class (also new to JDK 7), among other features, provides extended capabilities for filesystem tasks, e.g. can work with symbolic/hard links and dump big directory listings into buffers more quickly than the old File class does. The {{Javadoc:SE|package=java.nio.file|java/nio/file}} package and its related package, {{Javadoc:SE|package=java.nio.file.attribute|java/nio/file/attribute}}, provide comprehensive support for file I/O and for accessing the file system. A zip file system provider is also available in JDK 7. References1. ^{{cite web|url=https://docs.oracle.com/javase/8/docs/technotes/guides/io/enhancements.html|website=Oracle Java Documentation|accessdate=8 June 2017|title=Enhancements in Java I/O}} 2. ^{{cite web|url=http://www.jcp.org/en/jsr/detail?id=51|title=JSR 51: New I/O APIs for the JavaTM Platform|accessdate=2009-05-23|work=The Java Community Process(SM) Program - JSRs: Java Specification Requests}} 3. ^"This JSR will be delivered as part of Java SE 7 "Dolphin"."{{cite web|url=http://www.jcp.org/en/jsr/detail?id=203|title=JSR 203: More New I/O APIs for the JavaTM Platform ("NIO.2")|date=2006-01-30|accessdate=2009-05-23|work=The Java Community Process(SM) Program - JSRs: Java Specification Requests}} 4. ^Don't Assume You Know What's Best, Shawn Pearce, author of Gerrit (Software), 2010-05-14. External links{{Portal|Java (programming language)}}
2 : Java (programming language)|Java specification requests |
随便看 |
开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。