一、简介
IO流是用来处理设备之间的数据传输的,数据一般储存在设备上
设备:硬盘,光盘,内存等等,内存是临时储存的
Java对数据的操作是采用流的方式
按照操作的数据分为:字节流和字符流
暗照流向:输入流和输出流(相对于内存),读和写
二、字节流
Writer:写,输出流
Reader:读,输入流
字节流2个顶级父类InputStream(输入流)、OutputStream(输出流),它们都是抽象类
FileInputStream(文件输入流类)继承自InputStream(输入流),封装了对文件的读取操作,通过文件路径或者文件对象构造一个FileInputStream(文件输入流类)对象
FileOutPutStream(文件输出流)继承自OutputStream(输出流),封装了对文件的写入操作,通过文件路径或者文件对象构造一个FileInputStream(文件输出流)对象。
InputStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | read( ) | 读取一个字节 |
2 | read(byte[] b) | 读取多个字节至数组b中 |
3 | read(byte[] b, int off, int len) | 读取多个字节至数组从off开始的len个字节中 |
4 | skip(long n) | 跳过n个字节 |
5 | close | 关闭输入流 |
OutputStream提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | write(int n ) | 写入一个字节(注意只写入低8位) |
2 | write (byte[] b) | 写入数组b中的全部字节 |
3 | write (byte[] b, int off, int len) | 写入数组b中从off开始len个字节 |
4 | flush( ) | 刷新输出流,即强制输出(因有缓冲机制) |
5 | close | 关闭输入流 |
FileInputStream(文件输入流类)继承自InputStream(输入流),封装了对文件的读取操作,通过文件路径或者文件对象构造一个FileInputStream(文件输入流类)对象。
FileOutPutStream(文件输出流)继承自OutputStream(输出流),封装了对文件的写入操作,通过文件路径或者文件对象构造一个FileInputStream(文件输出流)对象。
ObjectInputStream(对象输入流)和ObjectOutPutStream(对象输出流)分别封装了其它类型数据的读、写操作,ObjectInputStream(对象输入流)构造函数传递需要InputStream(输入流)子类的对象,ObjectOutPutStream(对象输出流)构造函数传递需要OutPutStrea(输出量)子类的对象。
ObjectInputStream(对象输入流)提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | readInt、readFloat、readLong… | 读取基本类型数据 |
2 | readObject | 读取引用类型数据(需反序列化) |
ObjectOutPutStream(对象输出流)提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | writeInt、writeFloat、writeLong… | 写入基本类型数据 |
2 | writeObject | 写入引用类型数据(需序列化) |
ObjectOutPutStream(对象输出流)向文件中输出123和“abc”,结果如下:
所谓序列化就是将内存中的对象存储到外存上去。反序列化则反之,即将外存中的数据读入到内存中的对象中。
ObjectInputStream(对象输入流)和ObjectOutPutStream(对象输出流)分别封装了其它类型数据的读、写操作,ObjectInputStream(对象输入流)构造函数传递需要InputStream(输入流)子类的对象,ObjectOutPutStream(对象输出流)构造函数传递需要OutPutStrea(输出量)子类的对象。
内存中的数据在关机后就不存在了,而外存的数据是可以永久保存的。比如游戏过程中的保存游戏,就是将某个时刻的游戏状态(比如生命值、金钱、等级等)数据保存到硬盘上;而读取游戏就是根据从文件中恢复游戏的状态。
这些数据可能是一个对象,也可能是多个对象组成的复杂数据,如果逐个将原子数据写入到文件中去,不仅复杂,而且在写入和保存的步骤和数据应该严格一致,否则数据就会错位。
序列化是将对象(不管多么复杂)整体写入文件中,将来也是整体读取,简化了读写操作。
三、字符流
Reader提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | read( ) | 读取一个字符 |
2 | read(char []b) | 读取多个字节至数组b中 |
3 | read(char []b, int off, int len) | 读取多个字节至数组从off开始的len个字节中 |
4 | skip(long n) | 跳过n个字符 |
5 | close | 关闭输入流 |
Writer提供的方法主要有:
序号 | 方法 | 功能说明 |
1 | write(int n ) | 写入一个字符(注意只写入低8位) |
2 | write (char []b) | 写入数组b中的全部字符 |
3 | write (char []b, int off, int len) | 写入数组b中从off开始len个字符 |
4 | write (String str) | 写入字符串中的全部字节 |
5 | write (String str, int off, int len) | 写入字符串中从off开始len个字符 |
6 | flush( ) | 刷新输出流,即强制输出(因有缓冲机制) |
7 | close | 关闭输入流 |
FileReadeer(文件阅读器)和FileWriter(文件输出流)分别实现了Reader和Writer。
缓冲机制用于应用程序和物理数据时降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。比如快递寄送点,并不是每收一个寄件就发送出去,而是收集到一定数量或一定时间后再整体发送。
案例:
C203_03_06_FileWriter
package 第三章_IO操作.C203_03_05_FileWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo {
publicstatic void main(String[] args)throws IOException{
//FileWriter字符输出流
FileWriterfw=new FileWriter("C:\\test5.txt");
fw.write(97);
fw.write("123");
fw.close();
}
}
C203_03_07_FileReader
package 第三章_IO操作.C203_03_06_FileReader;
import java.io.FileReader;
public class Demo {
publicstatic void main(String[] args)throws Exception{
//FileReader字符流
FileReaderfr=new FileReader("C:\\test.txt");
int a=fr.read();
char []str=new char[3];
fr.read(str);
System.out.println(a);
System.out.println(str);
fr.close();
}
}
四、File类
C203_03_08_缓冲机制
package 第三章_IO操作.C203_03_08_缓冲机制;
import java.io.BufferedOutputStream;
import java.io.IOException;
public class Demo {
publicstatic void main(String[] args)throws IOException{
BufferedOutputStream bos=new BufferedOutputStream(System.out,3);
bos.write('a');
bos.write('b');
bos.write('c');
bos.write('d');
bos.write('e');
bos.flush();
bos.close();
}
}
File类封装了对文件和目录的属性操作。目录也可以理解为一种特殊文件,下文中都统一称之为文件。
序号 | 方法 | 功能说明 |
1 | File(String path) | 根据路径构造一个文件 |
2 | getName() | 获取文件名 |
3 | exists() | 判断文件是否存在 |
4 | isDirectory() | 判断是否为目录 |
5 | isFile() | 判断是否为文件 |
6 | length() | 获取文件的大小 |
7 | close | 关闭输入流 |
8 | delete() | 删除文件 |
9 | list() | 列举文件或目录 |
10 | listFiles() | 列举文件 |
11 | mkdir() | 创建目录 |
12 | renameTo | 重命名,实际上也可以实现移动 |
案例:
C203_03_09_文件操作
package 第三章_IO操作.C203_03_07_文件操作;
import java.io.File;
public class Demo {
publicstatic void main(String[] args)throws Exception{
//File文件
Filefile=new File("C:\\test6.txt");
if(!file.exists()){//exists存在
file.createNewFile();//createNewFile创建新文件
}
System.out.println(file.getName());
System.out.println(file.length());
}
}
C203_03_10_目录操作
package 第三章_IO操作.C203_03_10_目录操作;
import java.io.File;
public class Demo {
publicstatic void main(String[] args) {
File dir=new File("C:/dir");
if(!dir.exists()){
dir.mkdir();//创建一个新的子目录
}
File dir1=new File("C:/dir/dir1");
dir1.mkdir();
File dir2=new File("C:/dir/dir2");
dir2.mkdir();
String []dirs=dir.list();
for(Stringd:dirs){
System.out.println(d);
}
}
}