Java IO
1.java语言提供的对于文件操作(创建,删除,重命名等)的支持,在java.io.file里。只与文件或目录操作有关,与内容处理无关;实现了Comparable接口,所以file对象可以排序。
2.基本使用:构造方法:a.new File("文件名");b.new File(File parent,String child);然后调用createNewFile(),exists(),delete(),renameTo()等方法,返回值都是boolean。
3.深入使用:a.开发与发布环境不一样,引出的分隔符问题,File.separator;b.程序-JVM-操作系统函数,反复创建或删除会有延迟,最好别重名;c.在多级目录下创建文件,引出父路径必须存在的问题:先getParentFile(),然后判断是否exists(),不存在则先创建父目录mkdirs()。若每个创建新文件都要先测试父路径,引出性能问题,最好能保证父路径一定存在。
4.获取文件本身信息:是否可读/可写,length()大小,lastModified(),判断是目录还是文件,目录则有listFiles()。
5.综合案例:给一个路径列出目录下所有文件(包括子目录下的文件),或给目录和子目录下所有文件重命名。
字节流与字符流:
1.io包里提供字节处理流:OutputStream,InputStream;字符处理流:Writer,Reader;都是抽象类。
2.所有操作都是统一的处理步骤(以文件为例):a.通过File类找到文件的路径;b.利用字节流或字符流的子对象为父类实例化;c.利用流中方法进行输入输出;d.流的操作属于资源操作,需要关闭。
3.OutputStream:JDK 1.0,定义了一个公共的输出操作标准;
3.1:类结构:实现了Closeable(JDK1.5)和Flushable(JDK1.5)接口,这两个接口仅提供close()和flush()方法,但OutputStream类本身就有这两个方法;在JDK1.7后,Closeable接口继承了AutoCloseable接口。
3.2:三种形式的write()方法:write(int b);write(byte[] b);write(byte[]b,int off,int len)。注意String需要转为byte数组才能入参。
3.3:FileOutputStream子类,两个构造方法(File file)和(File file,boolean append)。
3.4:自动关闭,try...catch。
3.5:注意输出之前先确保父目录存在,不存在先创建;文件不存在会自动创建。
4.InputStream:JDK1.0,read方法只能以字节数组为主(或单个)接收。
4.1:只实现了Closeable接口;
4.2:核心方法:int read();int read(byte []b);int read(byte []b,int off,int len);读取到底了返回都是-1,但读取中返回的int含义不一样;
4.3:FileInputStream子类:一个构造方法(File file);
4,4:JDK 1.9增加了readAllBytes()方法,慎用。
5.Writer:JDK 1.1,字符输出流,实现了Appendable(1.5),Closeable(1.5),Flushable(1.5)接口。优势:字符流可直接使用字符串,以及中文处理
5.1:append方法,接收char和CharSequence类型;相当于write加了append=true参数;
5.2:核心输出方法:write(char []);write(String);
5.3:FileWriter子类。
6.Reader:实现Readable(1.5,与NIO有关),Closeable接口,字符流输入没有整个字符串的输入,只能利用字符数组输入,
6.1:核心方法:int read(char[])。
7.字节流和字符流的区别(以输出为例):a.OutputStream不close也能正常输出,但Writer要close才会强制刷新(或手动flush刷新);因为前者没有使用缓冲区;但是从代码编写上看不出来,都是一样的操作;b.涉及中文信息输出一般使用字符流。
8.转换流:字节流与字符流操作功能转换,JDK 1.1,java.io包里的InputStreamReader和OutputStreamWriter。
8.1:OutputStreamWriter是Writer子类,构造方法入参是OutputStream类型;输入类似。
8.2:所以,转换流的本质是接收字节流,向上转型为字符流;
8.3:FileWriter也是继承OutputStreamWriter;
8.4:字符流比字节流适合处理中文只是多了一道处理缓冲区(在输入读取的代码编写上看不出来),而转换流的意义在于在定义结构上清晰描述了字节数据到字符的转换处理。
9.案例:a.模拟文件拷贝:因为要考虑各种类型文件,考虑采用字节流;传统实现;JDK 1.9引入了transferTo方法,input.transferTo(output),直接拷贝完成;b.目录的拷贝:递归,但要注意源文件的父路径在目标文件的父路径要一一对应。

浙公网安备 33010602011771号