I\O流

Io概述

输入和输出的概念

  • 输入:input
    • 从其他设备到内存的过程
  • 输出:output
    • 内存到其他设备的过程

I\O流

  • 说明:
    • jdk提供的一些比较简单的手段来完成输入和输出,将这些手段封装到某些对象中,称为流对象,I\O流
    • java中操作输入和输出的,都是使用io包中的流类型
I\O分类

在这里插入图片描述

  • 根据上述两种分类方式有四种顶层的抽象父类:

    • 字节流:
      • 字符输入流:InputStream
      • 字节输出流:OutputStream
    • 字符类:
      • 字符输入流:Reader
      • 字节输出流:Writer

    在这里插入图片描述

Io程序书写的注意事项
  • 在程序书写之前:

    • 导包:java.Io.xxx;
  • 书写中:

    • 处理或者声明异常
  • 书写后:

    • 关闭流对象

字节流

概述:
  • 含义:
    • 用于操作中字节数据的流对象
  • 说明:
    • 计算机中的一切数据都是字节数据,因此字节流可以处理一切数据
  • 顶层父类:
    • 字符输入流:InputStream
    • 字节输出流:OutputStream
inputStream

在这里插入图片描述

  • 常用方法:
    • abstract int read()

      • 从输入流中读取数据的下一个字节。
      • 如果因为已经到达流末尾而没有可用的字节,则返回值 -1
    • int read(byte[] b)

      - 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
      
    • int read(byte[] b, int off, int len)

      • 将输入流中最多 len 个数据字节读入 byte 数组。
    • void close()

      • 关闭此输入流并释放与该流关联的所有系统资源。
    • int available()

      • 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
FileinputStream

在这里插入图片描述

  • 方法:
    • 继承自InputStream类

OutputStream

  • 含义:
    • 字节输出流的顶层父类
    • 是一个抽象类
      - **抽象:**
FileOutptStream
  • 说明:
    • 在这里插入图片描述
  • 构造方法摘要
    • FileOutputStream(File file)

      • 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
      • 在这里插入图片描述
    • FileOutputStream(File file, boolean append)

      • 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
      • 如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处(清空该文件写入)
    • FileOutputStream(FileDescriptor fdObj)

      • 创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
    • FileOutputStream(String name)

      • 创建一个向具有指定名称的文件中写入数据的输出文件流。
    • FileOutputStream(String name, boolean append)

      • 创建一个向具有指定 name 的文件中写入数据的输出文件流。

文件拷贝

  • 方式:

    • 使用字节输出输出流
		FileInputStream fis = new FileInputStream("a.txt");
		FileOutputStream fos = new FileOutputStream("a_copy.txt");
		int b;
		while((b = fis.read()) != -1) {//判断a.txt还有没有字节
			fos.write(b);//将字节b写在fos a_copy.txt
		}

文本拷贝效率提升
  • 情况:
    • 字节流拷贝是一个字节一个字节的拷贝,
      需要读取和写出的次数就会非常多,称为“I\o频繁”,效率非常低,速度非常慢
    • 利用数组拷贝,以此将源文件所有的字节,读取到数组中,一次将数组中的字节写到目标文件,效率非常高。(但是这种一般都不太现实,以为要考虑到内存的大小,有的不能一次将文件存储到内存中)
    • 利用小数组,每次拷贝文件的一部分,通过循环,将文件的所有数据拷贝到目标文件
      • 这样的优势:不需要一个字节一个字节的拷贝,拷贝次数少,效率比较高 ,数组长度使用1024的整数倍会比较好分配,一般使用1024*8效率最高
		@SuppressWarnings("resource")
		FileInputStream fis = new FileInputStream("a.txt");
		@SuppressWarnings("resource")
		FileOutputStream fos = new FileOutputStream("a_copy.txt");
		byte[] b = new byte[1024 * 8];
		int len;
		while((len = fis.read(b)) != -1) {
			fos.write(b, 0, len);
		}
		//关流
		fis.close();
		fis.close();

高校缓冲流

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 原理:

    • 在该对象的底层定义了一个大小为8192个字节的数组,当第一次调用read()方法是,本来是读取一个字节,但是Bufferdeinputstream直接读取了8192个字节到数组,并且将第一个字节返回给调用者。第2次~第8192次,读取read()方法时,就不需要再在磁盘中读取啦,可以直接冲数组中取出一个现成的字节返回。和磁盘的交互少了8千多次,效率提高。

    在这里插入图片描述

高效缓冲输出字节流的flush和close方法

在这里插入图片描述
在这里插入图片描述

字符流

使用字节流处理字符
  • 使用直接流写出字符:
    • 可以完成,但是要先将字符串的内容,编码形成字节数组,然后才能通过字节流输出字节数组

在这里插入图片描述

  • 字符流:
    • 字符流也是通过将字符转换成字节后,再利用字节流输出
字符流概述
  • 含义:
    • 可以直接处理字符的流对象,程序员可以通过从字符输入流获取一个完整的字符,写入到目标设备
  • 分类:
    • 字符输入流:reader
    • 字符输出流: writer

Reader

  • 定位:

    • 字符输入流的顶层抽象父类
  • 常用功能:

    • int read()
      • 读取一个完整的字符,并返回,如果返回-1,表示没有读取到任何字符,到达文件末尾
  • int read(char[] cbuf)

      - 将字符读入数组。 
    
  • abstract void close()

    -  关闭该流并释放与之关联的所有资源。 
    
FileReader
  • Reader的一个子类继承Reader所有的方法
  • 在这里插入图片描述
	FileReader fr = new FileReader("a.txt");
	int b;
	while((b = fr.read()) != -1) {
		System.out.println((char)b);
	}
	fr.close();

Writer

  • 字符输出流的顶层父类

  • 常用功能:

    • writer(int c)
      • 将参数指定的字符,写入到目标文件
      • int是32位,只把后面的16位写出,前16被干掉
    • writer(char【】 chs)
      • 将字符数组的全部写写入到目标文件
  • abstract void write(char[] cbuf, int off, int len)

       - 写入字符数组的某一部分。 
    
  • void write(String str)
    - 写入字符串。

  • void write(String str, int off, int len)

    • 写入字符串的某一部分。 
      
FileWriter
  • 定位:
    writer的子类和磁盘文件系统交互,可以将字符写出到文件中

在这里插入图片描述

字符流的拷贝
		FileReader fr = new FileReader("a.txt");
		FileWriter fw = new FileWriter("a_copy.txt");
		int b;
		while((b = fr.read()) != -1) {
			fw.write(b);
		}
		fr.close();
		fw.close();

在这里插入图片描述

  • 字符流拷贝的必要性:
    • 不需要使用字符流拷贝
    • 在这里插入图片描述
      在这里插入图片描述
字符流不能拷贝非文本文件

在这里插入图片描述
在这里插入图片描述

字符高效缓冲流

  • 类型:
    • BufferedReader和BufferedWriter
      在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

字符高效缓冲流的特有方法


在这里插入图片描述

	BufferedReader bf = 
			new BufferedReader(new FileReader("a.txt"));
	BufferedWriter bw =
			new BufferedWriter(new FileWriter("a_copy.txt"));
	String line;
	while((line = bf.readLine()) != null) {
		bw.write(line);
		bw.newLine();
	}
	bf.close();
	bw.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值