[Google Guava笔记](八)io
6???????com.google.common.io:与JavaI/O相关的工具类和方法。
?
接口:
6.1???ByteArrayDataInput:从内存中读取byte数组,它的方法都是在父接口中定义的,提供了相同的功能,但是不抛出IOException,如果某个方法过早的到达数组的尾部,则会抛出IllegalStateException。
6.2???ByteArrayDataOutput:将数据写到内存中的byte数组,它的方法大部分是在父接口中定义的,提供了相同的功能,但是不抛出IOException。
6.3???ByteProcessor:处理输入/输出流中的数据的回调接口。processBytes(byte[]buf, int off, int len)方法用来处理输入流中的一个数据块(被读入的一行数据)。
6.4 ??InputSupplier<T>:提供可读的byte/字符流的工厂类。getInput()方法返回一个封装了可读资源的对象,它可能会在同一个资源上被调用多次,返回的是独立的通道,类似于iterator,在一个通道上移动游标位置不会影响其它通道的游标。
6.5 ??LineProcessor<T>:和流的readLines方法一起用的回调类。processLine(Stringline)方法对读入的每行数据进行处理。
6.6???OutputSupplier<T>:提供可写的byte/字符流的工厂类。getOutput()方法返回一个封装了可写资源的对象,它可能会在同一个资源上被调用多次,返回的是独立的通道,类似于iterator,在一个通道上移动游标位置不会影响其它通道的游标。
类:
6.7???AppendableWriter:继承自java.io.Writer,把所有的输出放到内部封装的target上,如果target是可刷新或可关闭的,writer的flush()和close()会被委托给target。
write(...):将数据追加到target中。
append(...):将数据追加到target中。
flush():如果target是可刷新的,则刷新target。
close():如果target是可关闭的,则关闭target。
6.8???ByteStreams:提供了与byte数组和I/Ostream相关的工具方法。
静态方法:
newInputStreamSupplier(...):返回InputSupplier<ByteArrayInputStream>(继承InputSupplier的匿名内部类)的实例。
write(byte[] from,OutputSupplier<? Extends OutputStream> to):将from写到to的输出流。
copy(...):与write功能类似。
toByteArray(...):将输入转换为byte数组并返回。
?????????newDataInput(...):返回ByteArrayDataInput(实现ByteArrayDataInput的内部类——ByteArrayDataInputSteam)的实例。
?????????newDataOutput(...):返回ByteArrayDataOutput(实现ByteArrayDataOutput的内部类——ByteArrayDataOutputSteam)的实例。
length(InputSupplier<?Extends InputStream> supplier):返回提供的输入流的长度(字节数)。
?????????equal(InputSupplier<?Extends InputStream> supplier1, InputSupplier<? ExtendsInputStream> supplier2):判断supplier1和supplier2是否相等。
readFully(InputStream in,byte[] b):将in中的数据读到b中。
readFully(InputStream in,byte[] b, int off, int len):将in中从off开始的len个字节都到b中。
skipFully(InputSteam in,long n):忽略in的n个字节。
?????????readBytes(InputSupplier<?extendsInputStream> supplier,ByteProcessor<T>processor):将supplier提供的输入流中的数据读入,并用processor处理,返回处理后的结果。
?????????getChecksum(InputSupplier<?Extends InputStream>supplier, final Checksumchecksum):获取supplier提供的流的校验和。
????????getDigest(InputSupplier<?Extends InputStream>supplier, final MessageDigestmd):获取supplier提供的流的摘要(MessageDigest类为应用程序提供信息摘要算法的功能,如MD5 或 SHA 算法)。
????????read(InputStream in, byte[]b, int off, int len):将输入流in读到b中,返回读入的字节数。
????????slice(final InputSupplier<?Extends InputStream>supplier, final long offset, final longlength):顾名思义,返回supplier的分片。
join(...):将多个suppliers合在一起。
?
6.9Closeables:提供了与Closeable对象相关的工具方法。
静态方法:
?????????close(Closeable closeable,booleanswallowIOException):尝试关闭closeable,关闭失败的情况下,如果swallowIOException为true,不抛出异常,只在日志里记录关闭失败信息,如果swallowIOException为false,则抛出异常。
closeQuietly(Closeablecloseable):关闭closeable,不抛出异常。
6.10CountingInputStream:继承了FilterInputStream类,提供了为读入的字节计数的功能。封装了计数器count和标记mark。
??? FilterInputStream
包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream
类本身只是简单地重写那些将所有请求传递给所包含输入流的InputStream
的所有方法。FilterInputStream
的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
成员方法:
getCount():返回count。
read():读入数据,如果读入成功,count自增,并返回读入的字节数。
read(byte[] b, int off, intlen):读入数据,如果读入成功,将读入的字节数加到count中,并返回读入的字节数。
skip(longn):跳过输入流中的n个字节,将读入的字节数加到count中,并返回读入的字节数。
mark(intreadlimit):在此输入流中标记当前的位置,将mark标记为count。
reset():如果输入流支持标记,且已标记过,则将当前位置重置为mark,count重置为mark。
6.11?CountingOutputStream:继承了FilterOutputStream类,提供了为写出的字节计数的功能。封装了计数器count。只重载了write(...)方法,提供了getCount()方法。
6.12?FileBackedOutputStream:一般的输出流将数据缓存到一个byte数组里,而这个类定义的输出流中,一旦数据量达到一定数量就将数据缓存到文件中。
6.13?Files:提供了与File相关的工具方法。大部分方法都可以顾名思义,挑几个我根据名字看不懂的记一下。
静态方法:
touch(Filefile):创建一个空文件,如果文件已经存在,则将最后修改时间改为当前时间。
map(...):将文件映射到内存,返回MappedByteBuffer。
?????????MappedByteBuffer是直接字节缓冲区,其内容是文件的内存映射区域。映射的字节缓冲区是通过 FileChannel.map
方法创建的。此类用特定于内存映射文件区域的操作扩展ByteBuffer
类。映射的字节缓冲区和它所表示的文件映射关系在该缓冲区本身成为垃圾回收缓冲区之前一直保持有效。映射的字节缓冲区的内容可以随时更改,例如,在此程序或另一个程序更改了对应的映射文件区域的内容的情况下。这些更改是否发生(以及何时发生)与操作系统无关,因此是未指定的。
6.14Flushables:提供了与Flushable相关的实用方法。
静态方法:
flush(Flushable flushable,boolean swallowIOException):刷新流,可选择是否抛出异常。
flushQuietly(Flushableflushable):与上面的方法类似,但不抛出异常。
6.15?LimitInputStream:继承了FilterInputStream,这个类可限定读入的字节数。
6.16?LineBuffer:抽象类
6.17? LineReader:
6.18?LittleEndianDataInputStream:继承FilterInputStream,实现了DataInput接口,这个类用little-endianbyte ordering读short、int、float、double、long型的数据。
以下内容引自:http://www.cppblog.com/erran/archive/2007/10/13/34115.html。
? ? ? ?? 内存中一个WORD值中的内容如下:
low?byte?high?byte?
0x12????? 0x34?
那么这个WORD中的值是0x1234呢,还是0x3412???
熟悉x86汇编的人立刻就知道这个值应为0x3412,很对,但在一些情况下,比如说你在SGI的机器上看到这种情况,则正好相反,0x1234才是正确答案,这与CPU内部处理数据的方式有关。这两种处理方式都存在于不同厂商生产的CPU之中,在上例中若此WORD值为0x3412的,我们称之为little-endian,?若为0x1234的,我们称之为big-endian,这是两种不同的byte?orders。MSDN中有比较精确的定义如下:
Byte?Ordering?Byte?ordering?Meaning?
big-endian?The?most?significant?byte?is?on?the?left?end?of?a?word.?
little-endian?The?most?significant?byte?is?on?the?right?end?of?a?word.?
?
6.19?LittleEndianDataOutputStream:继承FilterOutputStream,实现了DataOutput接口,这个类用little-endianbyte ordering写short、int、float、double、long型的数据。
6.20?MultiInputStream:继承InputStream,内部封装了InputSupplier列表的迭代器,一次只能打开一个流。
6.21?MultiReader:继承Reader,与上面的方法类似。
6.22?NullOutputStream:继承OutputStream,重载了write方法,该方法不做任何事,意味着丢弃了被输出的字节。
6.23?PatternFilenameFilter:实现了FilenameFilter接口,封装了一个pattern,只接受文件名符合pattern的文件。
6.24?Resources:提供了一组静态的实用方法,通过这些方法可以使用类路径下的资源。需要注意的是,虽然这些方法的参数中有URL,但它与HTTP或其它的类路径下的资源没有联系。使用范例(来自http://ajoo.iteye.com/blog/738286,非常感谢ajoo!为什么我今天才看到他的blog呢?真是out啊...):
URL?url?=?Resources.getResource("mypackage/myfile.txt");??
得到了这个URL,就可以从里面读出内容.如果它是一个文本文件,可以用Resources.toString():
String?content?=?Resources.toString(url);??
?
?????????最近被问到为什么Resources不能用于获取本地类加载器之外的资源,我看到上面的例子后,觉得可能是因为一般先通过getResource()方法获取URL,然后再把URL作为参数调用Resource的其他方法,而getResource()方法是通过Resources.class.getClassLoader()这个类加载器来获取资源的,所以这个资源必须由加载Resources类的类加载器来加载。
?????? 虽然这个类的注释里说URL和HTTP没有关系,但究竟可不可以获取HTTP的资源呢,做了以下尝试:
String content =Resources.toString(new URL(“http://www.iteye.com/”));
?????????结果发现其实是可以获取网络资源的(只是ITeye不允许用爬虫进行网页抓取,上面这样的访问被拒绝了,哈哈!),因为这个类的以URL为参数的那几个静态方法其实直接用的是URL的openStream()方法,和类加载器没有太大关系,类加载器只是在getResource()方法里涉及。
?
以上。
?