开源工具系列文章:
Apache Commons Lang(1):http://ray-yui.iteye.com/blog/1953020
Apache Commons Lang(2):http://ray-yui.iteye.com/blog/1958319
Apache Commons BeanUtils:http://ray-yui.iteye.com/blog/1961451
Apache Commons Collections:http://ray-yui.iteye.com/blog/2021484
Apache Commons IO:http://ray-yui.iteye.com/blog/2023034
在Java当中,由于IO架构采用了众多装饰者,令到JavaIO操作可谓是繁杂无比,特别经常需要访问文件系统,操作文件夹/文件,读取字符流转换成字符串等操作,都是一些重复性的操作.所以本着面向对象不重复发明轮子的态度,应该把这些重复性的操作抽取出来形成通用的工具,而Apache提供的common IO组件则早已帮我们完成了一切.
public class TestMain { public static final String TEST_DIRECTORY_PATH_1 = "D:/testDirectory1"; public static final String TEST_DIRECTORY_PATH_2 = "D:/testDirectory2"; public static final File DIRECTORY_1 = new File(TEST_DIRECTORY_PATH_1); public static final File DIRECTORY_2 = new File(TEST_DIRECTORY_PATH_2); public static final String TEST_FILE_PATH_1 = "D:/testDirectory1/test.txt"; public static final String TEST_FILE_PATH_2 = "D:/testDirectory2/test.txt"; public static final File FILE_1 = new File(TEST_FILE_PATH_1); public static final File FILE_2 = new File(TEST_FILE_PATH_2); @Test public void testFileUtils() throws IOException { String fileSize = FileUtils.byteCountToDisplaySize(1024 * 1024); // 转换文件长度单位 Assert.assertEquals("1 MB", fileSize); // 清空某目录下的所有目录,含文件夹和文件 FileUtils.cleanDirectory(DIRECTORY_1); // 如字面意思 FileUtils.convertFileCollectionToFileArray(null); // 将参数1目录下的全部内容复制到参数2目录 FileUtils.copyDirectory(DIRECTORY_1, DIRECTORY_2); // 将参数1目录整个复制到参数2目录下 FileUtils.copyDirectoryToDirectory(DIRECTORY_1, DIRECTORY_2); // copy參數1文件到參數2 FileUtils.copyFile(FILE_1, FILE_2); // copy參數1文件到參數2目錄下 FileUtils.copyFileToDirectory(FILE_1, DIRECTORY_1); // copy URL中文件到參數2 FileUtils.copyURLToFile(new URL("http://www.xxx.com/a.html"), FILE_1); // 强制删除文件 FileUtils.forceDelete(FILE_1); // 将文件转为InputStrem,对应有openOutStream方法 FileUtils.openInputStream(FILE_1); FileUtils.openOutputStream(FILE_1); // 读取文件转为字节数组 FileUtils.readFileToByteArray(FILE_1); // 读取文件转换为String类型,方便文本读取 FileUtils.readFileToString(FILE_1, "UTF-8"); // 返回目录的大小 FileUtils.sizeOfDirectory(DIRECTORY_1); // 写字符串到参数1文件中 FileUtils.writeStringToFile(FILE_1, "test", "UTF-8"); } }
除了提供对文件操作的便利,对文件名的操作亦有诸多方法可供调用
public class TestMain { public static final String FILE_NAME = "D:/Hello/World.txt"; @Test public void testFileUtils() throws IOException { // 获取文件后缀名 String extensionName = FilenameUtils.getExtension(FILE_NAME); Assert.assertEquals("txt", extensionName); // 获取文件路径,忽略分割符 / String fullPath1 = FilenameUtils.getFullPathNoEndSeparator(FILE_NAME); Assert.assertEquals("D:/Hello", fullPath1); // 获取文件路径,不忽略分隔符 String fullPath2 = FilenameUtils.getFullPath(FILE_NAME); Assert.assertEquals("D:/Hello/", fullPath2); // 获取文件名,不包含后缀 String baseName = FilenameUtils.getBaseName(FILE_NAME); Assert.assertEquals("World", baseName); // 获取文件名,含后缀 String name = FilenameUtils.getName(FILE_NAME); Assert.assertEquals("World.txt", name); // 获取盘符 String prefix = FilenameUtils.getPrefix(FILE_NAME); Assert.assertEquals("D:/", prefix); // 通配符匹配 Boolean isMatch = FilenameUtils.wildcardMatch(FILE_NAME, "D:/Hello*"); Assert.assertEquals(true, isMatch); } }
Apache common IO包令我們从繁杂的文件操作和IO操作中得以解脱,本着不重复发明轮子的面向对象理念.我们应该遵从拿来主义,直接使用一些已经公认的common组件例如apache google的通用common包來減少我們的开发时间,提高我们的开发效率..但由于apache的common包使用的是阻塞IO,若对性能要求苛刻或想追求性能极致的系统,还是建议自己编写基于Buffer和Chaneel的NIO来进行IO操作