IO流(2)字符流
字符流
介绍:字符流和字节流的区别就是,字符流是按字符为单位读取的,字节流是按字节为单位读取的,字符流只能读取文本,不能读取文件。字符流比较i聪明,当他读取文本的时候碰见英文就读取一个字节碰见汉字的时候就读取多个字节。
编码表介绍
常用编码表
UTF-8 开发常用编码表,中文在这个码表里面占3个字节(中文在码表中表示的字节为负数)
GBK window系统默认码表
什么是编码表,为什么会有编码表?
为什么会有码表呢?因为我们硬盘只能存储二进制介绍只能存储0和1,我们是不能看见中文,数组字母,符号,但是码表上面有中文,数字,字母,符号,我们硬盘保存的二进制就会取找他默认的码表,找到对应他的那个字符,然后显示在我们屏幕上面。
乱码造成原因
我们有时会发现,我们利用字符流读取文件内容打印到控制台会乱码,这是因为我们的工具默认的码表为utf-8而我们的文件的编码为GBK,GBK码表中中文为两个字节,而utf-8码表中中文为3个字节,而我们读取是按字符为单位,因为文件是GBK编码的,在GBK码表中文为两个字节,所以我们利用字符流读取一个字符读取到的就是两个字节,而我们的工具默认utf-8编码表,中文是3个字节,可他只读取了两个字节过来,少了一个字节,所以就找不到对应的字符,从而造成乱码。
常用字符流
FileReader 字符输入流
FileWriter 字符输出流
BufferedReader 字符缓冲输入流
BufferedWriter 字符缓冲输出流
InputStreamReader
OutputStreamWriter
PrintWriter 打印流
注意:在字符流中,以Reader结尾的为输入流以Writer结尾的为输出流,字符流是以字符为单位读取的。
字符输入流的父类接口为 Reader
字符输出流的父类接口为 Writer
FileWriter
构造方法
FileWriter(File file) 如果file关联的文件不存在,则会创建该文件
FileWriter(String fileName,boolean append)
FileWriter(String fileName) 使用一个文件路径作为参数,如果该文件不存在则会创建该文件
FileWriter(String fileName,boolean append) 如果append为false就会默认清空文件内容,如果为true则不会清空文件内容,会直接在文件后面添加新的内容
常用方法介绍
void writer(String s) 写入一个字符串到字定文件(该方法有很多,重载方法功能都一样)
void writer(char[] arr)
void writer(int i)
FileWriter writer = new FileWriter("Day10/b.txt"); //把我爱java写入文件 writer.write("我爱java"); writer.close();
void close() 关闭流 ,如果流用完了流需要关闭流,释放资源
FileReader
构造方法
FileReader(File file) 如果参数file指定的文件不存在或者为一个文件夹,就会抛出异常
FileReader(String fileName) 如果参数给我定的路径不存在或者为一个文件夹,就会抛出异常
常用方法
int reader(char[] arr) 读取参数指定文件,一次读取一个字符数组,返回读取的字符数组个数,如果文件读取完毕就返回-1
//创建字符输入流对象,关联一个文件 FileReader reader = new FileReader("aaa.txt"); char[] chars = new char[1024]; //在文件里面读取一个1024个字符 int len = reader.read(chars); reader.close();
int reader() 一次读取一个字符,返回字符的int值(由于效率太低,不常用)
//创建字符输入流对象,关联一个文件 FileReader reader = new FileReader("aaa.txt"); //一次读取一个字符 int len = reader.read(); System.out.println((char)len); reader.close();
BufferedWriter 字符缓冲输出流
介绍:字符缓冲输出流比FileWriter的效率要高,输出速度要比FileWriter要快,因为BuuferedWriter底部默认有一个字符数组长度为8192,我们把这个数组叫为缓冲区,我们向文件写入void符不是直接向文件中写入,而是先写入这个缓冲区,等缓冲区存储满了,然后一次性写入文件,如果缓冲区true有满他就不会把内容写入到文件中,除非我们调用了flush和colse方法。
构造方法
BufferedWriter(Writer writer) 参数为一个字符输出流的子类
常用方法
void writer(String s) 这个方法和FileWriter的方法一样,也具有他的从载方法
void newLing() 在文件中间写入一个换行
BufferedReader 字符缓冲输出流
构造方法
BufferedReader(Reader reader) 参数为一个Reader的子类对象
常用方法
String readerLine() 一次读取文本中的一行
BufferedReader bufferedReader = new BufferedReader(new FileReader("aaa.txt")); //一次读取文本中的一行内容 如果把文件内容读取完了就返回null String s = bufferedReader.readLine(); bufferedReader.close();
InputStreamReader 转换流
介绍:该流可以按照指定编码表读取文件,使读取获得到的字符不会乱码。
构造方法
注意:他构造方法的参数不是Reader的子类而是InputStream的子类
InputStreamReader(InputStream in,String charsetName) 按指定编码表去读取文件内容,最好是文件是什么编码就使用什么编码表去读,如果不设置默认编码表为utf-8
//按照GBK编码表去读取aaa.txt文档的内容 如果aaa.txt文档是使用utf-8编码的这样读取就会造成乱码 InputStreamReader Reader = new InputStreamReader(new FileInputStream("aaa.txt"),"GBK");
他的其他方法和FileReader的方法一样,在这里就没重复写了
OutputStreamWriter
介绍:可以按照指定编码表格式把字符串写入文件
构造方法
OutputStreamWriter(OutputStream out, String charsetName) 按照指定编码把数据写入文件,可以不写默认UTF-8编码表。
//创建转换流对象,按照GBK编码表写数据到文件中 OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("Day10/aaa.txt"),"GBK"); //把我爱java写入文件中 如果这个文件用我们的开发工具打开会乱码的因为我们是按照GBK编码表写进去的而我们的开发工具默认UTF-8 writer.write("我爱java"); writer.close();
其他方法和FileWriter方法一样就不再重复介绍了.
PrintWriter 字符对应流
介绍:这个字符打印流和PrintStream差不多,构造方法比PrintStream多了几个,可以按照指定的编码表把数据写入文件
构造方法
PrintWriter(File file,String charsetName) 传入一个File类对象,后面一个参数为写入文件内容的编码格式 ,如果不写默认utf-8
PrintWriter(Writer writer, Striing charsetName) 前面一个为Writer类的实现类,后面一个参数为写入文件的编码格式,不写默认utf-8
PrintWriter(OutputStream out , String charsetName) 可以传入一个字节输出流对象,后面一个参数是写入文件的编码格式,不写默认utf-8
常用方法
void print(String s) 写入字符串指定的文件中
PrintWriter printWriter = new PrintWriter("Day10/aaa.txt","GBK"); printWriter.print("哈哈哈哈哈哈哈"); printWriter.close();
void println(String s) 写入字符串到文件中并换一行
PrintWriter printWriter = new PrintWriter("Day10/aaa.txt","GBK"); printWriter.println("哈哈哈哈哈哈哈"); printWriter.close();
字符流常用操作
读取文件内容,复制文件
FileWriter与FileReader拷贝文件
//创建字符输出流,并关联文件 FileWriter writer = new FileWriter("aaa.txt"); //创建字符输入流,并关联文件 FileReader reader = new FileReader("aaa.txt"); int len = 0; //创建字符数组保存读取文件的字符,提高效率 char[] chars = new char[1024]; //循环读取文件内容 当reader方法把文件内容全部读取完毕时返回-1,当返回-1时就说明文件全部读取完毕 while ((len = reader.read(chars)) != -1){ //把读取到的内容写入文件, chars读取到的数组 0从数组哪一个索引开始 len读取多少个 writer.write(chars,0,len); } //关闭流释放资源 writer.close(); reader.close();
BufferedWriter与BufferedReader复制文件
//创建字节缓冲输入流 BufferedReader reader = new BufferedReader(new FileReader("aaa.txt")); //创建字符缓冲输出流 BufferedWriter writer = new BufferedWriter(new FileWriter("aaa.txt")); String s = null; //因为缓冲流里默认有一个长度为8192的字符数组使用不需要再定义数组来提高效率 //循环读取文件内容 readLing方法一次读取文件的一行,当把文件内容全部读取完了返回null while ((s=reader.readLine())!=null){ //写入一个字符串到文件中 writer.write(s); //让文件内容换一行 writer.newLine(); } //关闭资源 writer.close(); reader.close();
InputStreamReader与OutputStreamWriter按指定编码表复制文件
//创建转换流 并指定编码 OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("aaa.txt"),"GBK"); InputStreamReader reader = new InputStreamReader(new FileInputStream("aaa.txt"),"GBK"); //利用bufferedWriter与BufferedReade提高读取效率 BufferedWriter bufferedWriter = new BufferedWriter(writer); BufferedReader bufferedReader = new BufferedReader(reader); String s = null; //循环读取文件内容, readLine方法一次读取文件一行内容 ,当把文件读取完毕返回null while ((s=bufferedReader.readLine())!=null){ //写入一行字符串到文件 bufferedWriter.write(s); //在文件中换一行 bufferedWriter.newLine(); } //关闭资源 我们把转换流做参数传进了缓冲流,我们只有要关闭了缓冲流就可以了,他里面会帮我们关闭我们传进去的流 bufferedReader.close(); bufferedWriter.close();
上一篇: Java中线程用法总结
下一篇: java IO流总结