【小家java】Java之Apache Commons-IO使用精讲(FileUtils、IOUtils、FileFilter全覆盖)(上)

简介: 【小家java】Java之Apache Commons-IO使用精讲(FileUtils、IOUtils、FileFilter全覆盖)(上)

概述


Commons IO是针对开发IO流功能的工具类库。

主要包括六个区域:


1.工具类——使用静态方法执行共同任务


2.输入——用于InputStream和Reader实现


3.输出——用于OutputStream和Writer实现


4.过滤器——各种文件过滤器实现


5.比较器——各种文件的java.util.Comparator实现


6.文件监听器——监听文件系统事件的组件


image.png

工具类


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
相关文章
|
30天前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
65 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
25 1
|
2月前
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
175 23
|
1月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
32 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
70 1
|
23天前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
39 0
|
1月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
35 0
|
1月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
34 0
|
3天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
12天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?

推荐镜像

更多
下一篇
无影云桌面