IO称之为输入输出,Java的IO是经过java.io包下的类和接口来支持,包含两大类:输入,输出. java
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操做那么对于Java中的IO体系也就有了一个初步的认识了。 数组
File类是java.io下表明与平台无关的文件和目录.也就是说若是要操做文件和目录,均可以经过File来操做.File不能访问访问文件自己,若是须要访问文件自己,须要使用输入/输出流. 网络
File 类有一个欺骗性的名字——一般会认为它对付的是一个文件,但实情并不是如此。
它既表明一个特定文件 的名字,也表明目录内一系列文件的名字。
若表明一个文件集,即可用list()方法查询这个集,返回的是一 个字串数组。之因此要返回一个数组,而非某个灵活的集合类,是由于元素的数量是固定的。并且若想获得 一个不一样的目录列表,只需建立一个不一样的File 对象便可。
事实上,“FilePath ”(文件路径)彷佛是一个 更好的名字。 ide
----摘自 think in java 工具
代码示例File的使用:package org.credo.io; import java.io.File; import java.io.IOException; public class FileTest { @SuppressWarnings("static-access") public static void main(String[] args) throws IOException { //以当前路径来建立一个File对象 File file=new File("credo"); System.out.println("直接获取文件名:"+file.getName()); System.out.println("获取文件相对路径的父路径可能出错,输出为NULL:"+file.getParent()); System.out.println("获取绝对路径:"+file.getAbsolutePath()); System.out.println("获取绝对路径对应的File对象:"+file.getAbsoluteFile()); System.out.println("获取上一级路径:"+file.getAbsoluteFile().getParent()); System.out.println("file:"+file); //检查是否存在,先建立目录。而后建立文件.否则报java.io.IOException: 系统找不到指定的路径. if(!file.exists()){ file.mkdirs(); } //在当前路径下建立一个临时文件,名aaa属性为txt的. File tmpFile=File.createTempFile("aaa", ".txt",file); //JVM退出时删除该文件,另外一个delete是直接删除. tmpFile.deleteOnExit(); //以系统当前时间做为新文件名来建立新文件. File newFile=new File(System.currentTimeMillis()+""); System.out.println("判断newFile是否存在:"+newFile.exists()); //以指定的newFile对象来建立一个文件 newFile.createNewFile(); //以newFile对象来建立一个目录,由于newFile已经存在因此下面方法返回false,没法建立该目录 newFile.mkdir(); //使用list()方法列出当前路径下的全部文件和路径 String[] fileList=file.list(); System.out.println("=========当前路径下全部文件和路径以下==========="); for(String fileName:fileList){ System.out.println("fileName:"+fileName); } //listRoots()静态方法列出全部的磁盘根路径 File[] roots=file.listRoots(); System.out.println("==========系统全部根路径以下======="); for(File root:roots){ System.out.println("root:"+root); } } }跟具体的请查阅java API.
在File类的list()方法中能够接收一个FilenameFilter参数,经过该参数能够只列出符合条件的文件.
FilenameFilter接口里包含了一个accept(File dir,String name)方法,该方法将依次对指定File的全部子目录或者文件进行迭代,若是该方法返回true,则list()方法会列出该子目录或者文件. spa
package org.credo.io; import java.io.File; import java.io.FilenameFilter; public class FileNameFilterTest { public static void main(String[] args) { //以当前路径来建立一个File对象 File file=new File("."); String[] nameList=file.list(new MyFileNameFilter()); for(String str:nameList){ System.out.println(str); } } } class MyFileNameFilter implements FilenameFilter{ @Override public boolean accept(File dir, String name) { //若是文件名以.java结尾,或者文件对应一个路径,则返回true return name.endsWith(".java")||new File(name).isDirectory(); } }
按照流的流向来分,能够分为输入流和输出流. 设计
输入流 | 只能读取数据,不能写入数据.java里由InputStream和Reader做为基类.抽象基类,没法建立实例. |
输出流 | 只能写入数据,不能读取数据.java里由OutputStream和Writer做为基类.抽象基类,没法建立实例. |
字节流和字符流的用法基本一致的.区别是字节流操做的数据单元是8位的字节.而字符是16位的字符.一个字节byte是8位二进制.Java中的字符char是unicode码,占2个字节,即16位.
字节流是由InputStream和OutputStream做为基类.而字符流主要由Reader和Writer做为基类. code
或者这么解释:Byte Stream皆起源与InputStream和OutputStream. Char Stream皆起源与Reader和Writer. 字符和字节的区别是,字符是字符集中一个有意义的字符单元. 而字节只是一个8bit二进制数据. 对象
字节流最原始的方法是InputStream的read()和OutputStream的write(). 分别为读取一个字节和写入一个字节. 在InputStream和OutputStream之上,包装了不少字节流工具,来一次性的读或者写多个字符. 但不管如何调用什么方法,最终包装过的方法都是经过调用最原始的read()和write()来操做流.
字符流最原始的方法是Reader的read()和Writer的write()方法.分别为读取一个字符或写入一个字符.同上,包装的字符流工具最终也是在和原始的read()和write()在打交道. 接口
下面是两个体系图:
因为存在大量不一样的设计方案,因此该任务的困难性是很容易证实的。其中最大的挑战彷佛是如何覆盖全部
可能的因素。不只有三种不一样的种类的 IO 须要考虑(文件、控制台、网络链接),并且须要经过大量不一样的
方式与它们通讯(顺序、随机访问、二进制、字符、按行、按字等等)。
Java 库的设计者经过建立大量类来攻克这个难题。
----摘自 think in java
下面是字节流的
下面是字符流的: