---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
概述
1、IO流用来处理设备之间的数据传输
2、java对数据的操作是通过流的方式
3、java用于操作流的对象都在IO包中
4、流按操作数据分为两种:字节流与字符流。
5、流按流向分为:输入流,输出流
字节流的抽象基类:InputStream和OutputStream
字符流的抽象基类:Reader和Writer
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream
再如:Reader的子类FileReader
FileWriter
FileWriter是抽象基类Writer的子类,先来看一下Writer中有哪些方法,如下图:
示例代码如下:import java.io.*; public class Demo{ public static void main(String[] args) throws IOException{ //创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。 //而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖。 //其实该步就是在明确数据要存放的目的地。 //如果要<span style="color:#ff0000;">续写</span>文件,需要写成这样FileWriter fw=new FileWriter("demo.txt",<span style="color:#ff0000;">true</span>); FileWriter fw=new FileWriter("demo.txt"); //调用write方法,将字符串写入流中。 fw.write("abc"); //刷新流对象中的缓冲中的数据。 //将数据刷到目的地中。 fw.flush(); //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据 //将数据刷到目的地中。 //和flush的区别:flush刷新后,流可以继续使用,而close不行。 fw.close(); } }
异常处理方式
import java.io.*; public class Demo{ public static void main(String[] args){ FileWriter fw=null; try{ fw=new FileWriter("demo.txt"); fw.write("abc"); }catch(IOException e){ System.out.println("catch:"+e.toString()); }finally{ try{ if(fw!=null) fw.close(); }catch(IOException e){ System.out.println(e.toString()); } } } }
文件读取的两种方式
与FileWriter相对应的是FileReader,它的具体方法可参看其父类Reader,见下图:
第一种:示例代码如下:
import java.io.*; public class Demo{ public static void main(String[] args) throws IOException{ //创建一个文件读取流对象,和指定名称的文件相关联 //要保证该文件是一惊存在的,如果不存在,会发生文件找不到异常。 FileReader fr=new FileReader("demo.txt"); int ch=0; while((ch=fr.read())!=-1){ System.out.print((char)ch); } fr.close(); } }
第二种:示例代码如下:
import java.io.*; public class Demo{ public static void main(String[] args) throws IOException{ FileReader fr=new FileReader("demo.txt"); char[] buf=new char[1024]; int len=0 while((len=fr.read(buf))!=-1){ System.out.print(new String(buf,0,len)); } fr.close(); } }
拷贝文件
示例代码如下:
import java.io.*; public class Demo{ public static void main(String[] args){ copy(); } public static void copy(){ FileWriter fw=null; FileReader fr=null; try{ fw=new FileWriter("demo_copy.txt"); fr=new FileReader("demo.txt"); char[] buf=new char[1024]; int len=0; while((len=fr.read(buf))!=-1){ fw.write(buf,0,len); } }catch(IOException e){ throw new RuntimeException("读写失败"); }finally{ if(fw!=null){ try{ fw.close(); }catch(IOException e){ System.out.println(e.toString()); } } if(fr!=null){ try{ fr.close(); }catch(IOException e){ System.out.println(e.toString()); } } } } }
字符流缓冲区
1、缓冲区的出现提高了对数据的读写效率。
2、对应类。
BufferedWriter
BufferedReader
3、缓冲区要结合流才可以使用。
4、在流的基础上对流的功能进行了增强。
两个缓冲区的方法如下图:
通过缓冲区复制文件,其示例代码如下:
public class Demo{ public static void main(String[] args){ BufferedReader bufr=null; BufferedWriter bufw=null; try{ bufr=new BufferedReader(new FileReader("demo.java")); bufw=new BufferedWriter(new FileWriter("demo_copy.java")); }catch(IOException e){ System.out.println(e.toString()); } String line=null; try{ while((line=bufr.readLine())!=null){ bufw.write(line); bufw.newLine(); } }catch(IOException e){ System.out.println(e.toString()); } finally{ if(bufr!=null) try{ bufr.close(); }catch(IOException e){ System.out.println(e.toString()); } if(bufw!=null) try{ bufw.close(); }catch(IOException e){ System.out.println(e.toString()); } } } }
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么,自定义的该类就被称为装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
装饰类的示例代码如下:
class Person{ public void eat(){ System.out.println("吃饭"); } } class SuperPerson{ private Person p; SuperPerson(Person p){ this.p=p; } public void superEat(){ System.out.println("开胃酒"); p.eat(); System.out.println("甜点"); } }