1. 输入输出流
- public static final InputStream in:标准输入流.通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
- public static final PrintStream out:标准输出流.通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
- Scanner类:专门用来处理键盘输入
InputStream is=System.in;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
System.out.println(line);
PrintStream ps=System.out;
ps.println("nihao456465");
2. 打印流
- 只负责输出数据,不负责读取数据
- 永远不会抛出IOException
- 有自己的特有方法
2.1. 字节打印流PrintStream
- PrintStream(String fileName):使用指定的文件名创建新的打印流
ps.print(91)
:输出就是97,其他buffer流输出a
- 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
- 可以改变输出语句的目的地:
public static void setOut(PrintStream out)
:重新分配"标准"输出流
2.2. 字符打印流PrintWriter
方法名 | 说明 |
---|---|
PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新 |
PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果为真,则println , printf ,或format方法将刷新输出缓冲区 |
PrintWriter ps=new PrintWriter(System.out,true);//自动flush()
ps.print(97);
ps.write("hello\n");
3. 对象序列化流
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象的数据和对象中存储的属性等信息
字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
- 对象序列化流: ObjectOutputStream
将Java对象的原始数据类型和图形写入OutputStream.
- 反序列化ObjectInputStream读取(重构)对象.
可以通过使用流的文件来实现对象的持久存储.
- 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
3.1. 相关方法
- ObjectOutputStream(OutputStream out): 创建一个写入指定的OutputStream的ObjectOutputStream
- void writeObject(Object obj): 将指定的对象写入ObjectOutputStream
- ObjectInputStream(InputStream in) :创建从指定的InputStream读取的ObjectInputStream
- Object readObject() 从ObjectInputStream读取一个对象
ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream("oos.txt"));
oos.writeObject(new Object());
oos.close();
ObjectInputStream in=new ObjectInputStream(new FileInputStream("oos.txt"));//需要抛出异常
Object obj=in.readObject();
obj.toString();
3.2. 对象序列化注意事项
- io包下.
- 一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口
- Serializable是一个标记接口,实现该接口,不需要重写任何方法
只需要加上
implements Serializable
3.3. 几个问题
- 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
会出问题,会抛出InvalidClassException异常
- 解决:
- 重新序列化
- 给对象所属的类加一个serialVersionUID:
private static final long serialVersionUID = 42L;
- 解决:
- 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
- 解决:
给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程, 当作默认值
- 解决:
4. Properties集合
- 是一个Map体系的集合类
- Properties可以保存到流中或从流中加载
- 属性列表中的每个键及其对应的值都是一个字符串
方法名 | 说明 |
---|---|
Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用Hashtable方法put |
String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
Set< String > tringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
4.1. Properties和IO流结合
方法名 | 说明 |
---|---|
void load(InputStream inStream) | 从输入字节流读取属性列表(键和元素对) |
void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
void store(OutputStream out, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流 |
void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
Properties prop = new Properties();
prop.put("东方不败", "林青霞");
prop.setProperty("acfun","bilibili");
prop.store("一个FileWriter");
Set<String> names = prop.stringPropertyNames();
prop.load("一个FileReader");