java io可以让我们用标准的读写操作来完成对不同设备的读写数据工作.
IO流的分类:
按照数据的流向分为:输入流和输出流
输入:用来读取数据的,是从外界到程序的方向,用于获取数据. 输出:用来写出数据的,是从程序到外界的方向,用于发送数据.
按照读写单位划分为:字节流和字符流
字节输入流 InputStream:是所有字节输入流的超类
字节输出流 OutputStream:是所有字节输出流的超类
字符输入流 Reader:是所有字符输入流的超类
字符输出流 Writer:是所有字符输出流的超类
文件流
文件流主要分为:文件字节输入流、文件字节输出流、文件字符输入流、文件字符输出流
文件字节输入流(FileInputStream):按照字节方式读取文件
例:读取C盘下一个名为test.txt的文件
public class FileInputStreamTest01 {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("c:\\test.txt");
int b = 0;
while ((b = is.read()) != -1) {
//输出字符
System.out.print((char)b);
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if (is != null){
is.close();
}
}catch(IOException e) {}
}
}
}
文件字节输出流(FileOutputStream):按照字节方式写文件
例:文件的复制。先读取文件,读取后在将该文件另写一份保存到磁盘上完成备份。
public class FileOutputStreamTest01 {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("c:\\test.txt");
OutputStream os = new FileOutputStream("d:\\test.txt.bak");
int b = 0;
while ((b = is.read()) != -1) {
os.write(b);
}
System.out.println("文件复制完毕!");
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally {
try {
if (is != null){
is.close();
}
if (os != null) {
os.close();
}
}catch(IOException e) {}
}
}
}
文件字符输入流(FileReader):以字符为单位读取文件。
文件字符输出流(FileWriter):以字符为单位写文件。
缓冲流
字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
缓冲流的作用:
使用缓冲数组以后,整体的读取,写入效率提升很大。
降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。
对象流
对象流是一种高级流,可以方便我们将java中的任何对象进行读写操作。
java.io.objectoutputstream
对象输出流,可以将对象转换为一组字节写出。
java.io.objectinputstream
对象输入流,可以读取一组字节转换为原对象,还原为原对象的条件是读取这个字节应该是对象输出流将一个对象转换的字节。
对象输出流(写)
ObjectOutputStream 提供了writeObject(object obj);oos将对象转换为字节后 将这组字节交给
fos写入文本等于写到硬盘, 这个过程称之为“数据持久化”; oos将给定的对象pdd转为一组字节,
这个过程称之为“对象序列化”;简单来讲“对象序列化”就是将对象写入文本中,称之为对象"序列
化".
对象输入流(读)
读取一组字节转换为原对象,称为对象的“反序列化”.
ObjectInputStream提供了一个方法是readObject()返回一个object对象.
序列化:
什么是序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:当我们想把序列化后的字节重新恢复成对象时,就需要将该字节文件进行反序列化。这样把字节序列恢复为对象的过程称为对象的反序列化。
为什么要序列化:
java对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态保存下来,并且可以在需要时再将对象恢复,而序列化就是一个保存对象的一个方法。
如何实现序列化?
实现序列化要求实现Serializable接口,实现Serializable接口并不会要求实现任何方法,仅用于标识该类可序列化。
transient关键字:当我们希望某些变量不被序列化时,那么就需要用transient关键字来声明该变量。
序列化中的继承问题:
- 当一个父类实现序列化,其子类自动实现序列化,不需要显式实现Serializable接口。
- 一个子类实现了 Serializable 接口,若其父类没有实现 Serializable 接口,要想将父类对象也序列化,就需要让父类实现Serializable 接口。