IO流(三)
字符流(掌握)
1、字节流操作中文数据不是特别的方便,所以就出现了转换流。 转换流的作用就是把字节流转换字符流来使用。 2、转换流其实是一个字符流 字符流 = 字节流 + 编码表 3、编码表 A:就是由字符和对应的数值组成的一张表 B:常见的编码表 ASCII ISO-8859-1 GB2312 GBK GB18030 UTF-8 C:字符串中的编码问题 编码 String -- byte[] //通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 a:String(byte[] bytes) //通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。 b:String(byte[] bytes, String charsetName) 解码 byte[] -- String a:byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 b:byte[] getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。 4、IO流中的编码问题(字节流转换为字符流) A:OutputStreamWriter a:OutputStreamWriter的构造方法: OutputStreamWriter(OutputStream os):默认编码,GBK OutputStreamWriter(OutputStream os,String charsetName):指定编码。 b:OutputStreamWriter的方法: public void write(int c):写一个字符 public void write(char[] cbuf):写一个字符数组 public void write(char[] cbuf,int off,int len):写一个字符数组的一部分 public void write(String str):写一个字符串 public void write(String str,int off,int len):写一个字符串的一部分 c:面试题:close()和flush()的区别? close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。 flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。 B:InputStreamReader a:InputStreamReader的构造方法: InputStreamReader(InputStream is):默认编码,GBK InputStreamReader(InputStream is,String charsetName):指定编码 b:InputStreamReader的方法: int read():一次读取一个字符 int read(char[] chs):一次读取一个字符数组 C:编码问题其实很简单 编码只要一致即可 5、字符流 Reader |--InputStreamReader |--FileReader |--BufferedReader BufferedReader字符缓冲流的特殊方法:String readLine(); //一次读取一个字符串 Writer |--OutputStreamWriter |--FileWriter |--BufferedWriter BufferedReader字符缓冲流的特殊方法:void newLine(); //写一个换行符 void write(String line); //一次写一个字符串 6、复制文本文件(5种方式)
IO流小结(掌握)
IO流 |--字节流 |--字节输入流 InputStream int read():一次读取一个字节 int read(byte[] bys):一次读取一个字节数组 |--FileInputStream |--BufferedInputStream |--字节输出流 OutputStream void write(int by):一次写一个字节 void write(byte[] bys,int index,int len):一次写一个字节数组的一部分 |--FileOutputStream |--BufferedOutputStream |--字符流 |--字符输入流 Reader int read():一次读取一个字符 int read(char[] chs):一次读取一个字符数组 |--InputStreamReader |--FileReader |--BufferedReader String readLine():一次读取一个字符串 |--LineNumberReader public int getLineNumber():获得当前行号 public void setLineNumber(int lineNumber) |--字符输出流 Writer void write(int ch):一次写一个字符 void write(char[] chs,int index,int len):一次写一个字符数组的一部分 |--OutputStreamWriter |--FileWriter |--BufferedWriter void newLine():写一个换行符 void write(String line):一次写一个字符串
案例(理解 练习一遍)
A:复制文本文件 5种方式(掌握) /* * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中(要求换行) * * 数据源: * a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader * 目的地: * b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException { // 封装数据源 BufferedReader br = new BufferedReader(new FileReader("a.txt")); // 封装目的地 BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); // 读写数据 String line = null; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } // 释放资源 bw.close(); br.close(); } } B:复制图片(二进制流数据) 4种方式(掌握) C:把集合中的数据存储到文本文件 D:把文本文件中的数据读取到集合并遍历集合 E:复制单级文件夹 F:复制单级文件夹中指定的文件并修改名称 回顾一下批量修改名称 G:复制多级文件夹 H:键盘录入学生信息按照总分从高到低存储到文本文件 I:把某个文件中的字符串排序后输出到另一个文本文件中 J:用Reader模拟BufferedReader的特有功能 K:模拟LineNumberReader的特有功能