IO流(Input Output)
Ÿ IO流用来处理设备之间的数据传输
Ÿ Java对数据的操作是通过流的方式
Ÿ Java用户操作流的对象都在IO包中
Ÿ 流按操作数据分为两种:字节流和字符流
Ÿ 流按流向分为:输入流、输出流(相对于内存而言)
上图 IO框架中主要的流对象
什么时候使用字节流?什么时候使用字符流?
首先需要知道的是,任何数据存在硬盘上时,都是以二进制的形式存储的。而通过使用字节流,可以读取任意文件。字节流一次读取一个字节,而字符流使用了字节流读到一个或者多个字节时,去查找指定的编码表,返回对应的编码。所以字符流只能处理纯文本字符数据,而字节流可以处理更多类型的数据,比如图片,视频,音频文件等。因此,只要是纯文本数据处理,优先考虑使用字符流。其他情况就使用字节流。
IO流常用基类
l 字节流的抽象基类(顶层父类)
Ÿ InputStream
Ÿ OutputStream
l 字符流的抽象基类(顶层父类)
Ÿ Reader
Ÿ Writer
PS:如果要操作文字数据,优先考虑使用字符流
字符流
字节流读取文字字节数据后,不直接操作而是先查制定的编码表,获取 对应的文字,再对这个文字进行操作。(字节流+编码表)
l FileWriter
在创建FileWriter对象时,传入一个文件的路径或文件对象等参数,如果文件不存在,则会自动创建,如果文件存在,则会覆盖原有的文件。
Ÿ Write方法
将数据写入到临时存储缓冲区中。
Ÿ flush方法
刷新缓冲区,将缓冲区中的数据写入到目标文件中。
Ÿ close方法
关闭流,会先自动刷新缓存区。
PS:流被关闭后,就不能再调用write()和flush()方法,否则会抛出 IOException。关闭以前的流无效。
Ÿ 换行
System.getProperty("line.separator") // 可以获得当前系统的换行符
Ÿ 追加续写
在创建对象时设置追加属性,将第二个参数设置为true
l FileReader
在创建FileReader对象时,要明确被读取的文件,如果文件不存在,则抛出FileNotFoundException。
Ÿ 读取方式一:
read() // 读取单个字符
Ÿ 读取方式二:
read(char[] cbuf) // 将字符读入数组
l IOException
close()一般放在finally代码块中执行(确保资源被释放)。
l 字符流的缓冲区
缓冲区的出现提高了对数据的读写效率,在流的基础上对流的功能进行了增强。
Ÿ 对应的类
ü BufferedWriter
newLine() // 换行(注意规范:要写一行刷一行)
ü BufferedReader
read() // 高效的读取单个字符(先将数据读到缓冲区,再从从缓冲区一 个一个的读)
readLine() // 读取一行(使用缓冲流的read()方法,将读取到的字符 数据再进行一次缓存,并判断读取到的数据是否是换行标 记,最后将换行标记前的缓存的字符数据转换成字符串)
ü LineNumberReader
getLineNumber() // 获得当前行号
setLineNumber() // 设置当前行号
PS:缓冲区必须要结合流才可以使用
调用close方法时,被缓冲的流对象资源同时会被释放
装饰设计模式
装饰设计模式就是对已有的对象进行功能的扩展。(缓冲流用了此设计模式)
PS:装饰类和被装饰类都必须属于同一个接口或者继承自同一个父类
字节流
基本操作与字符流相同,但它不仅可以操作字符,还可以操作其他媒体文件。
l FileInputStream
Ÿ read()
一次读取一个字节。(不能对文字进行操作)
Ÿ read(byte[] b)
自定义缓冲区,将字节读到缓冲区中。
Ÿ available()
字节流特有的方法,通过此方法可以获取剩余还未读取的字节数。
Ÿ close()
关闭流,释放资源。
l FileOutputStream
Ÿ write()
将一个字节的数据写入到目的地。
注意:字节输出流和字符输出流的写入不同,字符流需要先将数据写入到缓存中,然后需要去编码表中找相应的编码,最后将编码写入到文件中,而字节流则不需要转换编码,所以是直接写到目的地的。所以我们在向目的地文件写数据的过程中不需要调用flush()方法。我们可以发现,FileOutputStream中并没有flush()方法的定义。但是close()方法必须调用。
Ÿ close()
关闭流,释放资源。
l System.in
“标准”输入流。
l System.out
“标准”输出流。
PS:标准输入输出流比较特殊,一但close就无法再打开,所以不要去关闭系统标 准的输入输出流,或是在程序结束时再关闭。
转换流
l InputStreamReader
将字节流转换成字符流(可以将流中的字节解码成字符)
l OutputStreamWriter
将字符流转换成字节流(可以将流的字符编码成字节)
流的操作规律
四个明确:
1. 明确源和目的(汇)
源: InputStream Reader
目的: OutputStream Writer
2. 明确数据是否是纯文本数据
源: 是:Reader
不是:InputStream
目的: 是:Writer
不是:OutputStream
3. 明确具体的设备
源设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流
4. 明确是否需要其它额外功能
1) 是否需要高效(缓冲区)
是,就加上buffer
转换流的编码解码
以上两行代码的功能是一样的,FileWriter类本身就是转换流的子类, 它默认使用本机默认的编码表来将字符数据编码成字节写入到文件中。但是 FileWriter本身不能指定编码表,只能用本机默认的编码表。
如果想自定义编码表,就必须使用转换流。
在创建转换流对象时将编码表作为参数传入构造方法中。
Properties集合
该集合一般用于操作以键值对形式存在的配置文件。
l 特点
1. 存的键和值都是String类型
2. Properties 可保存在流中或从流中加载
PS: Properties继承自Hashtable,所以具备put和putAll方法,但不建议使用,因为使用这两个方法插入的键值对类型不是String类型。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。
l 方法
ü setProperty(String key , String value)
设置属性,调用了Hashtable的put方法
ü propertyNames()
返回属性列表欧中所有键的枚举(这里只做介绍,一般不使用)
ü stringPropertyNames()
返回此属性列表中的键值(JDK1.6出现)
ü store(OutputStream out , String comments)
将属性(按字节)存储到文件(JDK1.2出现,之前用的是save方法,现在已过时)
ü store(Writer writer , String comments)
将属性(按字符)存储到文件(JDK1.6出现,以前都是按字节操作)
ü load(InputStream inStream)
(按字节)加载指定properties中的内容到内存中(JDK1.2)
ü load(Reader reader)
(按字符)加载指定properties中的内容到内存中(JDK1.6)
希望这篇文章可以帮助到你,总之同学们,it资讯尽在职坐标。