概述
Commons IO是针对开发IO流功能的工具类库。
主要包括六个区域:
1.工具类——使用静态方法执行共同任务
2.输入——用于InputStream和Reader实现
3.输出——用于OutputStream和Writer实现
4.过滤器——各种文件过滤器实现
5.比较器——各种文件的java.util.Comparator实现
6.文件监听器——监听文件系统事件的组件
工具类
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