IO流

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());
 FileOutputStream fos = new FileOutputStream("txt.txt");
    //write中传入的参数与read中传入的参数一致,write方法没有返回值
     String str = "hello world";
     byte bytes[] = str.getBytes();
     fos.write(bytes,0,2);
3)字符的输入输出流的用法与字节输入输出流的用法相似,只不过他是以字符为单位传输的,所以比较适合传输内容中包含中文的

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)注意:数据流也是一种包装流,不可以直接使用

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);
5.对象流

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);
		}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值