首页 > 代码库 > 输入/输出
输入/输出
引言:
对一段看不到明显运行效果的代码,是比较乏味的,但是输入/输出却又是每个程序都必须要的。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中将读入数据的流叫做输入流,将写出数据的流叫做输出流。
当程序需要从某个数据源读入数据的时候,就会开启一个输入流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个输出流,这个数据源目的地也可以是文件、内存或网络等等。
1) 流的分类
按照流向来分:输入流(只能从中读取数据,不能向其写入数据)使用InpurtStream和Reader作为基类、输出流(只能向其写入数据,不能从中读取数据)使用OutputStream和Writer作为基类。
这里的方向理解起来应该是对于不同的对象不同,比如A给B一个苹果,对于A来说应该使用输出流,而对于B来说应该使用输入流。但是划分输入/输出流时是从程序运行的内存的角度来考虑
按照操作的数据单元来分:字节流(操作的数据单元是8位的字节)使用InpurtStream和OutputStream作为基类、字符流(数据单元是16位的字符)使用Reader和Writer作为基类
按照角色来分 :节点流(可以从/向一个特定的IO设备读/写数据的流)。节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。
处理流(过滤流)(用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能)
当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。
通过使用处理流,程序无须理会输入/输出节点是啥,只要将这些节点流包装成处理流,就可以使用相同的输入输出代码来读写不同的输入/输出设备的数据
输入/输出