java.nio-学习

java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。
java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。
java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。
java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。
java.nio.charset.spi java.nio.charset 包的服务提供者类。


一:java.nio类




1、Buffer 
一个用于特定基本类型数据的容器。
缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置:
缓冲区的容量 是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。
缓冲区的限制 是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。
缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。
对于每个非 boolean 基本类型,此类都有一个子类与之对应。


2、ByteBuffer
extends Buffer
字节缓冲区。
此类针对字节缓冲区定义了以下六类操作:
读写单个字节的绝对和相对 get 和 put 方法;
将此缓冲区的连续字节序列传输到数组中的相对批量 get 方法;
将 byte 数组或其他字节缓冲区中的连续字节序列传输到此缓冲区的相对批量 put 方法;
读写其他基本类型值,并按照特定的字节顺序在字节序列之间转换这些值的绝对和相对 get 和 put 方法;
创建视图缓冲区 的方法,这些方法允许将字节缓冲区视为包含其他基本类型值的缓冲区;
对字节缓冲区进行 compacting、duplicating 和 slicing 的方法。
字节缓冲区可以通过 allocation 方法创建,此方法为该缓冲区的内容分配空间,或通过 wrapping 方法将现有的 byte 数组包装到缓冲区中来创建。


3、MappedByteBuffer
extends ByteBuffer
直接字节缓冲区,其内容是文件的内存映射区域。
映射的字节缓冲区是通过 FileChannel.map 方法创建的。此类用特定于内存映射文件区域的操作扩展 ByteBuffer 类。
映射的字节缓冲区和它所表示的文件映射关系在该缓冲区本身成为垃圾回收缓冲区之前一直保持有效。
映射的字节缓冲区的内容可以随时更改,例如,在此程序或另一个程序更改了对应的映射文件区域的内容的情况下。这些更改是否发生(以及何时发生)与操作系统无关,因此是未指定的。
全部或部分映射的字节缓冲区可能随时成为不可访问的,例如,如果我们截取映射的文件。试图访问映射的字节缓冲区的不可访问区域将不会更改缓冲区的内容,并导致在访问时或访问后的某个时刻抛出未指定的异常。因此强烈推荐采取适当的预防措施,以避免此程序或另一个同时运行的程序对映射的文件执行操作(读写文件内容除外)。
除此之外,映射的字节缓冲区的功能与普通的直接字节缓冲区完全相同。
 
4、CharBuffer
extends Buffer
字符缓冲区。
此类定义了字符缓冲区上的四类操作:
读写单个字符的绝对和相对 get 和 put 方法;
将此缓冲区中的连续字符序列传输到数组中的相对批量 get 方法;
将字符数组、字符串或其他字符缓冲区中的连续字符序列传输到此缓冲区的相对批量 put 方法;以及
字符缓冲区的 compacting、duplicating 和 slicing 方法。
字符缓冲区可以通过 allocation 方法创建,此方法通过 wrapping 将一个现有字符数组或字符串包装到缓冲区中来为缓冲区内容分配空间,或者通过创建现有字节缓冲区的视图来创建。
像字节缓冲区一样,字符缓冲区要么是直接的,要么是非直接的。通过此类的 wrap 方法创建的字符缓冲区将是非直接的。当且仅当字节缓冲区本身为直接时,作为字节缓冲区的视图创建的字符缓冲区才是直接的。通过调用 isDirect 方法可以确定字符缓冲区是否为直接的。
 
5、DoubleBuffer
extends Buffer
double 缓冲区。


6、FloatBuffer 
extends Buffer
float 缓冲区。


7、IntBuffer 
extends Buffer
int 缓冲区。


8、LongBuffer 
extends Buffer
long 缓冲区。 
 
9、ShortBuffer
extends Buffer
short 缓冲区。


10、ByteOrder
字节顺序的类型安全枚举。
BIG_ENDIAN 表示 big-endian 字节顺序的常量。按照此顺序,多字节值的字节顺序是从最高有效位到最低有效位的。
LITTLE_ENDIAN 表示 little-endian 字节顺序的常量。按照此顺序,多字节值的字节顺序是从最低有效位到最高有效位的。


二:java.nio.channels 接口





11、Channel 
用于 I/O 操作的连接。
通道表示到实体,如硬件设备、文件、网络套接字或可以执行一个或多个不同 I/O 操作(如读取或写入)的程序组件的开放的连接。
通道可处于打开或关闭状态。创建通道时它处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,试图对其调用 I/O 操作就会导致 ClosedChannelException 被抛出。通过调用通道的 isOpen 方法可测试通道是否处于打开状态。
正如扩展和实现此接口的各个接口和类规范中所描述的,一般情况下通道对于多线程的访问是安全的。


12、InterruptibleChannel
extends Channel
可被异步关闭和中断的通道。
当且仅当某个通道实现此接口时,该通道才支持异步关闭和中断。如有必要,可在运行时通过 instanceof 操作符进行测试。


13、ReadableByteChannel
extends Channel
可读取字节的通道。
在任意给定时刻,一个可读取通道上只能进行一个读取操作。如果某个线程在通道上发起读取操作,那么在第一个操作完成之前,将阻塞其他所有试图发起另一个读取操作的线程。其他种类的 I/O 操作是否继续与读取操作并发执行取决于该通道的类型。


14、ScatteringByteChannel
extends ReadableByteChannel
可将字节读入缓冲区序列的通道。
分散 读取操作可在单个调用中将一个字节序列读入一个或多个给定的缓冲区序列。分散读取通常在实现网络协议或文件格式时很有用,例如将数据分组放入段中(这些段由一个或多个长度固定的头,后跟长度可变的正文组成)。在 GatheringByteChannel 接口中定义了类似的集中 写入操作。


15、WritableByteChannel
extends Channel
可写入字节的通道。
在任意给定时刻,一个可写入通道上只能进行一个写入操作。如果某个线程在通道上发起写入操作,那么在第一个操作完成之前,将阻塞其他所有试图发起另一个写入操作的线程。其他种类的 I/O 操作是否继续与写入操作并发执行则取决于该通道的类型。


16、GatheringByteChannel
extends WritableByteChannel
可从缓冲区序列写入字节的通道。
集中 写入操作可在单个调用中写入来自一个或多个给定缓冲区序列的字节序列。集中写入通常在实现网络协议或文件格式时很有用,例如将数据分组放入段中(这些段由一个或多个长度固定的头,后跟长度可变的正文组成)。在 ScatteringByteChannel 接口中定义了类似的分散 读取操作。


17、ByteChannel
extends ReadableByteChannel, WritableByteChannel
可读取和写入字节的信道。此接口只是统一了 ReadableByteChannel 和 WritableByteChannel;它没有指定任何新操作。
 


三:java.nio.channels和java.nio.channels.spi 类





18、spi.AbstractInterruptibleChannel 
implements Channel, InterruptibleChannel
可中断通道的基本实现类。
此类封装了实现通道异步关闭和中断所需的低级别机制。在调用可能无限期阻塞的 I/O 操作之前和之后,具体的通道类必须分别调用 begin 和 end 方法。


19、FileChannel 
extends AbstractInterruptibleChannel
implements ByteChannel, GatheringByteChannel, ScatteringByteChannel
用于读取、写入、映射和操作文件的通道。
文件通道在其文件中有一个当前 position,可对其进行查询和修改。该文件本身包含一个可读写的长度可变的字节序列,并且可以查询该文件的当前大小。写入的字节超出文件的当前大小时,则增加文件的大小;截取 该文件时,则减小文件的大小。文件可能还有某个相关联的元数据,如访问权限、内容类型和最后的修改时间;此类未定义访问元数据的方法。
除了字节通道中常见的读取、写入和关闭操作外,此类还定义了下列特定于文件的操作:
以不影响通道当前位置的方式,对文件中绝对位置的字节进行读取或写入。
将文件中的某个区域直接映射到内存中;对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效。
强制对底层存储设备进行文件的更新,确保在系统崩溃时不丢失数据。
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中,反之亦然。
可以锁定某个文件区域,以阻止其他程序对其进行访问。


20、FileChannel.MapMode 
文件映射模式的类型安全的枚举。
PRIVATE 专用(写入时拷贝)映射模式。
READ_ONLY 只读映射模式。
READ_WRITE 读取/写入映射模式。


21、SelectableChannel
extends AbstractInterruptibleChannel
implements Channel
可通过 Selector 实现多路复用的通道。
为了与选择器一起使用,此类的实例必须首先通过 register 方法进行注册。此方法返回一个表示该通道已向选择器注册的新 SelectionKey 对象。
向选择器注册后,通道在注销 之前将保持注册状态。注销涉及释放选择器已分配给该通道的所有资源。
不能直接注销通道;相反,必须取消 表示通道注册的键。取消某个键要求在选择器的下一个选择操作期间注销通道。可通过调用某个键的 cancel 方法显式地取消该键。无论是通过调用通道的 close 方法,还是中断阻塞于该通道上 I/O 操作中的线程来关闭该通道,都会隐式地取消该通道的所有键。


22、spi.AbstractSelectableChannel 
extends SelectableChannel
可选择通道的基本实现类。
此类定义了处理通道注册、注销和关闭机制的各种方法。它会维持此通道的当前阻塞模式及其当前的选择键集。它执行实现 SelectableChannel 规范所需的所有同步。此类中所定义的抽象保护方法的实现不必与同一操作中使用的其他线程同步。


23、Pipe.SinkChannel 
extends AbstractSelectableChannel
implements WritableByteChannel, GatheringByteChannel
表示 Pipe 的可写入结尾的通道。


24、Pipe.SourceChannel
extends AbstractSelectableChannel
implements ReadableByteChannel, ScatteringByteChannel
表示 Pipe 的可读取结尾的通道。


25、Pipe 
实现单向管道传送的通道对。
管道由一对通道组成:一个可写入的 sink 通道和一个可读取的 source 通道。一旦将某些字节写入接收器通道,就可以按照与写入时完全相同的顺序从源通道中读取这些字节。
在另一个线程从管道中读取这些字节或先前已写入的字节之前,是否阻塞将该字节写入管道的线程是与系统相关的,因此是未指定的。很多管道实现都对接收器和源通道之间一定数量的字节进行缓冲,但是不应假定会进行这种缓冲。
 


26、DatagramChannel
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel
针对面向数据报套接字的可选择通道。
数据报通道不是网络数据报套接字的完整抽象。必须通过调用 socket 所获得的关联 DatagramSocket 对象来完成套接字选项的绑定和操作。不可能为任意的已有数据报套接字创建通道,也不可能指定与数据报通道关联的数据报套接字所使用的 DatagramSocketImpl 对象。
通过调用此类的 open 方法创建数据报通道。新创建的数据报通道已打开,但尚未连接。为了使用 send 和 receive 方法,无需连接数据报通道。但是如果为了避免作为每次发送和接收操作的一部分而执行的安全检查开销,也可以通过调用数据报通道的 connect 方法来建立数据报通道连接。为了使用 read 和 write 方法,必须建立数据报通道连接,因为这些方法不接受或返回套接字地址。
一旦建立了连接,在断开数据报通道的连接或将其关闭之前,该数据报通道保持连接状态。可通过调用数据报通道的 isConnected 方法来确定它是否已连接。
多个并发线程可安全地使用数据报通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。


27、ServerSocketChannel 
extends AbstractSelectableChannel
针对面向流的侦听套接字的可选择通道。
服务器套接字通道不是侦听网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 ServerSocket 对象来完成对套接字选项的绑定和操作。不可能为任意的已有服务器套接字创建通道,也不可能指定与服务器套接字通道关联的服务器套接字所使用的 SocketImpl 对象。
通过调用此类的 open 方法创建服务器套接字通道。新创建的服务器套接字通道已打开,但尚未绑定。试图调用未绑定的服务器套接字通道的 accept 方法会导致抛出 NotYetBoundException。可通过调用相关服务器套接字的某个 bind 方法来绑定服务器套接字通道。
多个并发线程可安全地使用服务器套接字通道。


28、SocketChannel
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel
针对面向流的连接套接字的可选择通道。
套接字通道不是连接网络套接字的完整抽象。必须通过调用 socket 方法所获得的关联 Socket 对象来完成对套接字选项的绑定、关闭和操作。不可能为任意的已有套接字创建通道,也不可能指定与套接字通道关联的套接字所使用的 SocketImpl 对象。
多个并发线程可安全地使用套接字通道。尽管在任意给定时刻最多只能有一个线程进行读取和写入操作,但数据报通道支持并发的读写。connect 和 finishConnect 方法是相互同步的,如果正在调用其中某个方法的同时试图发起读取或写入操作,则在该调用完成之前该操作被阻塞。


29、Channels 
extends Object
针对信道和流的实用工具方法。
此类定义了支持 java.io 包中的流类与此包中的信道类之间进行互操作的静态方法。
 
30、FileLock 
extends Object
表示文件区域锁定的标记。
每次通过 FileChannel 类的 lock 或 tryLock 方法获取文件上的锁定时,就会创建一个文件锁定对象。
文件锁定对象最初是有效的。通过调用 release 方法、关闭用于获取该锁定的通道,或者终止 Java 虚拟机(以先到者为准)来释放锁定之前,该对象一直是有效的。可通过调用锁定的 isValid 方法来测试锁定的有效性。
文件锁定要么是独占的,要么是共享的。共享锁定可阻止其他并发运行的程序获取重叠的独占锁定,但是允许该程序获取重叠的共享锁定。独占锁定则阻止其他程序获取任一类型的重叠锁定。一旦释放某个锁定后,它就不会再对其他程序所获取的锁定产生任何影响。
可通过调用某个锁定的 isShared 方法来确定它是独占的还是共享的。某些平台不支持共享锁定,在这种情况下,对共享锁定的请求被自动转换为对独占锁定的请求。
单个 Java 虚拟机在某个特定文件上所保持的锁定是不重叠的。要测试某个候选锁定范围是否与现有锁定重叠,可使用 overlaps 方法。
文件锁定对象记录了在其文件上保持锁定的文件通道、该锁定的类型和有效性,以及锁定区域的位置和大小。只有锁定的有效性是随时间而更改的;锁定状态的所有其他方面都是不可变的。
文件锁定以整个 Java 虚拟机来保持。但它们不适用于控制同一虚拟机内多个线程对文件的访问。
多个并发线程可安全地使用文件锁定对象。




31、SelectionKey 
extends Object
表示 SelectableChannel 在 Selector 中的注册的标记。
每次向选择器注册通道时就会创建一个选择键。通过调用某个键的 cancel 方法、关闭其通道,或者通过关闭其选择器来取消 该键之前,它一直保持有效。取消某个键不会立即从其选择器中移除它;相反,会将该键添加到选择器的已取消键集,以便在下一次进行选择操作时移除它。可通过调用某个键的 isValid 方法来测试其有效性。
选择键包含两个表示为整数值的操作集。操作集的每一位都表示该键的通道所支持的一类可选择操作。
interest 集合 确定了下一次调用某个选择器的选择方法时,将测试哪类操作的准备就绪信息。创建该键时使用给定的值初始化 interest 集合;之后可通过 interestOps(int) 方法对其进行更改。
ready 集合 标识了这样一类操作,即某个键的选择器检测到该键的通道已为此类操作准备就绪。创建该键时 ready 集合被初始化为零;可以在之后的选择操作中通过选择器对其进行更新,但不能直接更新它。
选择键的 ready 集合指示,其通道对某个操作类别已准备就绪,该指示只是一个提示,并不保证线程可执行此类别中的操作而不导致被阻塞。ready 集合很可能一完成选择操作就是准确的。ready 集合可能由于外部事件和在相应通道上调用的 I/O 操作而变得不准确。
此类定义了所有已知的操作集位 (operation-set bit),但是给定的通道具体支持哪些位则取决于该通道的类型。SelectableChannel 的每个子类都定义了 validOps() 方法,该方法返回的集合恰好标识该通道支持的操作。试图设置或测试某个键的通道所不支持的操作集位将导致抛出相应的运行时异常。
通常必须将某个特定于应用程序的数据与某个选择键相关联,例如表示高级协议状态的对象和为了实现该协议而处理准备就绪通知的对象。因此,选择键支持将单个任意对象附加 到某个键的操作。可通过 attach 方法附加对象,然后通过 attachment 方法获取该对象。
多个并发线程可安全地使用选择键。一般情况下,读取和写入 interest 集合的操作将与选择器的某些操作保持同步。具体如何执行该同步与实现有关:在一般实现中,如果正在进行某个选择操作,那么读取或写入 interest 集合可能会无限期地阻塞;在高性能的实现中,可能只会暂时阻塞。无论在哪种情况下,选择操作将始终使用该操作开始时当前的 interest 集合值。


32、spi.AbstractSelectionKey 
extends SelectionKey
选择键的基本实现类。
此类跟踪键的有效性并实现取消。


33、Selector 
extends Object
SelectableChannel 对象的多路复用器。
可通过调用此类的 open 方法创建选择器,该方法将使用系统的默认选择器提供者创建新的选择器。也可通过调用自定义选择器提供者的 openSelector 方法来创建选择器。通过选择器的 close 方法关闭选择器之前,它一直保持打开状态。
通过 SelectionKey 对象来表示可选择通道到选择器的注册。选择器维护了三种选择键集:
键集 包含的键表示当前通道到此选择器的注册。此集合由 keys 方法返回。
已选择键集 是这样一种键的集合,即在前一次选择操作期间,检测每个键的通道是否已经至少为该键的相关操作集所标识的一个操作准备就绪。此集合由 selectedKeys 方法返回。已选择键集始终是键集的一个子集。
已取消键集 是已被取消但其通道尚未注销的键的集合。不可直接访问此集合。已取消键集始终是键集的一个子集。
在新创建的选择器中,这三个集合都是空集合。


34、spi.AbstractSelector 
extends Selector
选择器的基本实现类。
此类封装了实现中断选择操作所需的低级别机制。在调用可能无限期阻塞的 I/O 操作之前和之后,具体的选择器类必须分别调用 begin 和 end 方法。
此类还定义了用于维护选择器的已取消键集和从其通道的键集中移除键的方法,并且为了执行实际的通道注册工作,还声明了由可选择通道的 register 方法所调用的抽象 register 方法。


35、spi.SelectorProvider
extends Object
用于选择器和可选择通道的服务提供者类。
选择器提供者是此类的一个具体子类,它具有零参数的构造方法,并实现了以下指定的抽象方法。给定的对 Java 虚拟机的调用维护了单个系统级的默认提供者实例,它由 provider 方法返回。第一次调用该方法将查找以下指定的默认提供者。
系统级的默认提供者由 DatagramChannel、Pipe、Selector、ServerSocketChannel 和 SocketChannel 类的静态 open 方法使用。System.inheritedChannel() 方法也使用它。除了默认提供者之外,程序还可以使用其他提供者,方法是通过实例化一个提供者,然后直接调用此类中定义的 open 方法。
多个并发线程可安全地使用此类中的所有方法。


四:java.nio.charset 和java.nio.charset.spi 类


36、Charset 
extends Object
implements Comparable<Charset>
16 位的 Unicode 代码单元序列和字节序列之间的指定映射关系。此类定义了用于创建解码器和编码器以及获取与 charset 关联的各种名称的方法。此类的实例是不可变的。
此类也定义了用于测试是否支持特定 charset 的静态方法、通过名称查找 charset 实例的静态方法,以及构造一个包含目前 Java 虚拟机支持的每个 charset 的映射静态方法。通过类 CharsetProvider 中定义的服务提供者接口可以添加对新 charset 的支持。
此类中定义的所有方法用于多个并发线程是安全的。


37、CharsetDecoder 
extends Object
能够把特定 charset 中的字节序列转换成 16 位 Unicode 字符序列的引擎。
输入字节序列由字节缓冲区或一系列这样的缓冲区提供。输出字符序列写入字符缓冲区或一系列这样的缓冲区。应该始终通过下面的方法调用序列使用解码器,下文称为解码操作:
通过 reset 方法重置解码器,除非以前未使用过;
只要有其他的输入数据就应零次或多次调用 decode,为 endOfInput 参数传递 false,在调用之间填充输入缓冲区并刷新输出缓冲区。
最后时刻调用一次 decode 方法,为 endOfInput 参数传递 true;然后
调用 flush 方法,这样解码器能够将任何内部状态刷新到输出缓冲区。
此类的实例用于多个并发线程是不安全的。


38、CharsetEncoder 
extends Object
能够把 16 位 Unicode 字符序列转换成特定 charset 中字节序列的引擎。
输入字符序列由字符缓冲区或一系列这样的缓冲区提供。输出字节序列写入字节缓冲区或一系列这样的缓冲区。应该始终通过下面的方法调用序列使用编码器,
此类的实例用于多个并发线程是不安全的。


39、CoderResult 
extends Object
coder 结果状态的描述。
charset coder(即解码器或编码器)使用输入缓冲区中的字节(或字符)、对它们进行转换,并将结果字符(或字节)写入输出缓冲区。编码进程终止的原因是以下四类之一,这些原因由此类的实例描述:
当没有更多的输入要处理时,或者当现有的输入不足而需要其他的输入时报告下溢(Underflow)。这种情况用唯一的结果对象 UNDERFLOW 表示,该对象的 isUnderflow 方法返回 true。
当输出缓冲区没有足够的剩余空间时报告溢出(Overflow)。这种情况用唯一的结果对象 OVERFLOW 表示,该对象的 isOverflow 方法返回 true。
当输入单元序列不是格式良好时报告错误的输入错误。这种错误用此类的实例来描述,该类的 isMalformed 方法返回 true,该类的 length 方法返回错误序列的长度。对所有的给定长度的错误输入错误,有此类的一个唯一实例描述。
当表示一个字符的输入单元序列不能在输出 charset 中表示时报告不可映射的字符错误。这种错误用此类的实例描述,该类的 isUnmappable 方法返回 true,该类的 length 方法返回表示不可映射的字符的输入序列的长度。对所有的给定长度的不可映射的字符错误,有此类的一个唯一实例描述。
为了方便,isError 方法为描述错误输入和不可映射的字符错误的结果对象返回 true,但是为那些描述下溢或溢出情况的结果对象返回 false。


40、CodingErrorAction
extends Object
编码错误操作的类型安全的枚举。
此类的实例用来指定 charset 的解码器和编码器如何处理错误输入和不可映射的字符错误。
IGNORE  指示通过删除错误输入和恢复编码操作来处理编码错误的操作。
REPLACE 指示通过删除错误输入、向输出缓冲区追加 coder 的替换值和恢复编码操作来处理编码错误的操作。
REPORT 指示要报告编码错误的操作,报告的方式是通过返回 CoderResult 对象或抛出 CharacterCodingException,以上两者都适合实现编码过程的方法。


41、spi.CharsetProvider
extends Object
Charset 服务提供者类。
charset 提供者是此类的一个具体子类,具有零参数的构造方法和一些相关的 charset 实现类。Charset 提供者可以作为扩展装入到 Java 平台的实例中,也就是把 jar 文件放入任意常用的扩展目录中。通过把提供者加入到 applet 或应用程序类路径中,或者通过某些特定于平台的其他方式来使提供者可用。通过当前线程的上下文类加载器来查找 Charset 提供者。
charset 提供者使用资源目录 META-INF/services 下的名称为 java.nio.charset.spi.CharsetProvider 的提供者配置文件标识它自己。该文件应该包含一个完全限定的具体 charset 提供者类名的列表,每行一个类名。通过下列字符之一表示某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。忽略各名称周围的空格字符和制表符以及空行。注释字符为 '#' ('\u0023');将忽略每行的第一个注释字符后面的所有字符。文件必须使用 UTF-8 编码。
如果在多个配置文件中命名了一个特定的具体 charset 提供者类,或在同一配置文件中多次对其命名,则忽略重复的命名。命名特定提供者的配置文件不必像提供者本身一样位于同一个 jar 文件或其他的分布式单元中。提供者必须是从同一个类加载器可访问的,为了查找配置文件而在开始时查询该类加载器;这不必是装载文件的类加载器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值