返回文章列表文章索引阅读全文
STARBLOG / 阅读手记
Java

Apache-Commons-IO-最佳实践

本文列举了Java输入输出部分(IO area)的大量“最佳实践”(best practices)。 java.io.File 通常你需要去处理文件或文件名时,有许多会出错的情况: 一个类可在Unix运行但不能在Windows运行,反之亦然。 由于双路径分隔符(path separator)或缺失路径分隔符(path separator)导致文件名无效。 (在Windows上的)符合通用命名标准(

曦远 (DealiAxy)约 6 分钟
目录2 个章节

本文列举了Java输入输出部分(IO area)的大量“最佳实践”(best practices)。

java.io.File

通常你需要去处理文件或文件名时,有许多会出错的情况:

  • 一个类可在Unix运行但不能在Windows运行,反之亦然。
  • 由于双路径分隔符(path separator)或缺失路径分隔符(path separator)导致文件名无效。
  • (在Windows上的)符合通用命名标准(UNC)的文件名无法在开发人员开发的(home-grown)工具方法中运行
  • 等等

上述是字符串(String)文件名不运行的准确原因。使用java.io.File类代为处理上述情况将更合适。因此我们的最佳实践(best practice)推荐使用java.io.File类代替字符串(String)处理文件名以避免依赖具体的平台(platform)。

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);
   }
 }

简单吗?对,但如果开发人员传入(pass)一个全路径(full path)字符串而不仅仅是一个文件名会发生什么?考虑以下情况,传入完全符合要求的路径:"C:\Temp\documentation.new\README"。上面定义的方法(method)可能返回(return) "new\README"-完全不是你想要的结果。

请使用 java.io.File 代替字符串(String)处理文件名。该类所提供的功能是经过良好测试的(well tested)。在文件工具类(FileUtils)中你将找到关于 java.io.File 的其他有用的工具方法(function)。

例如:

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)

输入输出性能非常依赖缓冲策略(buffering strategy)。一般而言,缓冲512或1024大小字节来读取数据块(packets)是非常迅速的,因为这个大小与数据块(packets)在硬盘(harddisk)文件系统(file system)或文件缓存(file system cache)中的大小非常匹配。而且当你仅仅读取一点字节时,时间性能就会显著下降(drop)。

当读取或写入输入输出流时,特别是当访问文件的时候,确保你正确地缓冲输入输出流。只需要使用缓冲字节输入流(BufferedInputStream)修饰(decorate)你的文件字节输入流(FileInputStream)即可

译注:Java中的输入输出流采用了修饰模式,或叫装饰模式:

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

注意,你不能缓存一个已经缓冲了的输入输出流。 一些组件,例如XML解析器(XML parser)会使用他们自己的字节输入流(InputStream)缓存修饰(decorate),你传递一个缓存输入输出流到XML解析器(XML parser)也没多大影响但会拖慢(slow down)你的代码性能。如果你用我们的复制工具类(CopyUtils)或输入输出工具类(IOUtils),你就不需要额外缓冲输入输出流,将这些代码当作已经在复制过程中缓存了即可。检查Javadoc可以获取更多信息。其他如在你写入一个字节数组输出流(ByteArrayOutputStream)到内存(memory)的情况,是不需要缓冲的。

本文由侯骏雄授权发表。 翻译:侯骏雄(QQ:2442278700) 博客:http://blog.csdn.net/houjx114

_EOF_

Apache-Commons-IO-最佳实践

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

深入Jar包:Gradle构建可执行jar包与访问jar包中文件夹与文件

前言 Java的跨平台功能听起来很诱人可口,号称“Write Once,Run Everywhere”,实际上是“Run Once,Debug Everywhere”... 在实际开发过程中还是会遇到各种各样的坑的,刚刚解决了一系列问题,特地写个文章总结一下。 使用Gradle构建Jar包 感谢万能的Gradle,极大提高了Java开发的生产力~ 在Gradle中生成jar包可以使用官方的插件:a

2022-05-27 · Java · 约 1 分钟

Spring-Boot:创建第一个应用

简介 Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作。在本教程中,将学习如何使用 Spring Boot 的 starter、特性和可执行 JAR 文件结构,快速创建能直接运行的基于 Spring 的应用程序。 本文使用IDEA作为开发工具,Gradle作为构建工具,创建一个简单的SpringBoot应用,暂时不涉及数据库的配置。 使用IDEA创建

2022-05-27 · Java · 约 1 分钟

2020年第一次用上Struts2框架做Web开发的体验

SliiyStruts2 又名 sb-struts2,因为struts真的太难用了(也许在很多年前是很好用的,但是现在看来,被其他框架秒成渣) 前言 想不到我还是得和这struts框架打交道啊,从一开始学web的时候就十分抵制这类古老,使用反人类的框架,不过为了帮女朋友做个学校的作业,还是得搞一下,然而,半小时就写好的业务代码,因为我不熟悉这个框架和Java的这套体系,调试了半天才成功run起来…

2022-06-17 · Java · 约 1 分钟

JavaWeb开发---Servlet的生命周期实验

前言 Servlet是运行在服务器端的程序,它的运行状态由Servlet容器(简称容器)来维护。 通常,在容器收到客户对Servlet的请求时,容器会判断这个Servlet是否为第一次被访问,如果是第一次被访问,则会创建一个Servlet实例同时调用该实例的init()方法,进行初始化。 每个Servlet只会被创建一个实例,同时也只会被初始化一次。然后将这个实例一直保存在内存中,对所有的请求进行

2022-05-27 · Java · 约 1 分钟

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…