Java学习树--10 IO流和文件,图片,视频

接口

Closeable
DataInput接口提供 从二进制流中读取字节,同时重构成任何的Java原始数据类型。子接口有ObjectInput

DataOutput接口提供将Java原始数据类型转换成字节,同时写入二进制流中。子接口ObjectOutput

Flushable 数据刷新的目的

Serializable序列化标识接口,ObjectInputFilter

FileFilter文件路径过滤器,FilenameFilter

DataInput

接口还提供了从修改的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()

DataInput实现

DataInputStream, FileCacheImageInputStream, FileCacheImageOutputStream, FileImageInputStream, FileImageOutputStream, ImageInputStreamImpl, ImageOutputStreamImpl, MemoryCacheImageInputStream, MemoryCacheImageOutputStream, ObjectInputStream, RandomAccessFile

DataOutput实现
DataOutputStream, FileCacheImageOutputStream, FileImageOutputStream, ImageOutputStreamImpl, MemoryCacheImageOutputStream, ObjectOutputStream, RandomAccessFile

InputStream类和OutputStream类

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)

InputStream的实现

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类和Writer类

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 OutputStreamWriter

InputStreamReader是一个非常重要的子类,是字节流到字符流的桥梁。它接受字节同时用编码格式转换成为字符。
InputStreamReader​(InputStream in) InputStreamReader​(InputStream in, String charsetName)

FileReader是它的子类,FileReader​(File file) FileReader​(File file, Charset charset) 通常用它读取字符

OutputStreamWriter是一字符流到字节流的桥梁,FileWriter是它的子类

PrintStream的用法,RandomAccessFile的用法

继承FilterOutputStream,
PrintStream​(File file) PrintStream​(OutputStream out) PrintStream​(String fileName)

打印流不会抛出任何的IOException,而是返回可检查的内部标识,同时打印数组等集合使,打印流自动flush

RandomAccessFile随机文件访问,实现了DataInput,DataOutput接口,可以在随机位置插入和读写。

seek(long pos)设置文件的偏移量,下一次读写的位置,以字节为单位

Buffer类

一个存储指定元素的容器
其有三个属性 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类

File类是一个实现类,直接超类是Object,是文件和目录路径的抽象表示。

File.separator 表示文件的分隔符,还要另外3个表达的是同样意思的不同表达。

File有4个构造函数,File是不可变的,一旦创建不可改变。

文件的方法是获取文件或者目录路径信息,判断文件的属性,没有写入的方法。

  1. canExecute() setExecutable() 判断文件是否可执行,设置文件的可执行属性
  2. delete() 删除文件或路径
  3. getTotalSpace() getUsableSpace() 返回次文件所在分区的大小,可用分区大小
  4. isFile() isHidden()
  5. list() 返回目录中所以文件和目录的字符串数组 listFiles() 返回路径中文件数组 listFiles​(FileFilter filter)
  6. mkdir() toPath()
  7. FileFilter是一个函数式接口,boolean accept​(File pathname),可以用lambda表达式实现。 FilenameFilter也是一个函数式接口,accept​(File dir, String name)

总结
传统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两个类处理音频文件。

ImageIO

图片读取:ImageReader, ImageReadParam, ImageTypeSpecifier

图片输出:ImageWriter ,ImageWriteParam

图片转换:ImageTranscoder

图片异常:IIOException

支持处理的图片格式有png,gif,jpeg,bmp,wbmp,tiff

System Scanner

System类不能实例化,它提供了标准输入,标准输出,错误输出的默认设置和修改;提供访问和设置外部环境变量;加载文件;也提供了数组复制的arraycopy

System.in是InputStream流 System.err,System.out是PrintStream打印流

System.setProperty(key,value) System.setErr()

Scanner文本扫描器
默认情况下Scanner使用定界符模式解析,定界符是空白。

使用useDelimiter​(Pattern|String pattern)可以修改扫描器的定界符

posted @ 2021-06-13 17:23  lfcom  阅读(205)  评论(0编辑  收藏  举报