字节流、字节流、转换流、打印流

字节流、字节流、转换流、打印流

一. 字符流
  • 概述:
字符流只能操作有文字的文件【纯文本文件】,
  • 字符流的操作原理:
字符输入流: 先把字节从文件中读取出来(使用的字节流读的),根据文件的编码集把字节数变为对应的字符,把字符 读到内存中[解码的过程] 
字符输出流: 先把输出的内容以字符形式写出,把字符根据流中的编码集变成字节数,(使用字节输出流)在把字节写 到目标文件【编码的过程】
  • 注意 :

以后如果我们只是想单纯完成数据搬运的时候,直接使用字节流即可,因为效率高.

如果咱们在搬运数据的时候,需要认为查看,就是用字符流.

1.Reader[字符输入流]
  • 概述:
在读取文本文件时对数据操作使用单位是字符的输入流就是字符输入流 他是字符输入流的顶层父类 他是一个抽象类定义字符输入流的共性功能 想要使用找他的子类设备不一样子类 就不一样 
使用典型子类FileReader
  • 共性功能:
int read():一次读取一个字符 返回值是读到的字符, 读取到文件末尾返回值-1.
int read(char[] ch): 一次读取多个字符,存储到char数组中, 返回值是读到的有效的字符个数,返回值 是-1也表示读取到文件末尾了. 
close():关闭流
1.1 FileReader
  • 概述:

是Reader的子类【孙子辈】,负责内存和磁盘之间字符的读取交互的流,它没有自己的功能,他的功能就是 Reader的功能。

  • 构造方法
FileReader(File file):创建一个以file对象对应的文件为目标文件的字符输入流对象 
FileReader(String path):创建一个以path路径对应的文件为目标文件的字符输入流对象
2.Write[字符输出流]
他是字符输出流的顶层父类,他是抽象类,定义了字符输出流的共性方法,不能使用自己方法【不能创建对 象】只有找子类对象来使用功能,子类根据不同的设备有不同子类。
常用子类:FileWriter 
注意:字符输出流自带缓冲区。
  • 常用方法
write(int c):写出单个字符到磁盘文件 
write(String str):写出字符串到磁盘文件 
write(char[] arr):写出字符数组的全部字符到磁盘文件 
write(char[] arr, int offset, int len):写出字符数组的部分字符到磁盘文件 
offset:写出的开始字符的索引值 
len:写出的字符的长度【个数】 
不能大于数组长度-开始索引【offset】 
close():关闭流资源
flush():刷新缓冲区
2.1 FileWrite
  • 概述

他是Writer的间接子类[孙子辈],负责完成内存和磁盘之间字符数据输出交互的流,他没有自己的功能,都是 Writer的功能

  • 构造方法
FileWriter(File file): 创建以File对象对应的文件为目标文件的字符输出流对象 
FileWriter(String path): 创建以path路径对应的文件为目标文件的字符输出流对象
  • 注意事项
1、字符输出流创建对象的时候检查目标文件在磁盘中是否存在: 
存在:不会自动的创建空白文件,但是会对文件做格式化处理 
不存在:系统自动创建一个空白文件出来【文件所在目录必须存在】
  • 追加功能
FileWriter(File file,boolean b)FileWriter(String path,boolean b): 
注意:参数b必须传入true为续写
二. 字符缓冲流[高效字符输入输出流]
  • 概述:
就是用来给字符流提升效率的一个流,他可以理解为就是一个对普通字符流进行包装的工具流。本身没有操作 数据的功能,但是结构衍生了可以操作流的功能,属于他特有功能.

分类:
字符输入缓冲流【BufferedReader】 增强普通字符输入流 FileReader 
字符输出缓冲流【BufferedWriter】 增强普通字符输出流 FileWriter
    
构造方法:
BufferedReader(Reader r) :创建一个提升指定字符输入流r的效率的字符输入缓冲流对象 BufferedWriter(Writer w) : 创建一个提升指定字符输出流w的效率的字符输出缓冲流对象
    
特有方法:
字符输入缓冲流【BufferedReader】: 
    String readLine():一次读取一行的数据【行不是屏幕上看到的行】 读取文件末尾的标志,返 回null 

字符输出缓冲流【BufferedWriter】: 
    newLine():换行    效果和写出字符串 "\r"或"\n
    
  • 字符缓冲流高效的原理
字符输入缓冲流BufferedReader: 
当使用字符输入缓冲流读取字符的时候,首先缓冲流对象在内存中创建一个8192大的字符数组,然后一次性的到目标 文件读取8192个字符回来存到字符数组中,然后内部的字符输入流每次根据调用的读取方法到字符数组中读取对应的 个数到内存中,减少了内存和目标文件(硬盘)的交互次数,提高效率。 

字符输出缓冲流BufferedWriter 当使用字符输出缓冲流往外写字节的时候,首先缓冲流对象在内存中创建一个8192大的字符数组,字符输出流每次根 据调用write方法把要写出的字符数写到字符数组中,如果字符数组被写满了自动的一次性写到目标文件中【清空字 节数组再次的写】,减少了内存和目标文件(硬盘)的交互次数,提高效率。

三. 转换流[重点]

  • 概述:

他是字符流子类,转换流本质是字符流,只能操作纯文本文件,他可以对字符流的编码集进行指定转换。

  • 作用:
  1. 指定io流的操作的使用编码集
  2. 完成字节流和字符流的相互转换
  • 分类
输入转换流【InputStreamReader】 字节流通向字符流的桥梁
输出转换流【OutputStreamWriter】字符流转为字节流的桥梁
    
    
    创建时候使用它提供的构造方法: 
	InputStreamReader(InputStream is, String charsetName),传入一个字节输入流,把字节输入流 读取到的字节信息使用指定字符集名称转为字符.就可以避免读取操作的乱码.
        
    OutputStreamWrtier(OutputStream os, String charsetName),传入字节输出流,把要写出的字符 信息,使用指定字符集转为字节数据,再使用字节流把字节数据写到目标文件.避免写出数据是乱码的出现.
3.1 InputStreamReader【输入转换流】
//举例
// 创建字节输入流
FileInputStream fis = new FileInputStream("day20/c/2.txt"); 
String charsetName = "gbk"; // 读取的文件字符集是GBK, 是以GBK的方式读取字节,读取到java程序中.
InputStreamReader isr = new InputStreamReader(fis, charsetName); 
	int i = 0; 
	while ((i = isr.read()) != -1) { 
   	 System.out.println((char)i); 
	}
	isr.close();
	fis.close();
3.2 OutputStreamWriter[输出转换流]
//举例
FileOutputStream fos = new FileOutputStream("day20/c/3.txt", true); 
String charsetName = "GBK"; // 使用指定字符集把要写的数据转为字节信息,此时写出时使用字符集是GBK,
OutputStreamWriter osw = new OutputStreamWriter(fos, charsetName); 
osw.write('哈哈'); 
osw.write("是真爱"); 
osw.close();
fos.close(); 
}
  • 总结:
1.如果操作IO操作文件字符集和java程序字符集一致的时候,就没有必要使用这两个流. 

2.当IO操作字符集和Java程序不一致时,就要使用InputStreamReader读取文件,只要保证读取时指定
字符集和目标文件字符集一致即可. 写出时候就要使用OutputStreamWriter,,只要保证写出时指定字
符集和目标文件字符集一致即可

无论是转换输入流,还是转换输出流, 指定字符集的时候,都是参考要操作的文件字符集来设置, 文件
是什么字符集,就指定什么字符集.
3.3 标准输入输出流
  • 标准输入流
System.in:
	该流的类型为InputStream,属于是字节流,默认关联的设备为键盘,即数据源为键盘 
		如何提供标准输入的输入能力: 
		使用转换流InpuStreamReader可以包装成字符流,使用BufferedReader可以包装成缓 冲流 通过

    //举例
// 修改标准输入流关联的位置 
// 先修改关联的位置 
System.setIn(new FileInputStream("day20/a/1.txt"));
	// 再获取标准输入流 
	InputStream in = System.in; 
	int i = 0; 
	while ((i = in.read()) != -1) {
   	 	System.out.println((char)i);
	}

System.setIn(InputStream in),可以更改标准输入流关联的设备 
该流对象不需要关闭 
修改关联设备注意事项:
1.先修改关联设备 
2.再获取标准输入流
    
    
    //举例
// 增强标准输入流读取能力 
// BufferedReader readLine
// BufferedReader只能增强字符流,不能直接增强System.in(标准输入流,字节流) 
// InputStreamReader 字节流通向字符流的桥梁,它就可以把字节流包装为字符流 
// 使用它的构造方法: InputStreamReader(InputStream is) 
    InputStreamReader isr = new InputStreamReader(System.in); 
	BufferedReader br = new BufferedReader(isr); 
	System.out.print("请录入一个字符串:"); 
	String msg = br.readLine(); 
	System.out.println(msg); 
	br.close(); 
	isr.close();
  • 标准输出流
System.out:
该流的类型为PrintStream,属于字节流,是字节打印流。是OutputStream的孙子辈类 
默认关联的设置是控制台,即可以将数据直接写到控制台显示 
通过System.setOut(OutputStream out),可以更改标准输出流关联的设备 
修改关联设备注意事项: 
1.先修改关联设备 
2.再获取标准输出流
//举例
// 修改标准输出流关联的位置 
// 只能传入打印流PrintStream对象, 可以使用修改位置的方式,自己制作日志功能. 
	System.setOut(new PrintStream("day20/a/10.txt")); 
	System.out.println("你好"); 
	System.out.println(new Date()+"程序出现了bug");

更改标准输出流关联的设备
修改关联设备注意事项:
1.先修改关联设备
2.再获取标准输出流

//举例
// 修改标准输出流关联的位置 
// 只能传入打印流PrintStream对象, 可以使用修改位置的方式,自己制作日志功能. 
	System.setOut(new PrintStream("day20/a/10.txt")); 
	System.out.println("你好"); 
	System.out.println(new Date()+"程序出现了bug");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值