Writer:字符输出流基类
- 结构图
OutputStreamWriter 字符输出流
-
概述
转换流 java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥接器。
它使用指定的字符集将字符编码为字节。它使用的字符集可以由名称指定,也可以接受平台的默认字符集。 -
构造方法
构造方法 描述 OutputStreamWriter(OutputStream out) 创建使用默认字符编码的OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的OutputStreamWriter public class Demo { public static void main(String[] args) throws IOException { OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"));//默认UTF-8 //写数据 osw.write("西琳"); //关闭流 osw.close(); } } ---*--- 输出结果: 西林 被写入当前项目的目录下的1.txt文件中
public class Demo { public static void main(String[] args) throws IOException { OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"),"GBK"); //写数据 osw.write("西琳"); //关闭流 osw.close(); } } ---*--- 输出结果: ���� 被写入当前项目的目录下的1.txt文件中
注意:该类将字符通过对应的字符集转换为一系列字节,存储到目的地。当“西琳”两个字符通过GBK字符集编码存放到文件中,该文件需支持GBK编码才能正常显示“西琳”,否则显示乱码。
-
写数据方法
方法名 描述 void write(int c) 写一个字符 void write(char[] cbuf) 写入一个字符数组 void write(char[] cbuf, int off, int len) 写入字符数组的一部分 void write(String s) 写一个字符串 void write(String s, int off, int len) 写入字符串的一部分 public class Demo{ public static void main(String[] args) throws IOException { OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("1.txt"),"gbk"); //写一个字符 // osw.write(97); //写一个字符数组 // char[] cs = {'a','b','c','d','e'}; // osw.write(cs); //写字符数组的一部分 // char[] cs = {'a','b','c','d','e'}; // osw.write(cs,1,3); //写一个字符串 // osw.write("abcde"); //写字符串的一部分 // osw.write("abcde",1,3); //刷新流 // osw.flush(); //关闭流 osw.close(); } } ---*--- 输出结果: a abcde bcd abcde bcd
-
刷新流 / 关闭流
方法名 描述 flush() 刷新缓冲区,还可以继续写数据 close() 关闭流,释放资源,但关闭之前会刷新流。一旦关闭不能在写数据
FileWriter 写入字符文件的便捷类
-
概述
由于转换流的名字较长,而且一般情况都是按照本地默认编码实现的,所以为了简化书写,转换流提供了对应的子类。 -
构造方法
构造方法 描述 FileWriter(String fileName) 创建写入字符便捷类对象,并指向文件 FileWriter(File file) 创建写入字符便捷类对象,并指向文件 FileWriter(String fileName ,boolean append) 创建写入字符便捷类对象,并指向文件。还可选择追加写入 FileWriter(File file ,boolean append) 创建写入字符便捷类对象,并指向文件。还可选择追加写入 -
复制文件对比
直接使用转换流public class Demo{ public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_test\\src\\com\\file\\testFile.java")); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("copy.java")); //复制文件 char[] cs = new char[1024]; int len; while ((len=isr.read(cs))!=-1){ osw.write(cs); } //关闭流 isr.close(); osw.close(); } } ---*--- 输出结果: 文件复制成功
使用便捷类
public class Demo{ public static void main(String[] args) throws IOException { FileReader fr = new FileReader("idea_test\\src\\com\\file\\testFile.java"); FileWriter sw = new FileWriter("copy.java"); //复制文件 char[] cs = new char[1024]; int c; while ((c= fr.read(cs))!=-1){ sw.write(cs); } //关闭流 fr.close(); sw.close(); } } ---*--- 输出结果: 文件成功复制
BufferedReader 字符缓冲输入流
-
概述
和字节缓冲流一样,该类为字符输出流提供一个可设置大小的缓冲区,先将数据写入缓冲区,之后再一次写入内存中。注意:真正的读数据还是字符输出流,该类仅提供一个缓冲区。 -
构造方法
构造方法 描述 BufferedReader(Reader in) 创建使用默认大小的输入缓冲区的缓冲字符输入流 BufferedReader(Reader in, int sz) 创建使用指定大小的输入缓冲区的缓冲字符输入流 -
缓冲字符流复制文件
public class Demo{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("idea_test\\src\\com\\file\\testpoker.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("idea_test\\copy.java")); //一次复制一个字符 // int c = 0; // while ((c=br.read())!=-1){ // bw.write(c); // } //一次复制一个字符数组 char[] cs = new char[1024]; int len; while ((len=br.read(cs))!=-1){ bw.write(cs); } //关闭流 br.close(); bw.close(); } } ---*--- 输出结果: 文件均复制成功
字符缓冲输出流特有功能
-
void newLine():写一个系统属性定义的行分隔符
public class Demo{ public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\360sd\\2.txt")); BufferedReader br = new BufferedReader(new FileReader("e:360sd\\1.txt")); //一次读写一行字符 String str; int len; while((str=br.readLine())!=null){//读一行字符(不包括换行符) bw.write(str); //写入一个字符串 bw.newLine(); //写入一个当前系统的换行符 bw.flush(); //刷新流 System.out.println(str);//用于查看结果 } //关闭流 br.close(); bw.close(); } } ---*--- 输出结果: 1你好世界! 2你好世界! 3你好世界! 4你好世界!
Reader :字符输入流基类
- 结构图
InputStreamReader 字符输入流
-
概述
转换流 java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥接器。
它使用指定的字符集读取字节并将它们解码为字符。它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。 -
构造方法
构造方法 描述 InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader InputStreamReader(InputStream in, String charsetName) 创建一个使用指定字符集的InputStreamReader public class Demo{ public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"));//默认UTF-8 //读数据 int ch = 0; while((ch=isr.read())!=-1){ System.out.print((char) ch); } //关闭流 isr.close(); } } ---*--- 输出结果: 西琳
public class Demo{ public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt"),"GBK"); //读数据 int ch = 0; while((ch=isr.read())!=-1){ System.out.print((char) ch); } //关闭流 isr.close(); } } ---*--- 输出结果: ����
注意:该类将字节通过对应的字符集读取并转换为字符,读取到程序中。当“西琳”两个字符通过UTF-8字符集编码存放到文件中,读取该文件也需要使用UTF-8字符集编码才能正常显示“西琳”,否则显示乱码。
-
读数据方法
方法名 描述 int read() 读一个字符数据 int read(char[] cbuf) 读一个字符数组数据 int read(char[] cbuf, int offset, int length) 读一个字符数组的一部分 public class Demo{ public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("1.txt")); //读一个字符 // int ch; // while ((ch=isr.read())!=-1){ // System.out.print((char)ch); // } //读一个字符数组 char[] cs = new char[5]; int len; while ((len=isr.read(cs))!=-1){ System.out.println(new String(cs,0,len)); } //关闭流 isr.close(); } } ---*--- 输出结果: abcd abcd
FileReader 读取字符文件的便捷类
-
概述
由于转换流的名字较长,一般情况都是按照本地默认编码实现的,所以为了简化书写,转换流提供了对应的子类。 -
构造方法
构造方法 描述 FileReader(String fileName) 创建读取字符便捷类对象,并指向文件 FileReader(File file) 创建读取字符便捷类对象,并指向文件 -
复制文件对比
直接使用转换流public class Demo{ public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("idea_test\\src\\com\\file\\testFile.java")); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("copy.java")); //复制文件 char[] cs = new char[1024]; int len; while ((len=isr.read(cs))!=-1){ osw.write(cs); } //关闭流 isr.close(); osw.close(); } } ---*--- 输出结果: 文件复制成功
使用便捷类
public class Demo{ public static void main(String[] args) throws IOException { FileReader fr = new FileReader("idea_test\\src\\com\\file\\testFile.java"); FileWriter sw = new FileWriter("copy.java"); //复制文件 char[] cs = new char[1024]; int c; while ((c= fr.read(cs))!=-1){ sw.write(cs); } //关闭流 fr.close(); sw.close(); } } ---*--- 输出结果: 文件成功复制
BufferedWriter 字符缓冲输出流
-
概述
和字节缓冲流一样,该类为字符输出流提供一个可设置大小的缓冲区,先将数据写入缓冲区,之后再一次写入内存中。注意:真正的读数据还是字符输出流,该类仅提供一个缓冲区。 -
构造方法
构造方法 描述 BufferedWriter(Writer out) 创建使用默认大小的输出缓冲区的缓冲字符输出流 BufferedWriter(Writer out, int sz) 创建一个使用给定大小的输出缓冲区的新缓冲字符输出流 -
缓冲字符流复制文件
public class Demo{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("idea_test\\src\\com\\file\\testpoker.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("idea_test\\copy.java")); //一次复制一个字符 // int c = 0; // while ((c=br.read())!=-1){ // bw.write(c); // } //一次复制一个字符数组 char[] cs = new char[1024]; int len; while ((len=br.read(cs))!=-1){ bw.write(cs); } //关闭流 br.close(); bw.close(); } } ---*--- 输出结果: 文件均复制成功
字符缓冲输入流特有功能
-
public String readLine():读一行字符。不包括任何终止字符,如果读到流的结尾,则返回null。
public class Demo{ public static void main(String[] args) throws IOException { BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\360sd\\2.txt")); BufferedReader br = new BufferedReader(new FileReader("e:360sd\\1.txt")); //一次读写一行字符 String str; int len; while((str=br.readLine())!=null){//读一行字符(不包括换行符) bw.write(str); //写入一个字符串 bw.newLine(); //写入一个当前系统的换行符 bw.flush(); //刷新流 System.out.println(str);//用于查看结果 } //关闭流 br.close(); bw.close(); } } ---*--- 输出结果: 1你好世界! 2你好世界! 3你好世界! 4你好世界!
总结
1.字符流本质是转换流,通过查询编码表实现字符与字节转换。既然是转换流那么就可以指定转换编码。
2.字符缓冲流这套装备除了让字符流更强大以外还提供了特有功能。(读取一行字符串和写入行分隔符,newLine / readLine)
3.字符流写数据都需要刷新缓冲区。