zoukankan      html  css  js  c++  java
  • javaIO流概述

    一.IO流概述

    (1)

    IO流用来处理设备之间的数据传输
    Java对数据的操作是通过流的方式
    Java用于操作流的对象都在IO包中
    流按操作数据分为两种:字节流与字符流
    流按流向分为:输入流,输出流。

    (2)

    IO流常用基类
    字节流的抽象基类
    InputStream,OutputStream
    字符流的抽象基类
    Reader,Writer
    这四个类派生出的子类名称都是以其父类名作为子类名的后缀。

    二.字符流

    1.FileWrite

    数据的最常见体现形式是文件
    FileWriter是专门用于操作文件的Writer子类对象,无空参的构造函数,因为该对象一杯初始化就必须要明确被操作的文件。也米有特有的方法,只有继承来的共性方法。
    FileWriter(String fileName)

    (1)创建一个文件并且输入一定内容
    第一步,创建存储文件
    FileWritier fw=new FileWriter("")//此处需要对IO异常进行处理,可以抛也可以try。创建一个文件并且该文件会被创建在指定的目录下。如果该目录下已有同名文件将会被覆盖。该步就是要明确数据要存储的位置。
    第二步,调用Writer的写入方法,将字符串写入到流中
    fw.write("");//该方法也会抛出内存异常
    第三步,刷新流对象中缓冲的数据,并将该数据刷入到目标文件中。
    fw.flush();//同样会抛出异常,另外fw.close()也可以刷新流,但是会关闭流资源,不能再对流进行操作从而不能再写入数据。只能出现不再使用该流的时候用来释放资源。

    完整代码如下

    FileWriter fw = null;//外部建立写入流引用,因为如果词语写在try语句中,在finally语句中则无法访问到该对象。
    try{
      fw = new FileWriter("Test.txt");//创建流与写入方法时会抛出异常进行异常处理
      fw.write("text");
    }
    catch (IOException e){
      System.out.println(e.toString());
    }
    finally{
      If(fw!=null)//此处必须进行判断以防止流创建时格式不对创建不成功,方法找不到调用的对象
        try{
          fw.close();//同样也会抛出异常进行处理
        }
        catch (IOException e){
          System.out.println(e.toString());
        }
    }

    (2)续写一个文件

    FileWriter(String fileName,boolean append);通过构造函数创建流,当append为true时,不覆盖已有文件,并在已有文件的末尾处进行数据的续写。其他过程与上步骤一致。

    2.FileReader

    该流读取数据有两种方式,一是单个字符去读,一是以字符数组为单位去读取

    (1)

    第一步;FileReader fr=new FileReader("");//创建一个文件读取刘对象,和指定名称的文件相关联,而且要保证该文是已经存在的,如果不存在会发生异常FileNotFoundException是IOException的子类。
    第二步;fr.read();返回一个int型对象字符的int表示,需要强制转换成Char类型,一次只读取一个字符,而且再读的时候会读取下一个。当已达到流的末尾时,会返回-1。返回时int型不是byte型是因为当碰巧取到111111111时也是-1就可能造成程序停止,所以提升成int型,有多个字节存储一个字节,在前面补00000000111111111

    完整代码如下

    FileReader fr = null;
    try{
      fr = new FileReader("c:\test.txt");
      int ch=0;
      while((ch=fr.read())!=-1){
        System.out.prinln("ch="+(Char)ch);
      }
    }
    catch (IOException e){
      System.out.println("read-Exception :"+e.toString());
    }
    finally{
      if(fr!=null){
        try{
          fr.close();
        }
        catch (IOException e){
          System.out.println("close-Exception :"+e.toString());
        }
      }
    }

    (2)

    以字符数组为单位读取,与上部分代码没有太大区别,数据的容器变了而已

    代码如下

    FileReader fr = null;
    try{
        fr = new FileReader("c:\test.txt");
        char[] buf = new char[1024];//通常数组长度定义为1024的整数倍。
        int len= 0;
        while((len=fr.read(buf))!=-1){
            System.out.println(new String(buf,0,len));//当最后一行未能占满数组内容时,读取数组中的一部分。
        }
    }
    catch (IOException e){
        System.out.println("read-Exception :"+e.toString());
    }
    finally{
        if(fr!=null){
            try{
                fr.close();
            }
            catch (IOException e){
                System.out.println("close-Exception :"+e.toString());
        }  
      }
    }

    3.缓冲区技术

    (1)BufferedWriter
    字符流的缓冲区
    不同于之前读一次写一次,提高了对数据读写的效率
    缓冲区要结合流才可以使用,在流的基础上对功能进行了增强。
    BufferedWriter(Writer out);构造函数中传入写入流作为实际参数,所以在创建缓冲区之前必须要先有流对象,此构造方法创建一个默认大小的缓冲字符写入流。

    //第一步创建一个写入流
    FileWriter fw=new FileWriter("");
    //第二步加入缓冲技术
    BufferedWriter bufw=new BufferedWriter(fw);
    //第三步调用BufferedWriter的写入方法
    bufw.write("");//因为缓冲区BufferedWriter是FileWriter的子类,所以可以使用从父类中继承的方法。记住只要用到缓冲区,就要记得刷新缓冲流,
    bufw.flush();
    bufw.close();//此处关闭缓冲区其实也就是关闭缓冲中流对象,所以不用在fw.close();
    
    newLine()//换行,缓冲区中的特有方法将换行动作进行了封装,是跨平台的换行方法。在写入的时候使用、

    (2)BufferReader

    BufferedReader(Reader r);构造函数中传入读取流作为实际参数。

    //第一步创建读取流对象与目标文件相关联
    FileReader fr=new FileReader("");
    //第二步创建缓冲区,将字符读取流对象作为实际参数换递给缓冲对象
    BufferedReader bufr =new BufferReader(fr);
    //第三步,对文本数据进行读取
    String line=null;//缓冲区提供了一次读取一行的方法readLine(),方便文本数据的获取,此处用来读取返回的字符串类型数据,当没有数据的时候返回null,可以用来当做判断条件停止读取动作
    while((line=bufr.readLine())!=null){
    System.ou.println(line);//返回的数据不包含终止符,所以需要手动换行。
    }
    bufr.close();//同样缓冲区读取对象的关闭也是关闭读取流。

    三.字节流

    操作与字符流一样,只不过字符流有码表对应字符操作文本,而字节流没有码表。

    InputStream读取,OutputStream写入
    FileOutputStream fos=new FileOutputStream("");
    fos.write("".getBytes());//字节流没有指定缓冲区的时候是没有缓冲的,不像字符流需要缓冲字节查表转换保存然后再刷新。但是依然需要关闭资源
    fos.close();

    读取操作依然是有上面两种方式。但是还有一种特有的读取方式
    通过available()方法返回可读取的全部字节数,然后指定对应大小的数组,一次读取然后输出,不用再通过事先指定数组的长度用循环的方式读取。
    byte []buf=new byte[fis.available()]//但是只建议在数据大小较小时使用,如果过大可能会造成内存溢出的情况。
    fis.read(buf);

    四.其他常用流对象

    1.读取转换流提高了效率。
    字节流转换成字符流的桥梁
    InputStreamReader(InputStream in)

    //第一步获取键盘录入对象
    InputStream in=System.in;
    //第二步将获取的字节流转换成字符流对象,使用转换流
    InputStreamReader isr=new InputStreamReader(in);
    //第三步为了提高效率,加入字符流缓冲区计数
    BufferReader bufr=new BufferReader(isr);
    String line=null;
    while((line=bufr.readLine())!=null){
    if("over".equals(line))
    break;
    System.out.println(line.toUpperCase());
    }
    bufr.close();

    2.写入转换流
    字符流转换成字节流的桥梁
    OutputStreamWriter(OutputStream out)

    3.标准输入输出流
    System类中的字段:in,out。
    它们各代表了系统标准的输入和输出设备。
    默认输入设备是键盘,输出设备是显示器。
    System.in的类型是InputStream.
    System.out的类型是PrintStream是
    OutputStream的子类FilterOutputStream 的子类。

    4.流操作规律
    通过两个明确来完成
    第一明确源和目的。
    第二明确操作数据类型。
    第三明确要使用哪个具体的对象。

  • 相关阅读:
    MySQL——视图/触发器/事务/存储过程/函数/流程控制
    python连接MySQL/redis/mongoDB数据库的简单整理
    docker安装和使用
    【Python】Django2.0集成Celery4.1详解
    django-haystack全文检索详细教程
    ubuntu16.04安装FastDFS-5.08
    redis之django-redis
    uva 1152 4 Values whose Sum is 0
    2015暑假acm短训小结
    Uva 12569 Planning mobile robot on Tree (EASY Version)
  • 原文地址:https://www.cnblogs.com/ss561/p/4574343.html
Copyright © 2011-2022 走看看