FileUtils:
顾名思义,用于处理和File相关的一个static工具函数类。
<1>对于这种工具类本身,一般会为其加一个final的modifier,毕竟一般来说是没有被继承的必要的。
<2>取得文件后缀的函数: 很简单,但是要考虑这种情况:
.tar.bz2/.tar.gz/.tar.xz/.tar.Z
对于这类文件,要从.tar开始作为文件的后缀。实现中会维护一个这类特殊后缀的set<String>,每次会做contains测试。
<3>计算某个File内容的MD5,这类操作最值得封装为工具函数了,我都想不通GOOGLE为啥不直接提供一个MD5函数<针对字符串>,
还需要自己使用MessageDigest和DigestInputStream来做取得,并且这个操作的实现也没啥值得记的价值,如果某个公司面试
是要写出这类操作的完整code,那么这家公司的水平绝对是不敢恭维的。
只记录一些要点:MessageDigest 在digest之后返回的是一个byte[], 而一般来说,我们需要的都是string,并且是HEX格式的,
因此还需要一个StringBuilder来进行转化,因为是HEX,那么对于一个byte<8bit>来说,能表达的最大数字就是255,hex下就是ff,
也就是说转为string的话,一个byte会对应两个字符<MD5是定长位的>,因此对于一个byte,
要sb.append(Integer.toHexString((b >> 4) & 0xf))和 sb.append(Integer.toHexString(b & 0xf)) 注意高位在字符串前。
虽然现在MD5被搞的不行,但是通常来说够用了<Git用的是SHA,不过我还经历过一次collison>
顺带直接提供了MD5 verify的功能。
<4>File之间的copy,得到File的Input/OutputStream以后,开一个byte[] 的Buffer来不断的read/write,
还要考虑到同一个File的问题,最开头做一个equals检测,
最开始写还2b了,竟然没有用BufferedInput/OutputStream。
没有rollback,不过会提供一个boolean的return value。
<5>一个文件的toString,输入参数还有一个Charset, 这里是用InputStreamReader转换FileInputStream,
不直接使用FileReader的原因是FileReader不支持设置Charset,并且FileReader的源码实现也是InputStreamReader转换
FileInputStream,因为是reader,那么在read的时候的buffer就需要是char[]了。同样的StringBuilder不断append read
出来的内容,最后StringBuilder.toString().
<6>向某个File以某个Charset写入CharSequence,用OutputStreamWriter封装了FileOutputStream之后,直接调用其append<方便>。
<7>读取某个File<File对象/File path>,BufferedReader包装<InputStreamReader转接FileInputStream>,
使用StingBuilder + char[] buffer 来不断的read+append,最后StingBuilder.toString().
其实和toString一样,直接用默认的charset罢了,懒,没有抽成通用函数。
<8>返回某个File的大小<File path>,目录的话认为是0.
<9>mkdir,封装一些例外。
<10>deleteFolder<清空folder,名字起的不好>, 提供了一个String[]进行豁免。不断DFS递归调用,在真正要删除某个File前,检查一下
File.canWrite();
<11>得到一个在folder内unique的File文件夹<说白了就是有一样名字的file的话的就在后面加个后缀1,2,3.....>。
<12>得到一个unique的Dir<输入的是一个path>,首先检查path对应的parentFile是否存在,以及是否是dir,如果是的话,直接调用<11>的函
数即可,否则,从根目录开始检查每个parentdir,如果不存在就使用<11>提供的方法创建相应dir。
顾名思义,用于处理和File相关的一个static工具函数类。
<1>对于这种工具类本身,一般会为其加一个final的modifier,毕竟一般来说是没有被继承的必要的。
<2>取得文件后缀的函数: 很简单,但是要考虑这种情况:
.tar.bz2/.tar.gz/.tar.xz/.tar.Z
对于这类文件,要从.tar开始作为文件的后缀。实现中会维护一个这类特殊后缀的set<String>,每次会做contains测试。
<3>计算某个File内容的MD5,这类操作最值得封装为工具函数了,我都想不通GOOGLE为啥不直接提供一个MD5函数<针对字符串>,
还需要自己使用MessageDigest和DigestInputStream来做取得,并且这个操作的实现也没啥值得记的价值,如果某个公司面试
是要写出这类操作的完整code,那么这家公司的水平绝对是不敢恭维的。
只记录一些要点:MessageDigest 在digest之后返回的是一个byte[], 而一般来说,我们需要的都是string,并且是HEX格式的,
因此还需要一个StringBuilder来进行转化,因为是HEX,那么对于一个byte<8bit>来说,能表达的最大数字就是255,hex下就是ff,
也就是说转为string的话,一个byte会对应两个字符<MD5是定长位的>,因此对于一个byte,
要sb.append(Integer.toHexString((b >> 4) & 0xf))和 sb.append(Integer.toHexString(b & 0xf)) 注意高位在字符串前。
虽然现在MD5被搞的不行,但是通常来说够用了<Git用的是SHA,不过我还经历过一次collison>
顺带直接提供了MD5 verify的功能。
<4>File之间的copy,得到File的Input/OutputStream以后,开一个byte[] 的Buffer来不断的read/write,
还要考虑到同一个File的问题,最开头做一个equals检测,
最开始写还2b了,竟然没有用BufferedInput/OutputStream。
没有rollback,不过会提供一个boolean的return value。
<5>一个文件的toString,输入参数还有一个Charset, 这里是用InputStreamReader转换FileInputStream,
不直接使用FileReader的原因是FileReader不支持设置Charset,并且FileReader的源码实现也是InputStreamReader转换
FileInputStream,因为是reader,那么在read的时候的buffer就需要是char[]了。同样的StringBuilder不断append read
出来的内容,最后StringBuilder.toString().
<6>向某个File以某个Charset写入CharSequence,用OutputStreamWriter封装了FileOutputStream之后,直接调用其append<方便>。
<7>读取某个File<File对象/File path>,BufferedReader包装<InputStreamReader转接FileInputStream>,
使用StingBuilder + char[] buffer 来不断的read+append,最后StingBuilder.toString().
其实和toString一样,直接用默认的charset罢了,懒,没有抽成通用函数。
<8>返回某个File的大小<File path>,目录的话认为是0.
<9>mkdir,封装一些例外。
<10>deleteFolder<清空folder,名字起的不好>, 提供了一个String[]进行豁免。不断DFS递归调用,在真正要删除某个File前,检查一下
File.canWrite();
<11>得到一个在folder内unique的File文件夹<说白了就是有一样名字的file的话的就在后面加个后缀1,2,3.....>。
<12>得到一个unique的Dir<输入的是一个path>,首先检查path对应的parentFile是否存在,以及是否是dir,如果是的话,直接调用<11>的函
数即可,否则,从根目录开始检查每个parentdir,如果不存在就使用<11>提供的方法创建相应dir。