IO流:用于处理设备上数据。

  流:可以理解数据的流动,就是一个数据流。IO流最终要以对象来体现,对象都存在IO包中。

流也进行分类:

  1:输入流(读)和输出流(写)。

  2:因为处理的数据不同,分为字节流和字符流。

字节流:

  处理字节数据的流对象。设备上的数据无论是图片或者dvd,文字,它们都以二进制存储的。

  二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。

  意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

那么为什么要有字符流呢?

  因为字符每个国家都不一样,所以涉及到了字符编码问题,那么GBK编码的中文用unicode编码解析是有问题的,所以需要获取中文字节数据的同时+ 指定的编码表才可以解析正确数据。

  为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。

流的操作只有两种:读和写。

  流的体系因为功能不同,但是有共性内容,不断抽取,形成继承体系。该体系一共有四个基类,而且都是抽象类。

  字节流:InputStream  OutputStream

  字符流:Reader  Writer

  在这四个系统中,它们的子类,都有一个共性特点:子类名后缀都是父类名,前缀名都是这个子类的功能名称。

基本流程:

  1:创建一个字符输出流对象,用于操作文件。该对象一建立,就必须明确数据存储位置,是一个文件。

  2:对象产生后,会在堆内存中有一个实体,同时也调用了系统底层资源,在指定的位置创建了一个存储数据的文件。

  3:如果指定位置,出现了同名文件,文件会被覆盖。

  public static void main(String[] args) throws IOException { //读、写都会发生IO异常

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

    fw.write("abcde");//调用Writer类中的write方法写入字符串。字符串并未直接写入到目的地中,而是写入到了流中,(其实是写入到内存缓冲区中)。

    fw.flush(); // 刷新缓冲区,将缓冲区中的数据刷到目的地文件中。

    fw.close(); // 关闭流,其实关闭的就是java调用的系统底层资源。在关闭前,会先刷新该流。

  }

close()和flush()的区别:

  flush():将缓冲区的数据刷到目的地中后,流可以使用。

  close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做。

io异常的处理方式:io一定要写finally,关闭流;

 

FileWriter写入数据的细节:

  1:window中的换行符:\r\n两个符号组成。 linux:\n。

  2:续写数据,只要在构造函数中传入新的参数true。

  3:目录分割符:window :\\    linux:/

  public static void main(String[] args) {

    FileWriter fw = null;

    try {

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

      fw.write("abcde");

    }

    catch (IOException e ){

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

    }

    finally{

      if(fw!=null)

      try{

        fw.close();

      }

      catch (IOException e){

        System.out.println("close:"+e.toString());

      }

    }

  }

FileReader:使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。

  创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。

  import java.io.*;

  class  FileReaderDemo {

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

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

      int ch = 0;

      while((ch = fr.read())!= -1) { //条件是没有读到结尾

        System.out.println((char)ch); //调用读取流的read方法,读取一个字符。

      }

      fr.close();

    }

  }

读取数据的第二种方式:第二种方式较为高效,自定义缓冲区。

  import java.io.*;

  class FileReaderDemo2 {

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

      FileReader fr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。

      //因为要使用read(char[])方法,将读取到字符存入数组。所以要创建一个字符数组,一般数组的长度都是1024的整数倍。

      char[] buf = new char[1024];

      int len = 0;

      while(( len=fr.read(buf)) != -1) {

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

      }

      fr.close();

    }

  }

IO中的使用到了一个设计模式:装饰设计模式。

  装饰设计模式解决:对一组类进行功能的增强。

  包装:写一个类(包装类)对被包装对象进行包装;

   1、包装类和被包装对象要实现同样的接口;

   2、包装类要持有一个被包装对象;

   3、包装类在实现接口时,大部分方法是靠调用被包装对象来实现的,对于需要修改的方法我们自己实现;

 

字符流:

  Reader用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。  

    |---BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

  |---LineNumberReader跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。

    |---InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

    |---FileReader用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。

  Writer写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。

    |---BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

    |---OutputStreamWriter是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

    |---FileWriter用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。

字节流:

  InputStream是表示字节输入流的所有类的超类。

    |--- FileInputStream从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

    |--- FilterInputStream包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。

    |--- BufferedInputStream该类实现缓冲的输入流。

  OutputStream此抽象类是表示输出字节流的所有类的超类。

    |--- FileOutputStream文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

    |--- FilterOutputStream此类是过滤输出流的所有类的超类。

    |--- BufferedOutputStream该类实现缓冲的输出流。

缓冲区是提高效率用的

  BufferedWriter:是给字符输出流提高效率用的,那就意味着,缓冲区对象建立时,必须要先有流对象。明确要提高具体的流对象的效率。

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

  BufferedWriter bufw = new BufferedWriter(fw);//让缓冲区和指定流相关联。

  for(int x=0; x<4; x++){

    bufw.write(x+"abc");

    bufw.newLine(); //写入一个换行符,这个换行符可以依据平台的不同写入不同的换行符。

    bufw.flush();//对缓冲区进行刷新,可以让数据到目的地中。

  }

  bufw.close();//关闭缓冲区,其实就是在关闭具体的流。

  BufferedReader

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

  BufferedReader bufr  = new BufferedReader(fr);

  String line = null;

  while((line=bufr.readLine())!=null){  //readLine方法返回的时候是不带换行符的。

    System.out.println(line);

  }

  bufr.close();

 

键盘控制台流:

  记住,只要一读取键盘录入,就用这句话。

  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));//输出到控制台

  String line = null;

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

    if("over".equals(line))

      break;

    bufw.write(line.toUpperCase());//将输入的字符转成大写字符输出

    bufw.newLine();

    bufw.flush();

  }

  bufw.close();

  bufr.close();

流对象:其实很简单,就是读取和写入。但是因为功能的不同,流的体系中提供N多的对象。那么开始时,到底该用哪个对象更为合适呢?这就需要明确流的操作规律。

 

流的操作规律:

  1,明确源和目的。

    数据源:就是需要读取,可以使用两个体系:InputStream、Reader;

    数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;

  2,操作的数据是否是纯文本数据?

    如果是:数据源:Reader、Writer

    如果不是:数据源:InputStream、OutputStream

  3,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?

    明确操作的数据设备。

    数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)

    数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。

  4,需要在基本操作上附加其他功能吗?比如缓冲。

    如果需要就进行装饰。

转换流特有功能:转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。

  转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流。

转换流有一个子类就是操作文件的字符流对象:

  InputStreamReader

    |--FileReader

  OutputStreamWriter

    |--FileWrier

  但是子类有一个局限性,就是子类中使用的编码是固定的,是本机默认的编码表,对于简体中文版的系统默认码表是GBK。

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

  InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"gbk");

  以上两句代码功能一致,

  如果仅仅使用平台默认码表,就使用FileReader fr = new FileReader("a.txt"); //因为简化。

  如果需要制定码表,必须用转换流。

  转换流 = 字节流+编码表。

  转换流的子类File = 字节流 + 默认编码表。

  凡是操作设备上的文本数据,涉及编码转换,必须使用转换流。

File类:

  将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的,因为流只操作数据。

  File类常见方法:

    1:创建。

    boolean createNewFile()在指定目录下创建文件,如果该文件已存在,则不创建。而对操作文件的输出流而言,输出流对象已建立,就会创建文件,如果文件已存在,会覆盖。除非续写。

    boolean mkdir()创建此抽象路径名指定的目录。

    boolean mkdirs():创建多级目录。

    2:删除。

    boolean delete()删除此抽象路径名表示的文件或目录。

    void deleteOnExit():在虚拟机退出时删除。

      注意:在删除文件夹时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。

      window的删除动作,是从里往外删。注意:java删除文件不走回收站。要慎用。

    3:获取.

    long length():获取文件大小。

    String getName()返回由此抽象路径名表示的文件或目录的名称。

    String getPath()将此抽象路径名转换为一个路径名字符串。

    String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。

    String getParent()返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。

    long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。

    File.pathSeparator返回当前系统默认的路径分隔符,windows默认为 “;”。

    File.Separator返回当前系统默认的目录分隔符,windows默认为 “\”。

    4:判断:

    boolean exists():判断文件或者文件夹是否存在。

    boolean isDirectory()测试此抽象路径名表示的文件是否是一个目录。

    boolean isFile()测试此抽象路径名表示的文件是否是一个标准文件。

    boolean isHidden()测试此抽象路径名指定的文件是否是一个隐藏文件。

    boolean isAbsolute()测试此抽象路径名是否为绝对路径名。

    5:重命名。

    boolean renameTo(File dest):可以实现移动的效果。剪切+重命名。

    6:目录。.

    String[] list():列出指定目录下的当前的文件和文件夹的名称。包含隐藏文件。

    如果调用list方法的File 对象中封装的是一个文件,那么list方法返回数组为null。如果封装的对象不存在也会返回null。只有封装的对象存在并且是文件夹时,这个方法才有效。

JAVA基础知识总结16(IO流)的更多相关文章

  1. Java基础知识强化之IO流笔记16:IO流的概述和分类

    1. IO流的分类   流向:     (1)输入流:读取数据到内存     (2)输出流:写入数据到硬盘(磁盘)   操作的数据类型:    (1)字节流:操作的数据是字节             ...

  2. Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍

    1. I/O 简介 I/O ( 输入/输出  ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...

  3. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

  4. Java基础知识强化之IO流笔记68:Properties和IO流集合使用

    1. Properties和IO流集合使用 这里的集合必须是Properties集合:  public void load(Reader reader):把文件中的数据读取到集合中  public v ...

  5. Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)

    1. Properties的概述  Properties:属性集合类.是一个可以和IO流相结合使用的集合类. 该类主要用于读取以项目的配置文件(以.properties结尾的文件 和 xml文件). ...

  6. Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1

    1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt   --   读取数据  --  FileInpu ...

  7. Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用

    1. 可以参照之前写的笔记:   Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...

  8. Java基础知识强化之IO流笔记01:异常的概述和分类

     IO流操作的时候会出现很多问题,java中叫作异常,所以我们先介绍一下异常: 1. 程序的异常:Throwable(Throwable类是java中所有异常或错误的超类) (1)严重问题:Error ...

  9. Java基础知识总结之IO流

    理解Java的IO流 流(Stream)的概念:程序与数据来源之间的桥梁 流的分类 按流的方向来分(从程序所在的内存的角度来看): 输入流:把外部输入读入当前程序所在内. 输出流:把当前程序所在内存的 ...

  10. Java基础知识强化之IO流笔记42:IO流总结(图解)

    1. IO流总结(图解)

随机推荐

  1. react 学习文章

    生命周期 学习笔记 一些坑 项目完成后总结 理解Immutable 是否要同构如何同构 react组件最佳实践 redux集合所有的state props来源, 页面所有状态 数据的唯一来源 reac ...

  2. 《Scala入坑笔记》缘起 3天就搞了一个 hello world

    有小伙伴向我咨询 play framework 的问题,我就想了解一下 play framework ,按照官方的文档,要使用 SBT 安装,就掉进了 SBT 的坑. 第一坑:国外仓库太慢 安装完成后 ...

  3. Linux下安装SVN(Subversion)

    一.安装直接运行命令用YUM安装: yum install subversion -y 二.创建版本库创建版本库用svnadmin create命令,大概语法是svnadmin create svn库 ...

  4. 自己搭建MVC时遇到的一些问题及解决办法

    错误1 The view 'Index' or its master was not found or no view engine supports the searched locations. ...

  5. php 设计数据库连接池

    摘要 之前总是以脚本面向过程的方式写PHP代码,所以很大程度上来说,既不规范,也不安全,更不容易维护.为了代码的重用,准备写一套自己的工具库,这样的话,以后写项目的时候就可以很轻松的进行使用啦. 今天 ...

  6. iOS6和iOS7代码的适配(5)——popOver

    popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...

  7. vi下的查找替换命令

    1.查找 查找命令 /pattern:向下查找匹配的字符 ?pattern:向上查找匹配的字符 其中pattern是需要匹配的字符串,例如: /cd #全文查找cd / cd <Enter> ...

  8. Sapnco3 RfcTable Structure

    RfcTable 中字段 并不固定,以下内容仅供参考 1. 包含IDOC的 RfcTable SDATA字段值为IDOC数据,解析IDOC数据需依据IDOC字段长度对SDATA进行截取 functio ...

  9. 配置linux下面python的开发环境

    1.首先安装Python开发环境 http://blog.csdn.net/testcs_dn/article/details/51253365 2.安装django开发环境 http://blog. ...

  10. ①SpringCloud前序知识-CAP原则

    本文主要介绍SpringCloud里头一些常见的原理.定理等相关SpringCloud的技术知识 一.CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). ...