Closeable
DataInput接口提供 从二进制流中读取字节,同时重构成任何的Java原始数据类型。子接口有ObjectInput
DataOutput接口提供将Java原始数据类型转换成字节,同时写入二进制流中。子接口ObjectOutput
Flushable 数据刷新的目的
Serializable序列化标识接口,ObjectInputFilter
FileFilter文件路径过滤器,FilenameFilter
接口还提供了从修改的UTF8格式重构字符串的工具
读取流程:如果读取所需字节数前到达文件末尾,会抛出EOFExecetion。如果除了文件末尾外不能读取数据,会抛出抛出IOExcetion,输入流关闭也会抛出IO异常。
DataInput接口使用一种改良的UTF8格式表示Unicode字符串。
改良UTF-8,
单字节范围:\u0001--\u007f
双字节范围:空字符\u0000, \u0080--\u07ff
三字节范围: \u0800--\uffff
与标准的UTF8相比:
空字符\u0000是用双字节编码,不是单字节。
仅使用1,2,3字节。补充字符用代理项。
Interface Methods
readBoolean() 读取一个字节,如果字节不为0,返回false,为0返回true。
readFully(byte[] b)读取一些字节,存储到b中
readLine() 读取一行
readUTF() 读取改良的UTF8字符编码的Unicode字符的表示
skipBytes(int n) 跳过n个字节
DataOutput
提供了将字符串转换成改良后的UTF8格式,然后写入字节流
方法是
write(byte[] b)
writeUTF(String s) 写入两个字节的长度,然后写入UTF8改良后的字符
ObjectInput
available() 返回可以不阻塞读取的字节数
skip(long n) Skips n bytes of input.
readObject()
DataInputStream, FileCacheImageInputStream, FileCacheImageOutputStream, FileImageInputStream, FileImageOutputStream, ImageInputStreamImpl, ImageOutputStreamImpl, MemoryCacheImageInputStream, MemoryCacheImageOutputStream, ObjectInputStream, RandomAccessFile
DataOutput实现
DataOutputStream, FileCacheImageOutputStream, FileImageOutputStream, ImageOutputStreamImpl, MemoryCacheImageOutputStream, ObjectOutputStream, RandomAccessFile
InputStream是所以字节输入流的超类
InputStream的方法
avaiable()方法
mark(int readlimit) 标记输入流的当前位置,readlimit在标记位置无效之前最多可以读取的字节数; reset() 定位到此前的标记位置
read(byte[] b, int off, int len) 从输入流中读取到b,len长度,off是数组b中起始的偏移。方法会一直阻塞,知道读取到字数或者文件末尾,或者引发异常
transferTo(OutputStream out) 读取输入流的所有字节,按照顺序写入输出流
OutputStream类
所有字节输出流的超类,并将字节输入到某个接收器上
flush() 强制输出缓存的字节流
write(byte[] b, int off, int len) 元素b[off]是第一个写入的字节 b[off+len-1]是写入的最后一个字符
write(byte[] b)
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream, PipedInputStream, SequenceInputStream
AudioInputStream 音频输入流,是具有音频格式和长度的输入流,长度表示示例帧,音频输入流的长度是用示例帧表示的。
独有的Field,format音频格式,framelength流的长度,framepos当前帧位置,frameSize一帧多少个字节
AudioSystem是一个辅助类,可以创建音频输入流,或者获取音频输入流,以及转换音频的格式。
ByteArrayInputStream字节数组输入流,内部有一个缓存区,可以从流中读取字节;
构造方法必需有字节输入ByteArrayInputStream(byte[] buf) ByteArrayInputStream(byte[] buf, int offset, int length)
FileInputStream文件输入流,从文件获取输入字节,用于获取原始字节流,比如图形数据,非常重要。
FileInputStream(File file) FileInputStream(String name) FileInputStream(FileDescriptor fdObj)
FileInputStream#getChannel() 获取FileChannel
FileInputStream#getFD() 获取FileDescriptor. FileDescriptor文件描述符,主要是有三个静态常量in,out,err描述输入流,输出流,错误输出的句柄,不直接使用,而是通过System.in使用
ObjectInputStream继承InputStream类,实现ObjectInput接口, 常用于反序列化Java原始类型,与FileInputStream搭配使用。此类提供了某些不常用的方法验证序列化的正确性
PipedInputStream管道输入流,必需和PipedOutputStream搭配使用,要与管道输出流连接形成管道,通常用在连个不同的线程中使用。
PipedInputStream#connect(PipedOutPutStream out) 连接管道输出流,或者在构造函数中,把管道输出流放入参数中。 内部使用一个byte[]数组存放输入的数据
SequenceInputStream顺序输入流,将两个输入流连接起来,一起读取数据SequenceInputStream(InputStream s1, InputStream s2)
FilterInputStream的子类有BufferInputStream,内部有一个缓存区,可以用来创建数组和标记,类似的有BufferOutputStream
OutputStream的实现
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, PipedOutputStream
ByteArrayOutputStream字节数组输出流,ByteArrayOutputStream.buf 是一个输出流缓存字节数组,ByteArrayOutputStream.count是缓存区中有效的字节数
可以使用toString()将存储缓存区的buf[]转换成其他格式的字符串 wirteTo(OutputStream out)输出到其他的输出流
reset() 方法让count=0,舍弃当前输出流缓存区的字节
总结:FileInputStream和FileOutputStream的起始,使用这个两个流作为开端,将他们传入其他流的构造函数中使用或者直接使用。
Reader类用于从字符流读取字符的抽象类
Reader.lock 用于同步次流上的操作的对象,Reader() Reader(Object lock)
重要的方法
read(char[] cbuf, int off, int len)
read(CharBuffer target)
ready() boolean
transferTo(Writer out)
Writer类
append(CharSequence csq, int start, int end) 追加字符序列的子序列写入输出流
write(char[] cbuf, int off, int len)
write(String str, int off, int len)
Reader实现的子类
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
InputStreamReader是一个非常重要的子类,是字节流到字符流的桥梁。它接受字节同时用编码格式转换成为字符。
InputStreamReader(InputStream in) InputStreamReader(InputStream in, String charsetName)
FileReader是它的子类,FileReader(File file) FileReader(File file, Charset charset) 通常用它读取字符
OutputStreamWriter是一字符流到字节流的桥梁,FileWriter是它的子类
继承FilterOutputStream,
PrintStream(File file) PrintStream(OutputStream out) PrintStream(String fileName)
打印流不会抛出任何的IOException,而是返回可检查的内部标识,同时打印数组等集合使,打印流自动flush
RandomAccessFile随机文件访问,实现了DataInput,DataOutput接口,可以在随机位置插入和读写。
seek(long pos)设置文件的偏移量,下一次读写的位置,以字节为单位
一个存储指定元素的容器
其有三个属性 capacity>limit>position ;limit是第一个不可读或写的索引;position是下一个写入或读取的元素索引。
marking and resetting
mark是一个索引,永远小于position,如果mark大于position,limit那么会被丢弃。同时reset()方法就将当前的position=mark。如果没有mark的情况下,使用reset方法会抛出异常。
0 <= mark <= position <= limit <= capacity 这个是不变的等式。
可选的操作
clear(),让缓存区做好读取或put操作准备,即position=0,limit=capacity
flip() 让缓存区做好写入或get操作准备,即limit=position,position=0,
rewind() 让缓存区做好重读的准备,即position=0
slice() 创建缓存区的子序列
duplicate() 创建缓存区的浅拷贝
其他的方法 remaining() return limit-position
所以缓存区都是可读的,但是有的缓存区不是可写的
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer 都是它的实现子类
File类是一个实现类,直接超类是Object,是文件和目录路径的抽象表示。
File.separator 表示文件的分隔符,还要另外3个表达的是同样意思的不同表达。
File有4个构造函数,File是不可变的,一旦创建不可改变。
文件的方法是获取文件或者目录路径信息,判断文件的属性,没有写入的方法。
总结
传统IO的用法,使用File类构建文件或者目录,然后使用FileInputStream创建输入流。如果想要添加缓存区,那么可以使用BufferInputStream包裹FileInputStream;如果反序列化对象,使用ObjectInputStream包裹FileInputStream。
如果想要用字符流读取文件,第一步还是使用File类构建文件,其次使用FileReader构建字符输入流。如果想要用缓存区,那么可以使用BufferReader类包裹FileReader。
如果想要对字节输入流转换成为字符输入流,那么可以使用InputStreamReader(InputStream in);字符流到字节流的转换使用OutputStreamWriter(OutputStream out)。也可以在字符流前面套一个缓存流BufferReader子类的。
管道流文件PipedInputStream和PipedOutputStream搭配使用。
上述的模式,都是起点File文件,然后InputStream的实例套一个File文件,InputStream套另外一个,最外层的选择永远是BufferInputStream。
其他文件的处理 音频文件的处理,可以使用AudioInputStream,AudioSystem两个类处理音频文件。
图片读取:ImageReader, ImageReadParam, ImageTypeSpecifier
图片输出:ImageWriter ,ImageWriteParam
图片转换:ImageTranscoder
图片异常:IIOException
支持处理的图片格式有png,gif,jpeg,bmp,wbmp,tiff
System类不能实例化,它提供了标准输入,标准输出,错误输出的默认设置和修改;提供访问和设置外部环境变量;加载文件;也提供了数组复制的arraycopy
System.in是InputStream流 System.err,System.out是PrintStream打印流
System.setProperty(key,value) System.setErr()
Scanner文本扫描器
默认情况下Scanner使用定界符模式解析,定界符是空白。
使用useDelimiter(Pattern|String pattern)可以修改扫描器的定界符