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

来源:互联网 发布:免费音乐后期制作软件 编辑:程序博客网 时间:2024/05/16 00:34

------- android培训java培训、期待与您交流! ----------

黑马学习日志之十二 IO流(一)

1  IO流:

IO流用来处理设备之间的数据传输,Java对数据操作是通过流的方式,Java用于操作 流的对象都在IO包中。

流按照数据分为:字符流 字节流 其中字节流可以操作任何数据,字符流对纯字符操作方便。

按照流向:输入流 输出流

字节流的抽象基类:InputStream  OutputStream

字符流的抽象基类:Reader  Writer

由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。

如:InputStream的子类FileInputStream Reader的子类FileReader

字符流读写文件

既然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()方法返回整数065535之间,如果到末尾,返回-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();
 }
}

字符流缓冲区

缓冲区提高了对数据的读写效率。

对应类: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开始,设置的是当前行号

装饰设计模式

当想要对已有的对象进行功能增强时,可以定义类。将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类成为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰对象的功能,提供更强的功能。

例子:

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培训、期待与您交流! ----------

0 0
原创粉丝点击