1.IO的基本概念
1)什么是I/O:硬件层面来理解的话,就是输入和输出,比如说键盘和鼠标是电脑的输入,而显示屏是电脑的输出
软件层面来理解的话,就是不同存储机制上的数据的读入和写出,比如内存从硬盘中读取
2)I/O流的分类:分为字节流和字符流
字节流:读入或者写出时,以字节为为单位进行数据的读入和写出
字符流:以字符为单位进行数据的读入和写出
3)输入和输出流的概念:输入流是把其他存储机制中的数据读取到内存中
输出流是把内存中的数据读取到其他存储机制
2.输入输出流
1)输入和输出流的基类:字节输入流:inputStream
字符输入流:Reader
字节输出流:OutputStream
字符输出流:Writer
2)FileInputStream和FileOutputStream
文件输入流是一种基本流,他的常用构造方法主要有 FileInputStream(文件地址),(URL)
这个流主要是用来读取文件中的字节数据,如下是通过输入流的read方法来读取文件里的数据
FileInputStream fis = new FileInputStream("text.txt");
//一个一个字节的读,返回值是int值,对应的是文件里第一个字符的ASCALL编码值
int value= fis.read();
System.out.println(value);
FileInputStream fis = new FileInputStream("text.txt"); //通过字节数组来读取,比单个读取的效率高,value值是读取的字节个数 byte[] bytes = new byte[2]; int value = fis.read(bytes);
FileInputStream fis = new FileInputStream("text.txt"); //下面read方法中第二参数代表的是从数组的第一个位置开始读,第三个参数是表示总共要读取多少个 byte bytes[] = new byte[20]; int value =fis.read(bytes, 0, 4);
文件输出流也是一种基本流,以下是它的基本用法FileOutputStream fos = new FileOutputStream("txt.txt"); //输出流也是通过字节数组来写出的,注意输出流的构造方法中传入的文件名可以不存在,但路径必须存在,但是输入流的文件名或者URL地址必须存在 String str = "hello world"; fos.write(str.getBytes());
3)字符的输入输出流的用法与字节输入输出流的用法相似,只不过他是以字符为单位传输的,所以比较适合传输内容中包含中文的FileOutputStream fos = new FileOutputStream("txt.txt"); //write中传入的参数与read中传入的参数一致,write方法没有返回值 String str = "hello world"; byte bytes[] = str.getBytes(); fos.write(bytes,0,2);
3.缓冲流
1)缓冲流的概念:缓冲流其实是一个在内存与其他存储机制之间的一个容器,它可以自动的从其他存储机制中读入数据以便给内存调用,缓冲区是处于内存的,所以
这大大的提高了传输数据的效率
2)BufferedInputStream和BufferedOutputStream
注意:缓冲流是一种包装流,不可以直接使用,只可以与基本流一起使用
注意:缓冲流中传入的是一个基本流对象FileInputStream fis = new FileInputStream("text.txt"); BufferedInputStream bis = new BufferedInputStream(fis); // //通过缓冲流来读取单个字节 // int value =bis.read(); // System.out.println(value); // 通过字节数组来读取字节 // byte bytes[] = new byte[10]; // bis.read(bytes); // //通过偏移量来控制读取的字节的位置和个数 // byte bytes[] = new byte[10]; // bis.read(bytes, 0, 2);
缓冲输出流的用法与以上提到的字节输出流的用法类似,但是有一点不同,字符缓冲流新增了一个方法叫做readline
是用来读取一行文本的操作
还有一点就是,使用了缓冲流后,当需要关闭流时,关闭基本流和缓冲流都可以FileReader fr = new FileReader("text.txt"); BufferedReader br = new BufferedReader(fr); //该方法返回的是一个字符串类型,用起来十分方便 String str = br.readLine(); System.out.println(str);
4.数据流
1)数据流可以对八大数据类型进行文件的读和写操作,按基本数据类型所占的字节来读取,写入
2)读出的时候必须遵循写入的顺序来读取
3)如果说要跳过一些字节来读取后续字节,则可以通过skip方法来实现
4)注意:数据流也是一种包装流,不可以直接使用
5.对象流FileOutputStream fos = new FileOutputStream("test.txt"); DataOutputStream dos = new DataOutputStream(fos); //八大基本数据类型 dos.writeInt(10000);//4 dos.writeByte(128);//1 dos.writeBoolean(true);//1 dos.writeFloat(11.1f);//4 dos.writeDouble(12.111);//8 dos.writeLong(1000000000000000000l);//8 dos.writeShort(1000);//2 dos.writeChar('a');//2 dos.flush(); dos.close(); FileInputStream fis = new FileInputStream("test.txt"); DataInputStream dis = new DataInputStream(fis); //跳过前28个字节 dis.skip(28); //读取最后的char类型的数据 char c = dis.readChar(); System.out.println(c);
1)对象流的作用:可以直接对对象进行读和写操作
2)对象流的劣势:保存的文件比较大,因为对象流会把与数据无关的一些东西同样写入文件中
3)所有跟当前对象相关的类,都要实现serializable接口
ArrayList<String> list = new ArrayList<String>(); list.add("aaa"); list.add("vvv"); list.add("sss"); //直接将对象写入到hello.txt中 FileOutputStream fos = new FileOutputStream("hello.txt"); ObjectOutputStream ops = new ObjectOutputStream(fos); ops.writeObject(list); FileInputStream fis= new FileInputStream("hello.txt"); ObjectInputStream ois = new ObjectInputStream(fis); ArrayList<String> list1 =(ArrayList<String>)ois.readObject(); //遍历list集合,同样可以得到以上数据内容 for (int i = 0; i < list1.size(); i++) { String str = list1.get(i); System.out.println(str); }