Java中的IO流 — BufferedInputStream\BufferedOutputStream、DataInputStream\DataOutputStream、ObjectInputStream\ObjectOutputStream

在介绍字节流之前,我们先看一个File文件类。

【File类】

1. File类的作用是:对磁盘文件进行删除、创建等操作。

2. 常用的三种构造函数:

1 //直接传入一个路径,拿到一个文件或是一个文件夹
2 File file1=new File("H:\\test");
3 
4 //第一个参数传入父路径,第二个参数传入子路径或者文件
5 File file2=new File("H:\\test","text.txt");
6 
7 //第一个参数传入一个父路径的file对象,第二个参数传入子路径或者文件。
8 File file3=new File(file1,"text.txt");

3. File类的常用方法:

file2.equals(file3):比较两个文件是否相等;

file1.getAbsolutePath():取到一个文件的绝对路径;

file2.getParent():取到当前文件或文件夹的父路径;

file1.isFile():检测当前路径是否是文件;

file2.isDirectory():检测当前路径是否是目录;

file2.length():返回当前文件或文件夹的大小;

file1.renameTo():重命名一个文件。要求传入一个新文件名的file对象;

File类的方法还有很多,大家可以自行去帮助文档查看更加详细的方法以及使用。在这里,我就不多介绍了。

【IO流的基本输入、输出流:FileInputStream、FileOutputStream、】

1. 定义输入、输出流:

1 //输入流,第二个参数传入true,表示不清空源文件,在文件末尾处追加新内容。
2 FileInputStream fis=new FileInputStream("H:\\test.txt",true);
3 
4 //输出流,第二个参数传入false或者省略,表示每次写入时将原文件清空,从头开始写入。
5 FileOutputStream fos=new FileOutputStream("H:\\test.txt",false);

2. 读取文件的三种方式:

 1 //按照字节,一个一个字节读取文件
 2 int n=-1;
 3 StringBuffer sb=new StringBuffer();
 4 while((n=fis.read())!=-1){  //判断如果文件中有数据时,追加
 5     sb.append((char)n);
 6 }
 7 System.out.println(sb);
 8 
 9 //将byte数组直接声明为输入流的长度,一次性读出所有文字。
10 byte[] bytes=new byte[fis.available()];  //fis.available()输入流的长度
11 fis.read(bytes);
12 sb.append(new String(bytes));
13 System.out.println(sb);
14 
15 //一次读取1024个字节
16 byte[] bytes=new byte[1024];
17 int n=-1;
18 while((n=fis.read(bytes))>-1){
19     sb.append(new String(bytes));
20 }
21 System.out.println(sb);

 

接下来就介绍今天的重点:IO流中的字节流!!

【BufferedInputStream、BufferedOutputStream】

缓存流。继承自java.io.FilterOutputStream。

1. 作用:在基本流的基础上进行包装,读取或写入文件时,将通过缓存进行。

2. 缓存流的作用:在基本流的基础上,进行包装。

1 //需要用try-catch捕获异常
2 //带缓存的输入流
3 BufferedInputStream  bis = null;
4 bis=new BufferedInputStream(new FileInputStream("H:\\test.txt"));
5 
6 //带缓存的输出流
7 BufferedInputStream  bis = null;
8 bis=new BufferedInputStream(new FileInputStream("H:\\test.txt"));

 

【DataInputStream、DataOutputStream】

1. 采用二进制对文件进行读取操作。

2. 可以直接写入Java中的基本数据类型。

1 //数据输入流
2 DataInputStream dis=null;
3 dis=new DataInputStream(new FileInputStream("H:\\test.txt"));
4 String name=dis.readUTF();  //读取名字
5 
6 //数据输出流
7 DataOutputStream dos=null;
8 dos=new DataOutputStream(new FileOutputStream("H:\\test.txt"));
9 dos.writeUTF(name); //写入名字

 

【ObjectInputStream、ObjectOutputStream】

直接继承自Java.io.OutputStream。

可以用readObject()和writeObject()直接对对象进行操作。

<对象的序列化和反序列化>

1. 对象的序列化:将程序中的对象,持久化的保存在文件中的过程。ObjectOutputStream
    对象的反序列化:将文件中保存的对象,重新读取到程序中的过程。ObjectInputStream

2. 如果,要将对象进行序列操作,那么实体类必须实现可序列化接口。

    当一个实体类,实现可序化接口后,可以添加一个序列化版本号ID。

    添加以后,可以用ID表示序列化和反序列化时操作的对象,是同一个对象。

     如果不添加版本ID,当序列化一个对象后,如果实体类属性有增删,再进行反序列化时,会造成错误。

 1 //对象的序列化
 2 ObjectOutputStream oos=null;
 3 oos=new ObjectOutputStream(new FileOutputStream("H:\\user.txt"));
 4 
 5 //对象的反序列化
 6 ObjectInputStream ois=null;
 7 ois=new ObjectInputStream(new FileInputStream("H:\\user.txt"));
 8 
 9 
10 
11 //实现可序化接口
12 class Person implements Serializable{
13     //序列化版本号
14     private static final long serialVersionUID = -7288772040515730229L;
15 }

 

猜你喜欢

转载自www.cnblogs.com/yanglianwei/p/8903167.html