Java中的IO流之字节流
在介绍字节流之前,我们先看一个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 }