一、IO流
1、概述
IO流用来处理设备之间的数据传输(上传文件和下载文件)
Java对数据的操作时通过流的方式,Java用于操作流的对象在IO包内
2、分类
1)按照数据类型:字节流,字符流(为了方便操作文本数据,Java提供了字符流)
2)按照数据流向:输入流(读入数据),输出流(写出数据)
3、用法
1)字节型文件输入流(读取,FileInputStream)
若路径存在问题,则会报错
方法:
int code = read();一次读取一个字节
int count = read(byte[] b);一次读取一个字节数组
2)字节型文件输出流(写入,FileOutputStream)
若路径存在问题,则会新建一个文件夹
方法:
public void write(int b);
public void write(byte[] b);
3)字符型文件输入流(读取,FileReader)
int read();一次读取一个字符
int read(char[] chs);一次读取一个字符数组
4)字符型文件输出流(写入,FileWriter)
public void write(int c);写入一个字符
public void write(char[] value);写入一个字符数组
public void write(char[] value, int off, int len);写一个字符数组的一部分
public void write(String str);写一个字符串
public void write(String str, int off, int len);写一个字符串的一部分
5)字节输出/输入的步骤
- 创建字节输入/输出流对象
- 调用read()/write()方法读取/写入数据
- 释放资源
二、缓冲流(高效类)
1、字节型
BufferedInputStream/BufferedOutputStream
2、字符型
BufferedReader/BufferedWriter
3、缓冲流的调用格式
File file = new File(路径);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
4、 字符型的独有方法
String value = br.readLine();
String value = br.newLine();
注意:
1)close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了
2)flush()清空内存缓冲区数据,仅仅刷新缓冲区,刷新之后,流对象不可以就行再使用
三、打印流
1、分类
字节打印流:PrintStream
字符打印流:PrintWriter
2、特点
1)只能操作目的地,不能操作数据
2)可以操作任意类型的数据
3)如果启动了自动刷新,能够自动刷新
4)可以操作文件的流
四、标准输入输出流
System类中的字段:in,out
它们各代表了系统便准的输入和输出设备
默认输入设备是键盘,输出设备是显示器
System.in的类型是InputStream
System.out的类型是PrintStream
五、随机访问流
1、概述
RandomAccessFile类不属于流,是Object类的子类,但他融合了InputStream和OutputStream的功能,支持对随机访问文件读取和写入
2、方法
public RandomAccessFile(String name, String mode);
第一个参数是文件路径,第二个参数是操作文件的模式
六、合并流
1、概述
SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流
2、方法
SequenceInputStream(InputStream s1, InputStream s2);
SequenceInputStream(Enumeration<?extends InputStream> e)
把多个文件内容写到一个文本文件里
Enumeration是Vector中的一个方法的返回值类型
七、序列流
1、概述
序列流(ObjectOutputStream):把对象按照流一样的方式存入文本文件或者在网络中传输
反序列流(ObjectInputSream):把文本文件中的流对象数据或者网络中的流对象数据还原成对象
2、未序列化异常(NoSerialzableException)
类通过实现java.io.Serialzable接口,已启用其序列化功能,未实现此接口的类将无法使用任何状态序列化或者反序列化。该接口没有任何方法,类似于这种没有方法的接口被称为标记接口
注意:
1)类实现了序列化接口时,需要产生一个序列化id值,而产生这个值后,对类进行任何改动,读取以前的数据是没有问题的
2)使用transient关键字声明不需要序列化的成员变量
八、Properties
1、概述
Properties是一个可以和IO流相结合使用的集合类,可以保存在流中或从流中加载,属性列表每个键及其对应值都是一个字符串
2、方法
public Object setProperty(String key, String value);添加元素
public String getProperty(String key);根据键获取元素
public Set<String> stringPropertyNames();获取所有键的集合
3、Properties和IO流的结合使用
public void load(Reader reader);把文件的数据读取到集合中
public void store(Writer writer, String comments);把集合中的数据存储到文件
注意:
1)集合必须是Properties集合
2)文件的数据必须是键值对形式