本节内容
1.文件IO方式
2.缓冲流和重定向
3.对象序列化
4.RandomAccess
一、文件IO方式
1.标准I/O方式,输入:从操作系统的高速页缓存写到内存的缓存里。输出:从内存的缓存里写到操作系统的高速页缓存里。
2.直接I/O方式:直接从硬盘里读取,直接写到硬盘里面,不需要中间的高速页缓存。
3.映射I/O方式:操作系统先把磁盘里的数据读到高速页缓存里面,然后在应用缓存里面开辟一个一样大的空间指向这个数据,读取的时候就通过这个高速页缓存读取即可,不需要将它写入到应用缓存里面。同理,输入也是一样的,在高速页缓存里面有一个映射关系,就减少了拷贝的过程。速度就很快。
4.处理流:①访问管道线程通信:线程A下载数据,线程B展示数据,这个时候就需要一个管道将他们连接起来,而且只能是单方向的 ②转换流:把字节转换为字符 ③推回输入流:数据读多了,要将其推回去。
二、缓冲流和重定向
1.处理流:BufferedInputStream/Reader BufferedOutputStream /Writer 注意:当使用处理流读取和输出时,需要使用fllush来刷新流
2.虽然使用处理流比较快,但是它还是要经过以下步骤 ①使用节点流从磁盘将数据读取到内存的缓冲区 ②将内存缓冲区的数据读到处理流对应的缓冲区 ③处理流从处理流的缓冲区将数据读取到对应的地方去
注:当一个文件存在,写入数据时会把之前的删除然后从头开始写。如果你想要从某个位置开始写,那么可以试一试RandomAccess(详情见以下第四大点)
3.所以创建输入流的时候,我们首先要创建 FileInputStream类的对象,然后再创建 InputStreamReader类对象,然后再创建 BufferedReader类的对象,每一个括号里的内容就是前一个创建的对象。同理,创建输出流的时候可以类比。
以下代码为使用处理流来读取数据
String des="C:\\Users\\86178\\Desktop\\file\\1.txt";
String src ="C:\\Users\\86178\\Desktop\\1.txt";
try(//创建输入流
FileInputStream fr=new FileInputStream(src);
InputStreamReader isr= new InputStreamReader(fr);
BufferedReader br=new BufferedReader(isr);
//创建输出流
FileOutputStream fos=new FileOutputStream(des);
OutputStreamWriter osw =new OutputStreamWriter(fos);
BufferedWriter bw=new BufferedWriter(osw)) {
int ch=0;
while (true){
ch=br.read();
if(ch==-1){
break;
}
bw.write(ch);
}
bw.flush();
}catch (Exception e){
e.printStackTrace();
}
还可以把while循环改写一下
while ((ch=br.read())!=-1){
bw.write(ch);
}
4.字节缓冲输入流,采用字节数组的方式,让它运行快一点
public static void Buffered_io_byte(String src,String des){
try {
//字节缓冲输入流
FileInputStream fis = new FileInputStream(src);
BufferedInputStream bis=new BufferedInputStream(fis);
//字节缓冲输出流
FileOutputStream fos= new FileOutputStream(des);
BufferedOutputStream bbs =new BufferedOutputStream(fos);
byte [] buffer =new byte[1024];
int len=0;
while ((len=bis.read(buffer))!=-1){
bbs.write(buffer);
}
bbs.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
5.输出重定向:System.out一般是打印到终端,那么也可以重定向,让它在我们指定的文件里面打印出来。以下代码中的方法的参数是一个地址,也就是目标文件的地址
public static void redirect_out(String des){
try {
FileOutputStream fos= new FileOutputStream(des);
PrintStream ps =new PrintStream(fos);
System.setOut(ps);
System.out.println("Hello World!");
} catch (Exception e) {
e.printStackTrace();
}
}
经过以上的一系列操作,Hello World就不会显示在我们代码下方的终端里面,而是我们指定的文件里面
6.输入重定向:从指定的文件输入,不要从终端输入,然后在终端输出,该方法的参数依然是目标文件路径
public static void redirect_in(String src){
try {
FileInputStream fis= new FileInputStream(src);
Scanner scanner =new Scanner(fis);
while (scanner.hasNext()){
System.out.println(scanner.next());
}
} catch (Exception e) {
e.printStackTrace();
}
}
三、对象序列化
1.保存对象:如果需要将自己定义的类的某个对象使用文件保存,那么这个类必须是实现了Serializable(序列化)接口
public class Person implements Serializable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void saveObject(String des){
try {
FileOutputStream fos =new FileOutputStream(des);
ObjectOutputStream oos= new ObjectOutputStream(fos);
Person p =new Person("jack",23);
oos.writeObject(p);
} catch (Exception e) {
e.printStackTrace();
}
}
2.读取对象
public static void ReadObject(String src){
try {
FileInputStream fos =new FileInputStream(src);
ObjectInputStream ois =new ObjectInputStream(fos);
Person p =(Person)ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
}
四、RandomAccess
1.RandomAccess的构造方法的参数有两种组合。①String 和 String mode ② File 和 String mode 注:Mode有 r ,rw, rws,rwd
2.RandomAccess可以任意访问文件的位置,它可以调用seek()方法来决定从那个位置开始写
public static void randomAccess(String src){
try {
RandomAccessFile raf =new RandomAccessFile(src,"r");
raf.seek(2);
byte[] buffer= new byte[50];
raf.read(buffer);
} catch (Exception e) {
e.printStackTrace();
}
}
它还可以调用writeBytes()写入数据,可以首先定好位置,但是这样就会把原本那个位置的内容覆盖
raf.seek(7);
raf.writeBytes("jack");
OK,以上就是我们今天的全部内容了,再见!
网友评论