输入流/输出流 —— > 介质流 or 字节流 or 原始流
- 传输的是字节
- 用处:作为通道使用
学习时间 7月19日
一、字符流
- 如何读取内部内容? 如何看到文件的内容?比如文本文件————>字符流
- 字符流也是最原始的流 之一,也具有输入/输出的作用
- 输入:
Reader
- 输出:
Writer
- 输入:
1、读取字符流Reader (抽象类)
用于读取文本的内。常用的方法
int read()
——返回值类型是int,一次读一个字节int read(char[] cbuf)
——读取多个字节,和字节流流一样 数组长度是要读的字节数)
字符流的实现类——InputStreamReader(字节流)
-
字节流通向字符流的桥梁
-
使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
-
举个例子
public static void main(String[] args) { try { // 字节流 InputStream inputStream = new FileInputStream("E:\\test.txt"); // 字符流 Reader reader =new InputStreamReader(inputStream); char[] buffer = new char[1024]; // 调用read读取 int len = reader.read(buffer); System.out.println(buffer); // 转换为String存储 String str = new String(buffer , 0 ,len); System.out.println(str); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 输出结果 为文件的内容
2、输出字符流Writer
像文档内添加对应的字符。常用的方法和字节流类似
write(int b)
—— 一个字节一个字节的写入write(byte[] buffer)
—— 写入一个数组
字符流的实现类——OutputStreamWriter(字节流)
-
字符流通向字节流的桥梁
-
举个例子
// =====输出字符流 // 用字节流创建文件 OutputStream outputStream = new FileOutputStream("E:\\huazi.txt"); // 调用字符流 Writer writer = new OutputStreamWriter(outputStream); writer.write("华子就是帅"); // 关闭端口和字节流不同,要先关 字符流 再关 字节流 writer.close(); outputStream.close();
- 注意:关闭端口时,要先关 字符流 再关 字节流
二、字节流的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROivDTgI-1659167875464)(\截图\介质流.jpg)]
-
之前已经学习的,字节流分为输入流和输出流
-
接着可以分为 介质流 (已学了其中的
FileInputStream
)和封装流 -
其中封装类速度更快一些,其中缓存流的速度最快
-
字符流的结构类似
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDMvZbF8-1659167875467)(\截图\字符流分类.png)]
三、封装流/ 包装流 / 过滤流
1、概念
reader/writer 提供的方法存在缺点:少、不方便
介质流/原始流 的缺点:速度慢
- 那么,如何解决这些问题? —— 可以通过封装 ——引出 封装流/ 包装流 / 过滤流
- 就会用到封装流中的 (过滤流
Filter....
中的) 缓存流 即Buffered....
2、如何使用封装流
-
举个例子:使用封装流读取字符
// ======读取字符流 // 字节流 InputStream inputStream = new FileInputStream("E:\\test.txt"); // 字符流 Reader reader = new InputStreamReader(inputStream); // 调用封装流的 缓存字符流 BufferedReader bufferedReader = new BufferedReader(reader); // 可以直接读取出一个字符串 String str = null; // 使用while循环可以读取多行内容 while ((str = bufferedReader.readLine()) != null){ // 当读取到的内容不为空的时候 执行循环体 System.out.println(str); } \`\~ \!\@\#\$\%\^\&\*\(\) \_\+\-\=\[\]\{\}\\\| \;\'\'\:\"\" \,\.\/\<\>\?
- 用到了
BufferedReader.readLine()
,可以直接获得一整行的内容,返回值为字符串 - 用这个方法也可以打印java文件
- 用到了
-
举个例子,使用封装流新建文件
// =====输出字符流 // 用字节流创建文件 OutputStream outputStream = new FileOutputStream("huazi.txt"); // 调用字符流 Writer writer = new OutputStreamWriter(outputStream); // 调用封装流 PrintWriter printWriter = new PrintWriter(writer); // 调用成员方法进行内容的输出 printWriter.println("华仔就是帅"); printWriter.println("华仔酷毙了"); // 关闭端口和字节流不同,要先关 字符流 再关 字节流 writer.close(); outputStream.close();
- 用到了成员方法
PrintWriter.println()
方法,已经封装的方法,可以放置各种类型的内容
- 用到了成员方法
四、IO流小结
一、IO流:分类
- 方向分类:输入和输出
- 传输的内容:字节流和字符流
- 包装的方式:介质流(原始流) / 封装流
二、具体分类
字节流 InputStream / OutputStream
字符流 Writer / Reader
- 对应的实现类
- 文件流:FileInputStream / FileOutputStream FileReader / FileWriter
- 内存流
- 网络流
- 等等。。
三、字节流转换为字符流
字符流 = InputStreamReader ( 字节流)
- 字符流可以进一步封装为
BufferedReader
,更方便读取