字符流是面向字符的流,流中的数据是以16位字符为单位进行读写。 编码:编码是把一个字符串转换为字节数组
String(byte[] bytes, String charsetName) 就是把字符串,通过指定的码表转换成字节数组解码:解码是把字节数组转换成一个字符串
byte[] getBytes(String charsetName) 把字节数组通过指定码表转换成字符串为什么要引入字符流? 每个国家都有自己的编码表,我们国家使用的是GBK编码,而在国外使用的是Unicode,字母的编码表示ASCII码表。正因为各个地方使用的编码表不同,所以国际组织统一了码表UTF-8,汉字使用字节流操作并不是很方便,所以java就提供了字符流。可以指定码表,字符流只能操作文本文件。 字符流 = 字节流 + 码表 字符流的底层还是基于字节流,但是可以指定码表。
OutputStreamWriter: 用来写入数据,是字符流通向字节流的桥梁。它可以指定码表将写入流中的字符编码成字节。它使用的字符集可以由名称指定或者显示给出,如果不给出将使用平台默认的字符集。 构造方法:
OutputStreamWriter(OutputStream out) 把字节流的数据转换成字符流,使用的是平台默认的字符集OutputStreamWriter(OutputStream out,String charsetName) 把字节流的数据转换成字符流,使用指定的字符集。常用方法:
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) 写入一个字符串的一部分字符输出流和字节流一样。如果关联的文件不存在,那么它会自动创建文件。使用字符流每次写入数据都要进行刷新,不然数据不会被写入文件中。
InputStreamReader 用来读取数据,它可以指定码表将字符解码成字节。 构造方法:
InputStreamReader(InputStream is) 用默认的编码(GBK)读取数据InputStreamReader(InputStream is,String charsetName) 指定码表读取数据常用方法:
public int read() 一次读一个字符public int read(char[] cbuf) 一次读一个字符串组,如果没有读到,那么返回-1表示没有读到A:案例演示: 字符流复制文本文件
import sun.nio.cs.ext.GBK; import java.io.*; public class Demo4 { public static void main(String[] args) throws IOException { InputStreamReader in = new InputStreamReader(new FileInputStream("C:/软件/333.txt"),"GBK"); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:/软件/3333.txt"),"GBK"); int len=0; char[] chars = new char[1024]; while ((len=in.read(chars))!=-1){ out.write(chars,0,len); out.flush(); } in.close(); out.close(); } }因为转换流的名字比较长,而我们常见的操作都是按本地默认的编码实现的,所以为了简化我们的书写,转换流提供了对应的子类。
FileWriter 是OutputStreamWriter的子类,与父类的使用方法一致。
构造方法:
FileWriter(File file) 创建一个字符输出流,传入一个关联文件FileWriter(File file, boolean append) 创建一个字符输出流,传入一个关联文件,是否追加FileWriter(String fileName) 创建一个字符输出流,传入一个关联文件的绝对路径FileWriter(String fileName, boolean append) 创建一个字符输出流,传入一个关联文件的绝对路径,是否追加。FileReader 是InputStreamReader的子类,与父类使用方法一致。
构造方法:
FileReader(File file) 创建字符输入流,关联一个文件FileReader(String fileName) 创建字符输入流,传入一个文件的绝对路径字符缓冲流的底层是字符转换流。只能采用了缓冲区的思想。 BufferedReader----------高效字符输入流,用来读取数据 BufferedWriter------------高效字符输出流,用来写入数据
构造方法:
public BufferedWriter(Writer w) 创建一个高效字符输出流,传入的是FileWriter的对象public BufferedReader(Reader e) 创建一个高效字符输入流,传入的是FileReader的对象特有方法:
BufferedWriter: public void newLine() 换行BufferedReader: public String readLine() 每次读取一行数据案例演示: 字符缓冲流的特殊功能复制文本文件
import java.io.*; public class Demo5 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new FileReader("C:/软件/333.txt")); BufferedWriter out = new BufferedWriter(new FileWriter("C:/软件/4444.txt")); String s=null; while ((s=in.readLine())!=null){ out.write(s); out.newLine(); out.flush(); } in.close(); out.close(); } }