【小家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
相关文章
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
172 1
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
1862 0
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
816 23
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
240 0
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
386 1
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
222 1
|
easyexcel Java Apache
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
2017 0
|
Java 应用服务中间件 API
如何安装与使用Java EE 8、Servlet 3.0及Apache Maven进行高效开发
【7月更文第1天】搭建高效Java EE 8开发环境,包括安装JDK、选择WildFly或Payara Server作为应用服务器,以及安装Apache Maven。使用Maven创建Servlet 3.0 Web项目,编写 HelloWorldServlet,打包部署到服务器,通过访问特定URL测试应用。这一流程助力开发者实现快速原型和大型项目开发。
577 0
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
233 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1

推荐镜像

更多