字符流 字符流的特点:既然IO是流用于操作数据的,那么数据的最常见形式:文件。 Writer: 需求:在硬盘上创建一个文件并写入一些文字数据。 找到一个专门用于操作文字的Writer子类对象:FileWriter。 后缀名是父类名,前缀名是该流对象的功能。 //创建一个FileWriter对象,该对象已被初始化就必须明确被操作的文件。 //而且该文件会被创建到该目录下。如果该目录下已有同名文件,那么覆盖源文件。 //其实就是为了明确数据要存放的目的地。 FileWriter fw=newFileWriter("f:\\操作文件.txt"); //调用write方法,将数据写到了流中。 fw.write("asdfg"); //刷新流对象中的缓冲数据,将数据刷到目的地。 fw.flush(); //关闭流资源,但是关闭之前会刷新一次内部流中的数据,将数据刷到目的地。 //他跟flush的区别是:flush刷新后还可以继续使用,但close刷新后会关闭流。 fw.close(); 处理IO异常: FileWriter fw=null;//定义一个指向性参数 try { fw=new FileWriter("f:\\操作文件.txt");//创建新的文件对象 fw.write("abc");//写入 } catch(IOException e) { e.printStackTrace(); }finally{ if(fw!=null){//判断文件是否存在,因为文件可能不存在。 try { fw.close();//关闭流 } catch(IOException e) { e.printStackTrace(); } } } 文件的续写:FileWriter fw=new FileWriter(“Demo.txt”,true); Reader:第一种读取方式(常用的读取方式) FileReader fr=null; try { fr=newFileReader("f:\\操作文件.txt"); intch=0; //read方法一次只能对一个字符,而且会自动往下读 while((ch=fr.read())!=1){ System.out.print((char)ch); } } catch(IOException e) { e.printStackTrace(); }finally{ try { fr.close(); } catch(IOException e) { e.printStackTrace(); } } } 第二种读取方式: //定义一个字符数组,用于存储读到的字符 //该read(char[])返回的是读到字符的个数 FileReader fr=null; try { fr=newFileReader("f:\\操作文件.txt"); char[]buff=new char[1024]; int num=0; while((num=fr.read(buff))!=-1){ System.out.print(new String(buff,0,num)); } } catch(IOException e) { e.printStackTrace(); }finally{ try { fr.close(); } catch(IOException e) { e.printStackTrace(); } } BufferedWriter:字符读入缓冲流 缓冲流的出现时为了提高流的操作效率 所以在操作缓冲流之前,必须要先有流对象 //创建一个流对象 FileWriter fw=newFileWriter("f:\\操作文件.txt"); //为了提高效率,加入了缓冲流对象 //只要将需要被提高效率的流对象作为参数传给缓冲流即可 BufferedWriter bw=newBufferedWriter(fw); Bufferedreader:字符读取缓冲流。 readLine()文件的行读取,提高读取效率。读取的时候只返回回车符前边的数据,并不返回回车符,所以要加bw.newLine()换行 //创建一个读取流对象和文件相关联 FileReader fr=newFileReader("f:/操作文件.txt"); //提高效率 加入缓冲流对象的构造函数 BufferedReaderbr=new BufferedReader(fr); //文件的行读取 String line=null; while((line=br.readLine())!=null){ System.out.println(line); }
字节流 键盘录入最常见写法:BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); 流操作规律:(流对象太多,不知道用哪个) 1. 明确源和目的。 源:输入流:InputStream Reader 目的:输出流:OutputStream Writer 2. 操作的数据时不是纯文本 是:字符流。不是:字节流 3. 当体系明确后,在明白要使用哪个具体对象。 通过设备来区分: 源设备:内存,硬盘,键盘; 目的设备:内存,硬盘,控制台; 需求:1.将一个文本文件中的数据存储到另一个文件中。复制文件 源:因为是源,所以使用读取流。InputStream Reader 是不是操作文本文件。是,这是可以使用Reader,这样体系就明确了。 接下来就要明确该体系中的那个对象: 明确设备:硬盘,上的一个文件。 Reader体系中可以操作文件对象的是FileReader 是否需要提高效率:是,加入Reader体系中缓冲区 BufferedReader。 BufferedReaderbr=new BufferedReader(new FileReader(”c.txt”)); 目的:OutputStream Writer 是否是纯文本。是,Writer 设备,硬盘 一个文件 Writer体系中可以操作文件对象的是Writer Reader 是否需要提高效率:是,加入Writer体系中缓冲区 BufferedWriter。 BufferedWriterbw=new BufferedWriter(new FileWriter(“c.txt”)); 需求2.将键盘输入的数据保存到一个文件中。 源:InputStream Reader 是不是纯文本?是,Reader 设备:键盘,对应的是System.in。为了操作键盘文本数据方便,转成字符流按照字符串操作是最方便的。 所以既然明确了Reader,那么就将System.in 转换成Reader。 用了Reader体系中的转换流,InputStreamReader; InputStreamReader isr = new InputStreamReader(System.in); 需要提高效率吗?需要 BufferedReaderbr=new BufferReader(new InputStreamReader(System.in)); 目的:OutputStream Writer 是否是纯文本?是,Writer 设备:键盘。一个文件。使用FileWriter FileWriter fw = new FileWriter(c.txt); 需要提高效率吗?需要 BufferedWriter bw=new BufferedWriter(new FileWriter(c.txt) ); 扩展:将键盘输入的数据按照指定的编码表,保存到一个文件中、 目的:OutputStream Writer 是否是纯文本?是,Writer 设备:键盘。一个文件。使用FileWriter,但FileWriter使用的是默认编码表GBK 但是存储时,需要假如指定编码表utf-8,而指定编码表只有转换流才可以之定,所以要使用OutputStreamWriter,而转换流对象需要接收一个字节输出流,而且还可以操作文件的字节输出流:FileOutputStream; OutputStreamWriterosw= newOutputStreamWriter(new FileOutputStream(“c.txt”,”utf-8”)) 需要提高效率吗?需要 BufferedWriter bw=new BufferedWriter(osw ); 转换流什么时候使用:字符和字节之间的桥梁,通常涉及到字符编码转换时用转换流
|