Java中的Io操作
I(Input)\O(Outpyt)
1)什么是IO
IO:input,Output java 标准的输入与输出
javaIO是以标准的操作对外界设备进行数据交换并将读写分为输入与输出
IO是顺序读写方式,只能顺序向后进行读或写操作,并且不能同时进行读和写操作
2)为什么需要IO
功能上与RandomAccessFile一样,但是RAF是瑞吉读写模式,而文件流是顺序读写形式
对于读写的灵活度而言不如RAF,但是基于流链接可以完成复杂数据的读写
3)IO的分类
按方向分:输入流和输出流
java.io.InputStream:所有字节输入流的超类
规定了读取字节的相关方法
java.io.OutputStream:所有字节输入出流的超类
规定了写出字节的相关方法
按使用方式分:节点流与处理流,也成为低级流和高级流
节点流:真是连接数据源与程序之间的”管道“,负责实际搬运数据的流,读写一定是建立在节点流
的基础上进行的
处理流:不能独立存在,必须链接在其他流上,使得在读写过程中,当数据流经当前处理流时
对其做某些加工处理,简化我们对数据的相关操作
实际应用中我们会串联一组高级流并最终链接到低级流上,使得对数据的读写以流水线式的加
工读写达到最数据读写的处理。这个过程成为流的链接,也是IO的精髓所在
1.直接复制:
直接复制的思路和RandomAccessFile类的思路相似,代码如下:
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*使用文件流完成文件的复制工作
*
*@author Administrator
*/
public class CopyDemo1{
public static void main(String[] args) throws IOException{
/*
*1:创建文件输入流,用于读取原文件
*2:创建文件输出流,用于写复制文件
*3:循环从原文件读取一组字节并写入
* 到渎职文件中,完成复制工作
*4:关闭两个流
*/
FilInputStream fis = new FileInputStream("music.mp3");
FileOutputStream fos = new FileOutputStream("music_cp2.mp3");
byte[] data = new byte[1020*10];
int len = -1;
while((len = fis.read(data))!=-1 ){
fos.write(data,0,len);
}
System.out.println("复制完毕");
fis.close();
fos.close();
}
}
2)使用缓冲流
如果用上面的操作,就和RandomAccessFile没什么区别了
其实IO提供了缓冲流来提高复制文件的效率。代码如下:
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*缓冲流
*java.io.BufferedOutputStream
*java.io.BufferedInputStream
*缓冲流时一对高级流,在流链接中的作用时加快
*数据的读写效率,(它们会将读写的数据统一转换
*为块读写达到效率提高的目的)
*
*@author Administrator
*/
public class CopyDemo2{
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInpitStream("music.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(music_cp3.mp3);
BufferedOutputStream fos = new BufferedOutputStream(fos)
int d = -1;
long start = System.currentTimeMillis();
while((d = bis.read())!=-1){
bos.write(d);
}
long end = System.currentTimeMillis();
System.out.println("复制完毕!耗时“+(end-start)+"ms");
bis.close();
bos.close();
}
}
3.缓冲流的flush方法:
void flush()
强制将当前缓冲区中已经缓存的字节一次性写出调用flush方法会立即写出一缓存数据提高数
据写出的即时行,但是同样增加了实际写出的此时,从而降低写出效率.代码如下:
package io;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*缓存输出流写出数据的缓存区问题
*
*@author Administrator
*/
public class BOS_FlushDemo{
public static void main(String[] args) throws IOException{
FileOutputStream fos = new FileOutputStream("bos.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
String str = "终是庄周梦了蝶,你是恩赐也是劫”;
byte[] data = str.getBytes("gbk");
bos.write(data);
// bos.flush();
System.out.ptintln("写出完毕")
/*
缓冲流关闭钱会调用一次flush方法
*/
bos.close();
}
}
序列化与反序列化
除了上面的文件复制,java还有一组功能强大的流类型
对象流
java.io.ObjectOutputStream
java.io.ObjectInputStream
对象流是一对高级流,可以读写Java中任何对象
对象输出流负责在写出对象的过程中,将对象按照其结果转换为一组字节(对象序列化)
对象输入流负责在读取对象的过程中将字节还原为对象(对象反序列化)
1.序列化目标Person类
想要序列化对象,需要使用对象流的void writeObject()方法
该方法在写出一个对象时有一个前提条件,要求该对象所属的类必须实现序列化接口
(Serializable)否则会抛出异常
所有我们序列化的目标类Person必须实现Serializable接口。 代码如下
package io;
import java,io.Serualizable;
import java.util.Arrays;
/**
*使用当前类测试对象流的对象读写操作
*
*@author Administrator
*/
public class Person importlements Serializable{
private static final long serialVersionUID= 1L;
private String name;
private int age;
private String gender;
private transient String[] otherInfo;
public Person(String name,int age,String gender,String[] otherInfo)
{
super();
this.name = name;
this.age = age;
this.gender = gender;
this.otherInfo = otherInfo;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getGender(){
return gender;
}
public void setGender(String gender){
this.gender = gender;
}
public String[] getOtherInfo(){
return otherInfo;
}
public void setOtherInfo(String[] otherInfo){
this.otherInfo = otherInfo;
}
public String toString(){
return name +","+age+","+gender+","+Arrays.toString(otherInfo);
}
}
2.序列化操作:
这里流链接的操作分为:
1.先将给定对象通过对象流写出,此时对象流会将该对象转换为一组字节,这个过程成为
序列化
2.序列化后的字节再通过文件流写出了文件。即:写入磁盘中,这个过程成为数据持久化
对象流是一对高级流,可以读写Java中任何对象
对象输出流负责在写出对象的过程中,将对象按照
其结果转换为一组字节(对象序列化)
对象输出流负责在读取对象的过程中将字节还原
为对象(对象饭序列化)
3.饭序列化操作
序列化后的文件可以反序列化为对象
本文地址:https://blog.csdn.net/zjl0821/article/details/111996910
推荐阅读