首页 > 代码库 > 输入/输出

输入/输出

 引言:

    对一段看不到明显运行效果的代码,是比较乏味的,但是输入/输出却又是每个程序都必须要的。Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入、输出两种IO流,每种输入、输出流又可分为字节流和字符流两大类。除此之外,Java的IO流使用了一种装饰器设计模式,将IO流分成底层节点流和上层处理流。Java7在java.nio及其子包下提供了一系列全新的API,这些API对原有的IO进行了升级,因此也被称为NIO2,使程序更加高效

1.File类

File类是java.io包下代表与平台无关的文件和目录,换一句话说就是如果希望在程序中操作文件和目录,都可以通过File类来完成。但是访问文件内容本身,要通过输入/输出流

     1)访问文件和目录

      File类可以使用文件路径字符串来创建File实例,该文件路径字符字符创既可以是绝对路径,也可以是相对路径。在默认情况下,系统总会依据运行JVM时所在的路径来解释相对路径。

     访问文件名相关的方法:

技术分享

     文件检测相关的方法:

技术分享

    获取常规文件信息:

 技术分享

  文件操作相关方法:

    技术分享

   目录操作相关的方法:

   技术分享

    2)文件过滤器

    2.理解Java的IO流

  java的IO流是实现输入/输出的基础,那么什么是“流”呢,流是个抽象的概念,是对输入输出设备的抽象,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等。

技术分享

流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。

可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。

这个时候,你就可以想象数据好像在其中流动一样,如下图:

技术分享

 

你可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念,水可以流进也可以流出。当水从一处流进管道的时候,就相当于从数据源读入数据至流中,当水从管道流到某处的时候,就相当于从流中写出数据到某个数据源目的地。
    刚刚说到流有方向的概念,在Java中将读入数据的流叫做输入流,将写出数据的流叫做输出流。

 当程序需要从某个数据源读入数据的时候,就会开启一个输入流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个输出流,这个数据源目的地也可以是文件、内存或网络等等。

流就是一个运水的管子,里面的水可以是字符串,可以是二进制文件,声明输入流就相当于是你把这根管子接到了某个水龙头上,声明输出流就相当于你拿着管子往哪浇水,关流等于是把管子拆下来收好,用装饰设计模式(比如加buffer)就相当于因为你家水龙头反正本来水流就不大,于是你在管子上装了一个储水泵,每当这个储水泵的水满了,它会一次性的把水打出来。

     1) 流的分类

           按照流向来分:输入流(只能从中读取数据,不能向其写入数据)使用InpurtStream和Reader作为基类、输出流(只能向其写入数据,不能从中读取数据)使用OutputStream和Writer作为基类。

         这里的方向理解起来应该是对于不同的对象不同,比如A给B一个苹果,对于A来说应该使用输出流,而对于B来说应该使用输入流。但是划分输入/输出流时是从程序运行的内存的角度来考虑

         按照操作的数据单元来分:字节流(操作的数据单元是8位的字节)使用InpurtStream和OutputStream作为基类、字符流(数据单元是16位的字符)使用Reader和Writer作为基类

         按照角色来分 :节点流(可以从/向一个特定的IO设备读/写数据的流)。节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

 技术分享

 

                                          处理流(过滤流)(用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能)

  当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。

技术分享

 

   技术分享

通过使用处理流,程序无须理会输入/输出节点是啥,只要将这些节点流包装成处理流,就可以使用相同的输入输出代码来读写不同的输入/输出设备的数据

 

输入/输出