IO流
一、IO流(掌握)
(1)分类:
A:流向
输入流 读取数据
输出流 写出数据
B:数据类型
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
1.字节流
(1)FileOutputStream写出数据
A:操作步骤
a:创建字节输出流对象
b:调用write()方法
c:释放资源
B:代码体现:
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("hello".getBytes());
fos.close();
(2)FileInputStream读取数据
A:操作步骤
a:创建字节输入流对象
b:调用read()方法
c:释放资源
B:代码体现:
FileInputStream fis = new FileInputStream("fos.txt");
//方式1
int by = 0;
while((by=fis.read())!=-1) {
System.out.print((char)by);
}
//方式2
byte[] bys = new byte[1024];
int len = 0;
while((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
fis.close();
2.字符流
(1)FileWriter写出数据
A:操作步骤
a:创建字节输出流对象
b:调用write()方法
c:释放资源
B:代码体现:
FileWriter fw = new FileWriter("fos.txt");
fw.write("hello".getBytes());
fw.close();
(2)FileReader读取数据
A:操作步骤
a:创建字节输入流对象
b:调用read()方法
c:释放资源
B:代码体现:
FileReader fr = new FileReader("fos.txt");
//方式1
int by = 0;
while((by=fr.read())!=-1) {
System.out.print((char)by);
}
//方式2
byte[] bys = new byte[1024];
int len = 0;
while((len=fr.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
fr.close();
4.处理流
处理流封装的是其它流对象
处理流提供了缓冲功能,提高读写效率。
处理流中常用类
-缓冲字节输出流 BufferedOutputStream
-缓冲字节输入流 BufferedInputStream
-缓冲字符输入流 BufferedReader
-缓冲字符输出流 BufferedWriter
5.转换流
字符流与字节流的转换
读入字节,并根据指定的编码方式,将之转换为字符流
InputStreamReader(InputStream in)
OutputStreamWriter(OutputStream out)
6:IO流小结(掌握)
IO流
|--字节流
|--字节输入流
InputStream
int read():一次读取一个字节
int read(byte[] bys):一次读取一个字节数组
|--FileInputStream
|--BufferedInputStream
|--字节输出流
OutputStream
void write(int by):一次写一个字节
void write(byte[] bys,int index,int len):一次写一个字节数组的一部分
|--FileOutputStream
|--BufferedOutputStream
|--字符流
|--字符输入流
Reader
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
|--InputStreamReader
|--FileReader
|--BufferedReader
String readLine():一次读取一个字符串
|--字符输出流
Writer
void write(int ch):一次写一个字符
void write(char[] chs,int index,int len):一次写一个字符数组的一部分
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
void newLine():写一个换行符
void write(String line):一次写一个字符串
7:序列化流(理解)
(1)可以把对象写入文本文件或者在网络中传输
(2)如何实现序列化呢?
让被序列化的对象所属类实现序列化接口。
该接口是一个标记接口。没有功能需要实现。
(3)面试题:
什么时候序列化?
如何实现序列化?
什么是反序列化?
8:Properties(理解)
(1)是一个集合类,Hashtable的子类
(2)特有功能
A:public Object setProperty(String key,String value)
B:public String getProperty(String key)
C:public Set<String> stringPropertyNames()
(3)和IO流结合的方法
把键值对形式的文本文件内容加载到集合中
public void load(Reader reader)
public void load(InputStream inStream)
二、序列化
(1)概念: Java序列化:是指把Java对象转换为二进制的数据流
Java反序列化:是指把字节序列恢复为Java对象的过程。
(2)应用:
一是可以实现数据的持久化,在MVC模式中很是有用;
二是可以对象数据的远程通信。
(3)好处: 好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),
二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
(4)实现:被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写。
三、反射
(1)概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
(2)返回Class类实例的常用方法:
//1.对象.getClass()
Student student = new Student();
Class c1 = student.getClass();
//2.类名.class
Class c2 = Student.class;
//3.Class.forName
Class c3 = Class.forName("com.chinasofti.day16.reflect.Student");