三、Apache IO包
- JDK中提供的文件操作相关的类,但是功能都非常基础,进行复杂操作时需要做大量编程工作。实际开发中,往往需要你自己动手编写相关的代码,尤其在遍历目录文件时,经常用到递归,非常繁琐。 Apache-commons工具包中提供了 IOUtils/FileUtils,可以让我们非常方便的对文件和目录进行操作。 本文就是让大家对 IOUtils/FileUtils 类有一个全面的认识,便于大家以后开发与文件和目录相关的功能。
- ApacheIOUtils 和 FileUtils 类库为我们提供了更加简单、功能更加强大的文件操作和 IO流操作功能。非常值得大家学习和使用。
1、FileUtils的使用
FileUtils类中常用方法:
打开FileUtils 的 api文档,我们抽出一些工作中比较常用的方法,进行总结和讲解。总结如下:
方法 | 作用 |
cleanDirectory: | 清空目录,但不删除目录。 |
contentEquals: | 比较两个文件的内容是否相同。 |
copyDirectory: | 将一个目录内容拷贝到另一个目录。可以通过 FileFilter过滤需要拷贝的文件。 |
copyFile: | 将一个文件拷贝到一个新的地址。 |
copyFileToDirectory: | 将一个文件拷贝到某个目录下。 |
copyInputStreamToFile: | 将一个输入流中的内容拷贝到某个文件。 |
deleteDirectory: | 删除目录。 |
deleteQuietly: | 删除文件。 |
listFiles: | 列出指定目录下的所有文件。 |
openInputSteam: | 打开指定文件的输入流。 |
readFileToString: | 将文件内容作为字符串返回。 |
readLines: | 将文件内容按行返回到一个字符串数组中。 |
size: | 返回文件或目录的大小。 |
write: | 将字符串内容直接写到文件中。 |
writeByteArrayToFile: | 将字节数组内容写到文件中。 |
writeLines: | 将容器中的元素的 toString方法返回的内容依次写入文件中。 |
1.1、FileUtils的使用1
package com.copyFile;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class FileUtilsDemo1 {
public static void main(String[] args)throws Exception {
String conten = FileUtils.readFileToString(new File("F:/IO测试/带行号的lxt.txt"));
System.out.println(conten);
}
}
1.2、FileUtils的使用2
package com.copyFile;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileFilter;
public class FileUtilsDemo2 {
public static void main(String[] args)throws Exception {
FileUtils.copyDirectory(new File("D:\\IDEA\\JavaSE\\基础语法\\src\\com\\IOStream\\a"), new File("f:/a"), new FileFilter() {
//在文件拷贝时的过滤条件
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory() || pathname.getName().endsWith("gif")){
return true;
}
return false;
}
});
}
}
结果图
1.3、IOUtils的使用
package com.copyFile;
import org.apache.commons.io.IOUtils;
import java.io.FileInputStream;
public class IOUtilsDemo {
public static void main(String[] args)throws Exception {
String content = IOUtils.toString(new FileInputStream("F:/IO测试/带行号的lxt.txt"),"utf-8");
System.out.println(content);
}
}
四、IO流总结
按流的方向分类:
- 输入流:数据源到程序(InputStream、Reader读进来)。
- 输出流:程序到目的地(OutputStream、Writer写出去)。
按流的处理数据单元分类:
- 字节流:按照字节读取数据(InputStream、OutputStream)。
- 字符流:按照字符读取数据(Reader、Writer)。
按流的功能分类:
- 节点流:可以直接从数据源或目的地读写数据。
- 处理流:不直接连接到数据源或目的地,是处理流的流。通过对其他流的处理提高程序的性能。
IO的四个基本抽象类:
一、InputStream的实现类
- FileInputStream(以字节为单位直接读取“文件”)
- ByteArrayInputStream(以字节为单位直接操作“字节数组对象”)
- BufferedInputStream (将InputStream对象进行包装,增加缓存功能,提高读取效率)
- DataInputStream (以字节为单位直接读取“基本数据类型与字符串类型”)
- ObjectInputStream (以字节为单位直接读取“对象”)
二、OutputStream
- FileOutputStream (以字节为单位直接写出“文件”)
- ByteArrayOutputStream (以字节为单位直接写出“字节数组对象”)
- BufferedOutputStream (将OutputStream对象进行包装,增加缓存功能,提高写出效率)
- DataOutputStream (以字节为单位直接写出“基本数据类型与字符串类型”)
- ObjectOutputStream (以字节为单位直接写出“对象”)
- PrintStream (将OutputStream进行包装,
- 可以方便地输出字符,更加灵活。)
三、Reader
- FileReader (以字符为单位直接读取“文本文件”(注意:只能读写文本文件!))
- BufferedReader (将Reader对象进行包装,增加缓存功能,提高读取效率!)
- InputStreamReader(处理流,将字节流转换成字符流读取)
四、Writer
- FileWriter (以字符为单位直接写出“文本文件”,注意:只能读写文本文件!)
- BufferedWriter (将Writer对象进行包装,增加缓存功能,提高写出效率!)
- OutputStreamWriter (处理流,将字节流转换成字符流输出)
把java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为java对象的过程称为对象的反序列化。