首先不使用带缓冲的。
package com.yunqing; import java.io.*; public class readCharFile { public static void main(String[] args) { /* 一、流的概念和作用 学习Java IO流,我是真的有点无语啊。。。!相信很多学习Java的朋友在起初学习Java IO的时候都会觉得很简单,可是真正用的使用的时候又措手不及,这是一个比较正常的现象,这不能怪你,因为Java设计者在设计Java IO这个类库时,就已然注定了这样蛋疼的一个局面。Java IO的学习之难,主要有两点:其一是构建一个实例需要借助其他的一个或多个实例,其次是类多而杂。你需要以一种俯瞰的视角来对待Java IO,只要你了解了Java IO类库的层次关系,你就可以很好的使用它了,是不是很激动...^_^,下面让我们来看看流的概念: 流:是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称和抽象。即数据在两设备间的传输成为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。 二、流的分类 根据处理数据类型的不同分:字符流和字节流 根据数据流向不同分为:输入流和输出流 三、字符流和字节流 字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别: (1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符(16bit)为单位,根据码表映射字符。 (2)处理对象不同:字节流能处理所有类型的数据(如:图片、音乐、视频等媒体介质),而字符流只能处理字符类型的数据。 (3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候是会用到缓冲区的,是通过缓冲区来操作文件。 建议:当我们在处理媒体介质时,请选择字节流;当我们在处理字符介质时,请选择字符流;当我们不明确操作的介质的类型时,请选择字节流。 一般来说音乐、图像、流媒体文件都用字节流来读,文本文件用字符流来读。IO操作的本质都是字节流,所以当你用字符流从io设备读写东西的时候就需要涉及 到字符集编码,即你想用什么编码来解释那些读到的或者即将写出的字节。所以java中的字符流对象都会有Charset参数。 */ //注意******本例子使用的IDE是idea //idea的读取根目录文件 File file =new File("java.txt"); try { //输入流 FileInputStream fis=new FileInputStream(file); //InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符; InputStreamReader isr=new InputStreamReader(fis,"GBK"); //输出流 FileOutputStream fos=new FileOutputStream("new_java.txt"); //OutputStreamWriter 将字节流转换为字符流。是字节流通向字符流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。 //主要方法:void write(int c);//将单个字符写入。 //viod write(String str,int off,int len);//将字符串某部分写入。 //void flush();//将该流中的缓冲数据刷到目的地中去 OutputStreamWriter osw=new OutputStreamWriter(fos); int len; char char_[]=new char[100]; while((len=isr.read(char_))!=-1){ //System.out.println(char_);//这种写法读取的数据会与之前的有一些差别,会多出一些字符串在结尾 //读取char_,从第0个字符开始读取,读取len中的数据 osw.write(char_,0,len); } //后打开的先关闭 osw.close(); fos.close(); isr.close(); fis.close(); System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
使用带缓冲的
package com.yunqing; import java.io.*; public class readCharBuffer { public static void main(String[] args) { try { FileInputStream fis=new FileInputStream("java.txt"); FileOutputStream fos=new FileOutputStream("java_buffer.txt"); InputStreamReader isr=new InputStreamReader(fis,"GBK"); OutputStreamWriter osw=new OutputStreamWriter(fos); //BufferedReader : 提供通用的缓冲方式文本读取,readLine读取一个文本行, 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 BufferedReader br=new BufferedReader(isr); //这种方法读取的数据会根据换行来返回,最后得到的数据没有换行,都在一行。 //BufferedWriter bw=new BufferedWriter(osw); // //使用这种方法来读取一行并在末尾加上换行符 //true:autoFlush强制输出缓冲里的所有数据保证数据的完整性。这里不写true下面就要写//pw.flush(); PrintWriter pw=new PrintWriter(osw,true); String str; while ((str=br.readLine())!=null){ //bw.write(str); pw.println(str);//输出缓冲区里的字符 } //pw.flush();//把缓冲区的数据全部读取出来,保证数据的完整性 pw.close(); //bw.flush();//把缓冲区的数据全部读取出来,保证数据的完整性 //bw.close(); br.close(); osw.close(); isr.close(); fos.close(); fis.close(); System.out.println("done"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }