相关阅读
【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本
每篇一句
总是有人要赢的,而为什么不是你,所以我们必须要努力
概述
Commons IO是针对开发IO流功能的工具类库。
主要包括六个区域:
- 工具类——使用静态方法执行共同任务
- 输入——用于InputStream和Reader实现
- 输出——用于OutputStream和Writer实现
- 过滤器——各种文件过滤器实现
- 比较器——各种文件的java.util.Comparator实现
- 文件监听器——监听文件系统事件的组件
工具类
IOUtils
该工具类可能是平时使用得最多的工具类了。
IOUtils包含处理读、写和复制的工具方法。方法对InputStream、OutputStream、Reader和Writer起作用。
例如,从一个URL读取字节的任务,并且打印它们:
public static void main(String[] args) throws Exception {
//从网络上读取一个网页资源
InputStream in = new URL("http://commons.apache.org").openStream();
try {
InputStreamReader inR = new InputStreamReader(in);
BufferedReader buf = new BufferedReader(inR);
String line;
while ((line = buf.readLine()) != null) {
System.out.println(line);
}
} finally {
if (in != null) {
in.close();
}
}
}
结果:
控制台打印出了这个网页的所有内容
使用IOUtils:
public static void main(String[] args) throws Exception {
//从网络上读取一个网页资源
try (InputStream in = new URL("http://commons.apache.org").openStream()) {
System.out.println(IOUtils.toString(in, StandardCharsets.UTF_8));
}
//finally {
// IOUtils.closeQuietly(in);
//}
}
在某些应用领域,这些IO操作是常见的,而这个类可以节省大量的时间。你可以依靠经过良好测试的代码。这样的实用程序代码,灵活性和速度是最重要的。
使用上述技术读取一个1 gb文件将导致试图创建一个1 gb的字符串对象! 因此你的流里问价非常非常的打,建议不要这么做,分布处理吧
主要方式介绍:
- buffer:一句话可以吧inputStream、outputStream、Reader、Witter等包装成带缓冲区的流,提高效率
- closeQuietly:可以关闭各种流、socket等任何closeable的实例(不过官方推荐使用try-with-resources来代替)
- contentEquals:比较两个InputStream或者两个Reader里面的内容(字节流)是否完全相同
public static void main(String[] args) throws Exception {
try (InputStream in1 = new URL("http://commons.apache.org").openStream(); InputStream in2 = new URL("http://commons.apache.org").openStream()) {
System.out.println(in1.equals(in2)); //false
System.out.println(IOUtils.contentEquals(in1, in2)); //true
}
}
备注:contentEqualsIgnoreEOL(final Reader input1, final Reader input2) 该方法会忽略ignoring EOL characters
- copy:流的互相拷贝。可以将输入流拷到输出流。
copy(final InputStream input, final OutputStream output, final int bufferSize)
,Reader拷贝到Writer等等 - copyLarge:当你的流拷贝的是大文件(一般大于2G级别),请使用此方法拷贝
- lineIterator:BufferedReader 通常在只有读到空格或者换行符时才会结束读取,攻击者很容易构内存攻击导致系统瘫痪,出于安全考虑这里推荐使用io包的LineIterator,并且其在性能上也优于普通流。
lineIterator(final InputStream input, final Charset encoding)
lineIterator(final InputStream input, final String encoding)
lineIterator(final Reader reader)
public static void main(String[] args) throws Exception {
try (InputStream in1 = new URL("http://commons.apache.org").openStream()) {
LineIterator lineIterator = IOUtils.lineIterator(in1, StandardCharsets.UTF_8);
while (lineIterator.hasNext()) {
lineIterator.nextLine();
}
lineIterator.close();
}
}
- read、readFully:把输入流的东西读取添加到第二个参数中的字节数组里
- readLines:不解释
- resourceToByteArray、resourceToString:直接传入一个文件的路径,读取进来
- toBufferedInputStream:把普通的inputStream转换成带缓冲区的,返回一个新的InputStream
- toByteArray:吧输入流转换到字节数组
- toCharArray:
- toInputStream:吧字符、字符串等等直接读到流里
- toString:强大的方法,可以吧各种输出流读成一个串
- write、writeChunked、writeLines:把传入的字节数组,写入到输出流里(可指定编码)
各种常用的常量:
public static final char DIR_SEPARATOR_UNIX = '/';
public static final char DIR_SEPARATOR_WINDOWS = '\\';
/**
* The system directory separator character. 系统文件夹的分隔符 通用的
*/
public static final char DIR_SEPARATOR = File.separatorChar;
/**
* The Unix line separator string. 换行符
*/
public static final String LINE_SEPARATOR_UNIX = "\n";
//winows换行符
public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
/**
* The system line separator string. 通用的换行符
*/
public static final String LINE_SEPARATOR;
一般可以认为是"/“的作用等同于”\"
在java中路径一般用"/",在java中路径一般用"/",linux、unix中的路径一般用"/",所以在java中写windows路径一般用"/“或将”“转义一下,就成了”\",最好用“/”,因为java是跨平台的。
“\”(在java代码里应该是\)是windows环境下的路径分隔符,Linux和Unix下都是用“/” 而在windows下也能识别“/”。所以最好用“/”
为了提高代码的跨平台可移植性对于文件路径分隔符也可以使用File.separator表示文件路径分隔符
new File("test"+File.separator+"test.txt"); //中file的相对路径就是test下的test.txt
FileUtils
FileUtils类包含使用File对象的工具方法。包括读写、复制和比较等等。
public static void main(String[] args) throws IOException {
File file = new File("/application.properties");
List<String> lines = FileUtils.readLines(file, "UTF-8");
System.out.println(lines);
}
- byteCountToDisplaySize:挺人性化的一个方法,可以吧字节数组的长度,转化成用户良好的单位,如EB、GB、MB、KB、bytes等等
public static void main(String[] args) throws Exception {
try (InputStream in1 = new URL("http://commons.apache.org").openStream()) {
String s = FileUtils.byteCountToDisplaySize(IOUtils.toByteArray(in1).length);
System.out.println(s); //26 KB
}
}
- checksum、checksumCRC32:类似于校验MD5和。如
long csum = FileUtils.checksum(file, new CRC32()).getValue();
,一般下载来一个文件后,为了安全可以校验一把 - cleanDirectory:把指定文件夹里面的东西全部删除掉
- contentEquals:依赖于IOUtils.contentEquals
- convertFileCollectionToFileArray:把File的集合转换为File的数组
- copyDirectory(srcDir,destDir,FileFilter):吧src的文件夹内容copy(或者剪切)到dest里面,可以使用FileFilter过滤
- copyFile:可以一个文件copy到另外一个文件,也可以copy到outputStream里面。
- copyFileToDirectory:
- copyInputStreamToFile:
- copyURLToFile:
- deleteDirectory:递归删除这个文件夹里面的所有东西(包括文件夹自己)
- deleteQuietly:既可以删除文件,也可以递归删除文件夹
- directoryContains:指定文件夹下是否包含某个文件
- forceDelete:强制删除一个文件。如果是文件夹,也会递归删除掉。
- forceMkdir:强制创建一个目录
- getTempDirectoryPath:拿到IO的临时文件夹路径
- isFileNewer、isFileOlder:判断该文件的最后修改时间,是否新于给定的Date时间(或者给定文件的lastModified)
- listFiles、listFilesAndDirs:拿到指定文件夹下所有的文件
- moveDirectory、moveFile
- openInputStream:效果同new FileInputStream
- openOutputStream:同上
- readFileToByteArray、readFileToString、readLines
- sizeOf、sizeOfAsBigInteger、:拿到文件/文件夹的大小
- sizeOfDirectory、sizeOfDirectoryAsBigInteger
- toFile(URL url):吧网络上的资源字节编程一个文件
- write、writeByteArrayToFile、writeLines、writeStringToFile:把传入的data串写入到File里面
FilenameUtils
FilenameUtils类包含工具方法不需要使用File对象就可以操作文件名。该类致力于屏蔽Unix和Windows之间的不同,避免这些环境之间的转换(例如,从开发到生产)。 开发在windows、生产在Linux
一般使用较少,这里不做过多介绍.
FileSystemUtils:2.6版本已经废弃。推荐使用JDK自己的FileStore代替
LineIterator:行迭代器
提供灵活的方式使用一个基于行的文件。可以直接,或通过FileUtils或IOUtils的工厂方法创建实例。推荐使用模式:
备注:也是需要close的
Filefilter:包含IOFileFilter、FilenameFilter等。可以在copy、remove等等操作的时候,对文件进行各种过滤行为
此包自带一些常用的Filter如:AgeFileFilter、CanReadFileFilter、CanWriteFileFilter、DirectoryFileFilter、EmptyFileFilter、HiddenFileFilter等等。基本能满足我们所有需求
比较器:比如按照文件名倒序、文件大小倒序这种需求,用此比较器会非常方便。也内置了很多的比较器实现
如:SizeFileComparator、ReverseComparator、LastModifiedFileComparator、ExtensionFileComparator等等
org.apache.commons.io.input和org.apache.commons.io.output包含各种有用、实用的流实现。
- 空输出流——默默的吸收、消化发给它的所有数据。
- 计算流——统计传递的字节数。(CountingInputStream、CountingOutputStream,这个挺好用的)
- 代理流——委托恰当的方法代理。
CopyUtils:已经过期,请使用IOUtils代替