您的位置:首页 > 职场人生

黑马程序员——黑马学习日志之十二 IO流(一)

2014-07-02 23:54 246 查看
------- android培训java培训、期待与您交流!
----------

黑马学习日志之十二 IO流(一)
1  IO流:
IO流用来处理设备之间的数据传输,Java对数据操作是通过流的方式,Java用于操作
流的对象都在IO包中。
流按照数据分为:字符流 字节流 其中字节流可以操作任何数据,字符流对纯字符操作方便。
按照流向:输入流 输出流
字节流的抽象基类:InputStream  OutputStream
字符流的抽象基类:Reader  Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。 Reader的子类FileReader。
2 字符流读写文件
既然IO流是用于操作数据类型,那么数据最常见的体现形式:文件。
写入文件FileWriter类
专门用于操作文件的Writer类子类FileWriter.
例子:
import java.io.*;

class FileWriterDemo

{

  public static void main(String [] args) throws IOException//抛io异常
{

   //创建一个FileWrite对象,该对象一被初始化必须要明确被操作的文件

   //而且该文件会被创建到指定目录下。如果该目录下有同名文件,则会被覆盖

    //其实该步就是在明确数据要存放的目的地

 FileWriter fw = new FileWriter("demo.txt");

    //调用write方法,将字符串写入到流中
  fw.write("abcde");

//刷新对象中的缓冲中的数据

   //将数据刷到目的地中

   fw.flush();

  //关闭流资源,但是关闭之前会刷新一次内部的缓存中的数据

  //flush刷新后,流可以继续使用,close刷新后,会将流关闭

  fw.close();  

 }

}
IO流异常处理

import java.io.*;

class FileWriterDemo2

{

  public static void main(String [] args){

   FileWriter fw = null ;//这样整个代码都能看见

   try

   {

    fw = new FileWriter("D:\\demo.txt");

    fw.write("abcde");   

   }

   catch (IOException e)

   {

    System.out.println(e.toString());

   }

   finally{

    try

    {

     if(fw!=null)

      fw.close();   
}
 catch (IOException e)

    {

     System.out.println(e.toString());

    } 

  }
 }

}
文件续写
传递一个true参数,代表不覆盖已有的文件 在已有的文件的末尾处进行数据的续写

   FileWriterfw =newFileWriter("demo.txt",true);
fw.write("hahanihao\r\nxiexie"); //windows中换行符\r\n
读取文件 FileReader类
专门用于操作文件的Reader类子类FileReader。
读取方式一:
例子:
import java.io.*;

class FileReaderDemo

{

  public static void main(String [] args)throws IOException{

   //创建一个文件读取流对象,和指定名称的文件相关联

   //保证该文件是存在的,不存在就会发生异常FileNotFoundException

      FileReader fr = new FileReader("demo.txt");

    int ch = 0;
       //调用读取流对象的read方法,read一次读一个字符,自动往下读,
 // read()方法返回整数0—65535之间,如果到末尾,返回-1.

    while ((ch=fr.read())!=-1)

   {

    System.out.println((char)ch);

   }

   fr.close();

 }

}
读取方式二:通过数组读取

例子:

import java.io.*;

class FileReaderDemo2

{

 public static void main(String [] args)throws IOException{

   FileReader fr = new FileReader("demo.txt");

   //定义一个字符数组,用于存储读到字符

   //该read(char[])返回是读到字符个数

   char[] buf = new char[1024]; //通常定义1024的整数倍

   int num = 0;

   while ((num=fr.read(buf))!=-1)

   {

    System.out.println(new String(buf,0,num));

     }

   fr.close();

 }

}
3 字符流缓冲区
缓冲区提高了对数据的读写效率。
对应类:BufferedWriter  BufferedReader
创建缓冲区之前,要先有流对象,缓冲区结合流才能使用,在流的基础上对流功能进行增强。
BufferedWriter类
例子:
import java.io.*;

class BufferedWriterDemo

{

  public static void main(String [] args){

   //创建一个字符写入流对象

   FileWriter fw = new FileWriter("buf.txt");

   //缓冲技术,其实就是将数组封装成对象

   //将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可

   BufferedWriter bufw = new BufferedWriter(fw);

   for (int x=1;x<5 ;x++ )

  {

    bufw.write("abcd");

     bufw.newLine(); //该缓冲区中提供了一个跨平台的换行符   //newLine() 必须在缓冲区中才有该技术 

    bufw.flush();//写一次刷一次,以防内存中数据丢失
          }

   //记住,只要用到缓冲区,就要记得刷新 缓冲区位置在内存中

  bufw.flush();

   //其实关闭缓冲区,就是关闭缓冲区中的流对象 所以不必fw.close(); 

   bufw.close();

 }

}
BufferedReader类
例子:
import java.io.*;

class BufferedReaderDemo

{

 public static void main(String [] args){

   //创建一个读取流对象和文件相关联

   FileReader fr = new FileReader("CopyText.java");

   //缓冲 
BufferedReader bufr = new BufferedReader(fr);

   String line = null;
// readLine()方法,读一行,方便对文本数据的获取,不包含行终止符
//readLine()只返回回车符之前的数据内容。并不返回回车符
//当返回Null时,说明到文件末尾

   while ((line=bufr.readLine())!=null)

   {

    System.out.println(line);

   }

  bufr.close();

 }

}
LineNumberReader类是BufferedReader的子类
方法:
getLineNumber:获取行号,从0开始
setLineNumber:设置行号。默认从0开始,设置的是当前行号
4 装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类。将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类成为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰对象的功能,提供更强的功能。
例子:
class Person

{

 public void eat()
{

   System.out.println("吃饭");

 }

}

class SuperPerson

{

 private Person p;

  SuperPerson(Person){

   this.p=p;

 }

  public void superEat(){

   System.out.println("开胃酒");

   p.eat();

   System.out.println("甜点");

 System.out.println("吸烟");

  }

}

class PersonDemo

{

  public static void main(String [] args){

   Person p = new Person();

   SuperPerson sp = new SuperPerson(p);

   sp.superEat();

  }

}
装饰和继承的区别:
装饰模式币继承更灵活,避免了继承体系臃肿,而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有都是相同的,只不过提供了更强的功能,所以装饰类和被装饰类都属于一个体系中。
 
 
 

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员