1.概论
IO,input stream、output stream,JAVA中负责IO的是一个专门的包,java.io,这个包里面提供了多个类支撑整个IO功能。
2.文件和File类
2.1.文件
文件系统由OS进行管理,文件由两部分组成:
- 文件里面的数据
- 文件自身的基本属性,如名称、大小、扩展名、修改时间等。
2.2.File类
JAVA提供File类对文件进行操作,
File表示磁盘上的文件或目录
File类提供了与平台无关的方法类对磁盘上的文件或目录进行操作。
File类只是表示磁盘上的文件或者文件系统,只能对文件或者文件系统进行处理,比如删除文件、获取文件长度等信息
File类没有提供方法对文件进行读写.
代码示例:
public static void main(String[] args) { File file=new File("D:\\docs"); //文件是否存在 System.out.println(file.exists()); //文件绝对路径 System.out.println(file.getAbsolutePath()); //是否是个目录(文件夹) System.out.println(file.isDirectory()); //是否是个文件 System.out.println(file.isFile()); //文件长度(单位:字节) System.out.println(file.length()); //删除文件,文件夹或文件必须为空才能删除 System.out.println(file.delete()); //创建文件夹 File newFile1=new File("D:\\ZouJiaNan"); System.out.println(newFile1.mkdir()); //创建文件 File newFile2=new File("D:\\ZouJiaNan\\test.txt"); try { System.out.println(newFile2.createNewFile()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //当前层级下的所有文件和目录名 String[] fileList=file.list(); for (String f : fileList) { System.out.println(f); } //过滤当前层级下满足条件的文件或目录 //方法一:返回String类型数组 String[] files=file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // TODO Auto-generated method stub return name.endsWith(".html"); } }); for (String s : files) { System.out.println(s); } //方法二:返回File类型数组 File[] fileArray=file.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".html"); } }); for (File file2 : fileArray) { System.out.println(file2.getName()+"--"+file2.length()); } }
3.字节、字符
字节,byte,最基础的存储单位,一个字节8bit。
字符,字面意义上的基础单位,如,a,10000,我…..,根据数据类型的不同,其对应的字节大小不同,如 int a 大小为4字节。
文件以字节进行保存。
4.流
4.1.概述
一瓶水不可能一下就完整的装到另一个瓶子里,而是要用水流的方式流向另一个瓶子,同理文件也不可能一下就被完整的读出来,而是要以流的形式流入流出,进行读写。
JAVA IO中按照所操作的数据的单位不同,可以将流分为两类:
字节流,操作的数据单位是字节。支持对一切文件的读写。
字符流,操作的数据单位是字符。仅支持文本文件。
JAVA IO包中具体的类按照其所功能维度不同,可以分为:
节点类,直接用来对文件类进行读写。
转换类,完成字符到字节之间的转化。
装饰类,节点类的装饰器类,用来增强原生节点类的能力。
1.节点类
字节流里面的节点类有:FileInputStream、FileOutputStream。
字符流里面的节点类有:FileReader,FileWriter。
2.转换类
转换类有:
InputStreamReader,以字节的方式读取文件并转换为字符。
OutputStreamWriter,将字符转化为字节输出到文件中。
3.装饰类
4.2.节点类
字节流:
字符流:
4.3.转换类
JAVA IO中提供一个转换类来将字节流转化(包装)为字符流:
其实字符流底层就是用字节流实现的,JAVA IO中底层真正干活的始终是字节流。
4.4.装饰类
字节流:
装饰原生字节流。
字符流:
装饰原生字符流。
5.序列化
序列化:将对象写入IO流中。
反序列化:从IO流中恢复对象。
意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
前提:对象实现Serializable接口
特性:
1.如果所要序列化的对象的成员属性中含有对其他对象的引用,要求所引用的对象也必须是可序列化的(实现serializable接口),否则会序列化失败。
2.使用transient关键字修饰,可以逃离序列化,反序列化出来后被修饰的属性会是默认值。
3.对同一个对象序列化多次,只会得到一个序列化后的对象,不会得到多个,程序试图序列化一个对象时,会先检查该对象是否已经序列化过,序列化过则返回之前的序列化编号。
4.序列化存在的问题:
无法更新状态,
由于java序利化算法不会重复序列化同一个对象,如果对象的内容更改后,,再次序列化,并不会再次将此对象转换为字节序列。
5.serialVersionUID
序列化版本号,类似于乐观锁中的版本号,用来保证序列化后的字节序列没有被改动过,反序列化回来后和原来的程序是兼容的。
serialVersionUID不会自动改变,而是留给程序员手动更改的一个版本号标志位。更改了序列化文件的程序员一并更改版本号提示后来的人文件本更改过。
JAVA IO中用来支持序列化、反序列化的类是个装饰类,包装了字节流。