Common IO 是一个工具库,用来帮助开发IO功能 它包括6个主要部分

  • Utility classes – 包括一些静态方法来执行常用任务
  • InputInputStreamReader 实现
  • OutputOutputStreamWriter 实现
  • Filters – 多种文件过滤器实现(定义了 IOFileFilter接口,同时继承了 FileFilterFilenameFilter 接口)
  • Comparators – 用于文件比较的多种java.util.Comparatot实现

发行版本


  • Commons IO 2.5 (requires JDK 1.6+)
  • Commons IO 2.4 (requires JDK 1.6+)
  • Commons IO 2.2 (requires JDK 1.5+)

用户指南


Commons-IO 包括 工具类 (utility classes), 字节序列类 (endian classes), 行迭代器 (line iterator), 文件过滤器 (file filters),文件比较器 (file comparators) 和 流实现 (stream implementations).

Utility classes

IOUtils

IOUtils 包含一些工具类,用于处理读,写和拷贝,这些方法基于 InputStream, OutputStream, ReaderWriter工作.

例如,思考一个任务,从URL中读取byte数据,并打印。通常会这样做:

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 {
in.close();
}

使用 IOUtils类,可以这样:

InputStream in = new URL( "http://commons.apache.org" ).openStream();
try {
System.out.println( IOUtils.toString( in ) );
} finally {
IOUtils.closeQuietly(in);
}

在某些应用领域,例如IO操作中是很常见的,这个类可以节省很多时间。并且你可以依赖于经过全面测试的代码。

对于这类的代码,灵活性和速度是最重要的。然而你也应该明白这么做的限制。使用以上的方式读取一个1GB的文件将会试图创造一个1GB字符串对象

FileUtils

FileUtils 包含一些工具类,它们基于File对象工作,包括读,写,拷贝和比较文件

例如逐行读取整个文件你可以使用:

File file = new File("/commons/io/project.properties");
List lines = FileUtils.readLines(file, "UTF-8");

FilenameUtils

FilenameUtils包含一些工具类,它们基于文件名工作而不是File对象。这个类旨在 在Unix和Windows环境下保持一致,帮助在两个环境下过渡(如从开发环境到生成环境)

例如,正常化文件名,删除..片段:

String filename = "C:/commons/io/../lang/project.xml";
String normalized = FilenameUtils.normalize(filename);
// result is "C:/commons/lang/project.xml"

FileSystemUtils

FileSystemUtils包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是得到驱动器空余空间。注意这使用命令行而不是 native code。

例如得到驱动器空余空间:

long freeSpace = FileSystemUtils.freeSpace("C:/");

Endian classes

不同的计算机架构对应字节序采用不同的约定,在所谓的”小端”架构(例如Intel),低位字节被存储在内存的最低字节,之后的字节在高地址。对于”大端”架构(如Motoroal),情况相反。

在这个包中有两个相关联的类:

  • EndianUtils 包含静态方法来交换Java基本类型和流的字节序
  • SwappedDataInputStream实现了DataInput接口。可以从文件中读取非本地字节序。

Line iterator

org.apache.commons.io.LineIterator类提供类灵活的方式操作基于行的文件。通过FileUtilsIOUtils中的工厂方法,可以直接创建一个实例。推荐的使用方法是:

LineIterator it = FileUtils.lineIterator(file, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
/// do something with line
}
} finally {
LineIterator.closeQuietly(iterator);
}

File filters

org.apache.commons.io.filefilter包定义了一个接口 (IOFileFilter),同时继承了 java.io.FileFilterjava.io.FilenameFilter接口。除此之外还提供了一系列可以使用的IOFileFilter接口实现,包括允许你组合其他过滤器。这些过滤器可以用来遍历文件或在FileDialog中使用。

详情见 filefilter 包的Javadoc。

File comparators

org.apache.commons.io.comparator包为java.io.File提供一些java.util.Comparator实现。这些比较器可以用来排序列表和文件数字。

详情见 comparator 包的Javadoc。

Streams

org.apache.commons.io.inputorg.apache.commons.io.output 包中包含一些有用的流实现。他们包括:

  • Null output stream – 默默吸收所有发给它的数据
  • Tee output stream – 发送输出数据给两个流而不是一个
  • Byte array output stream – 这是一个比JDK更快的版本
  • Counting streams – 计算通过的字节数
  • Proxy streams – 在代理中委托正确的方法
  • Lockable writer – 使用锁文件提供写入同步

详情见 inputoutput 包的Javadoc。

最佳实践


本文档提供一些在IO领域的最佳实践

java.io.File

通常,你要处理文件和文件名。有很多地方可能出错:

  • 一个类在Uinx下正常工作但是在Windows下不工作(反之亦然)
  • 由于重复或丢失路径分隔符造成无效的文件名
  • 等等

这些都是不使用字符串类型文件名的充分理由。使用 java.io.File 可以很好的处理上述情况。因此,我们的最佳实践建议对文件名使用 java.io.File 代替字符串来避免平台依赖。

commons-io 1.1开始包含一个专门用于文件名的处理类 – FilenameUtils。这会处理很多这类文件名问题,但是我们仍然建议尽可能的使用 java.io.File 对象

让我们来看一个例子:

public static String getExtension(String filename) {
int index = filename.lastIndexOf('.');
if (index == -1) {
return "";
} else {
return filename.substring(index + 1);
}
}

很容易?是的,但是如果传入一个全路径而不只是文件名会发生什么?考虑一下,完全合法的路径: “C:\Temp\documentation.new\README”。这个方法将会返回”new\README”,绝对不是你想要的

请使用 java.io.File 代替字符串作为文件名。这个类提供的方法经过了良好的测试。在 FileUtil你会发现其他关于 java.io.File 有用的工具方法。

String tmpdir = "/var/tmp";
String tmpfile = tmpdir + System.getProperty("file.separator") + "test.tmp";
InputStream in = new java.io.FileInputStream(tmpfile);

替代

File tmpdir = new File("/var/tmp");
File tmpfile = new File(tmpdir, "test.tmp");
InputStream in = new java.io.FileInputStream(tmpfile);

Buffering streams

IO性能很多情况下取决于缓冲策略。通常以512或1024比特读取数据块会相当快,因为这些大小的数据块和硬盘在文件系统中的数据块大小或文件系统缓存很搭配。但是如果你只需要读取结果字节那么性能会有显著下降

确保你在读取或写入流时正确的进行缓冲,特别是使用文件时,只在 BufferedInputStream 上包装 FileInputStream

InputStream in = new java.io.FileInputStream(myfile);
try {
in = new java.io.BufferedInputStream(in);
in.read(.....
} finally {
IOUtils.closeQuietly(in);
}

注意不要缓冲一个已经被缓冲的流。一些组件例如 XML 解析器可能自己缓冲,所以装饰传递给 XML 解析器的InputStream只会拖慢的代码。如果你使用我们的 CopyUtils 或者 IOUitls你不需要另外缓冲,你使用的代码在复制过程的已经缓冲。经常检查Javadocs中的信息。另一种情况,当你向ByteArrayOutputStream中写入时,缓冲不是必须的,因为你只写入内存。

【转】Java Commons.IO 库官方文档的更多相关文章

  1. Java:各版本官方文档

    JDK16:https://docs.oracle.com/en/java/javase/16/docs/api/index-files/index-1.html JDK15:https://docs ...

  2. surprise库官方文档分析(二):使用预测算法

    1.使用预测算法 Surprise提供了一堆内置算法.所有算法都派生自AlgoBase基类,其中实现了一些关键方法(例如predict,fit和test).可以在prediction_algorith ...

  3. surprise库官方文档分析(一)

    一:入门 1.基本用法 (1).自动交叉验证 Surprise有一套内置的 算法和数据集供您使用.在最简单的形式中,只需几行代码即可运行交叉验证程序: from surprise import SVD ...

  4. surprise库官方文档分析(三):搭建自己的预测算法

    1.基础 创建自己的预测算法非常简单:算法只不过是一个派生自AlgoBase具有estimate 方法的类.这是该方法调用的predict()方法.它接受内部用户ID,内部项ID,并返回估计评级r f ...

  5. [转]Commons IO 官方文档

    原文地址:http://ifeve.com/commons-io/ 本文翻译自 Commons IO 官方文档 译者:MagicWolf Common IO 是一个工具库,用来帮助开发IO功能 它包括 ...

  6. 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...

  7. Spring 4 官方文档学习 Spring与Java EE技术的集成

    本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...

  8. Spring Data Commons 官方文档学习

    Spring Data Commons 官方文档学习   -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...

  9. java中的方法引用(method reference)官方文档总结

    2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...

  10. Java学习全攻略-->阅读官方文档

    一直感觉Java的官方文档有些杂乱,最近特意整理了一下,仅供参考. 入口 Oracle官方文档入口:http://docs.oracle.com/.下级页面这边只整理了JavaEE跟JavaSE的文档 ...

随机推荐

  1. SolidWorks Flexnet Serve 正在启动...

    SolidWorks Flexnet Serve 正在启动... 解决方案 设置->主页->电脑名称改成英文 电脑重启 具体流程 事情是这样,当我在安装solidworks2022时候发现 ...

  2. 商品中心—17.缓存与DB一致性的技术文档

    大纲 1.缓存与数据库一致性服务的设计 2.缓存与数据库一致性服务的注解 3.缓存与数据库一致性服务的处理入口 4.缓存与数据库一致性服务的消费缓存消息 5.缓存与数据库一致性服务的消费检查 6.缓存 ...

  3. C# WinFrom 中程序完全退出,终止

    https://wenku.baidu.com/view/621fbbec0066f5335b81218f.html 一.关闭窗体在c#中退出WinForm 程序包括有很多方法, 如:this.Clo ...

  4. Luogu P10507 Georgia and Bob 题解

    P10507 Georgia and Bob 这篇题解的注重点不是结论的证明,而是发现结论的思路,所以比较偏感性.证明人人都会,而发现结论的思路才是这题真正值得思考的地方. 感觉这道题不知道阶梯 NI ...

  5. Nextcloud Error - access through untrusted domain

    最近虚拟机的地址更改了,然后发现NextCloud就不可用了.报错如下: 根据报错里的提示来找到config.php. [root@localhost nextcloud]# find / -xdev ...

  6. mariadb 中 mysql 初始化配置密码

    简介 设定初始密码 命令如下 mysql_secure_installation 参考文献 https://www.cnblogs.com/keithtt/p/6922378.html

  7. python 格式修复

    简介 使用工具yapf example yapf a.py

  8. 谷歌为何落后于OpenAI?AWS的这条管理原则预言了结局

    2012 年我大学毕业,作为一名初入职场的软件工程师开始了职业生涯. 那时,AWS 正逐步进入日本市场,很多 IT 公司开始从本地部署迁移到云端.我的第一个项目是在日立公司基于 AWS 构建基础设施. ...

  9. SciTech-EECS-Power-FET: $\large \text{Static characteristics}$ + $\large V_{GS} 与 V_{DS}$决定四工作区 + FET适配MCU或TTL信号 + $\large V_{GS}$振荡消除 + 分立驱动(单BJT升压 或 双BJT推挽扩流) 或专用驱动(如UC3842) + Infineon产MOSFET示例

    SciTech-EECS-Power-FET: \(\large V_{GS} 与 V_{DS}\)决定四工作区(关断|变阻|恒流|击穿) + FET适配(升压+扩流)驱动电路 + 分立电路(单三极管 ...

  10. java中如何处理夏令时?

    在国际化的项目中,处理时间时经常会遇到夏令时(BST,British Summer Time)问题,发明夏令时(以及冬令时)主要是为了省电.   冷知识:中国历史上也曾经采用过(1986-1991)夏 ...