【小家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
相关文章
|
8月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
247 0
|
5月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
253 1
|
7月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。
|
8月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
180 2
|
7月前
|
SQL Java 数据库连接
Java IO流(一):字节流与字符流基础
本文全面解析Java IO流,涵盖字节流、字符流及其使用场景,帮助开发者理解IO流分类与用途,掌握文件读写、编码转换、异常处理等核心技术,通过实战案例提升IO编程能力。
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
539 23
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
448 0
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
269 10
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
458 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)

热门文章

最新文章

推荐镜像

更多