【小家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
相关文章
|
7月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
254 23
|
8月前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
239 0
|
11月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
179 10
|
12月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
330 57
|
12月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
307 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
12月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
123 1
|
12月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
111 0
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
153 1
|
22天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
61 0

热门文章

最新文章

推荐镜像

更多