commons-io工具包的基本使用

Java之路径操纵解决的误区 目前网络上查询的Java解决 Path Manipulation 弱点的方案是不足的甚至是错误的,有一定的误导性。比如stackoverflow 有一篇的解决方案是建议使用 Java本身的Path 或者是Apache Common IO 的normalize()方法来对路径进行规范化处理。 阅读详情
AI摘要

本文详细介绍了CommonIO工具库的各个组成部分,包括IOUtils、FileUtils、FilenameUtils、FileSystemUtils等工具类的使用方法,以及输入输出流的高级操作、文件过滤器、比较器和文件监控等功能。

目录

一、工具类

IOUtils的使用:

FileUtils的使用:

FilenameUtils的使用

FileSystemUtils的使用:

二、输入、输出

三、Filters过滤器

四、Comparators比较器

五、Monitor文件监控


简介:

java io操作是开发中比较常用的技术,但是如果每次都使用原生的IO流来操作会显得比较繁琐。

Common IO 是一个工具库,用来帮助开发IO功能, 它包括6个主要部分

  • Utility classes – 工具类,包括一些静态方法来执行常用任务
  • Input – 输入,InputStream 和 Reader 实现
  • Output – 输出,OutputStream 和 Writer 实现
  • Filters – 过滤器,多种文件过滤器实现(定义了 IOFileFilter接口,同时继承了 FileFilter 和 FilenameFilter 接口)
  • Comparators – 比较器,用于文件比较的多种java.util.Comparatot实现
  • File Monitor–文件监控

 

添加maven依赖:

<dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.6</version>

</dependency>

 

一、工具类

IOUtils 包含一些工具类,用于处理读,写和拷贝,这些方法基于 InputStream, OutputStream, Reader 和 Writer工作.

FileUtils 包含一些工具类,它们基于File对象工作,包括读,写,拷贝和比较文件

FilenameUtils包含一些工具类,它们基于文件名工作而不是File对象。这个类旨在 在Unix和Windows环境下保持一致,帮助在两个环境下过渡(如从开发环境到生成环境)

FileSystemUtils包含一些工具类,基于文件系统访问功能不被JDK支持。目前,只有一个方法就是得到驱动器空余空间。注意这使用命令行而不是 native code。

 

EndianUtils 包含静态方法来交换Java基本类型和流的字节序

SwappedDataInputStream实现了DataInput接口。可以从文件中读取非本地字节序。

 

IOUtils的使用:

IOUtils.copy(InputStream input, OutputStream output) // 此方法有多个重载方法,满足不同的输入输出流

IOUtils.copy(InputStream input, OutputStream output, int bufferSize)

IOUtils.copy(InputStream input, Writer output, String inputEncoding)

IOUtils.copy(Reader input, Writer output)

IOUtils.copy(Reader input, OutputStream output, String outputEncoding)

// 这个方法适合拷贝较大的数据流,比如2G以上

IOUtils.copyLarge(Reader input, Writer output) // 默认会用1024*4的buffer来读取

IOUtils.copyLarge(Reader input, Writer output, char[] buffer)

 

IOUtils.toInputStream(String input, String encoding) // 通过文本获取输入流 , 可以指定编码格式

IOUtils.toInputStream(String input, Charset encoding)

IOUtils.toBufferedInputStream(InputStream input) // 获取一个缓冲输入流,默认缓冲大小 1KB

IOUtils.toBufferedInputStream(InputStream input, int size) // 获取一个指定缓冲流的大小的输入流

IOUtils.toBufferedReader(Reader reader) // 获取一个字符缓冲流

IOUtils.toBufferedReader(Reader reader, int size)

 

// 获取缓冲流

IOUtils.buffer(InputStream inputStream)

IOUtils.buffer(OutputStream outputStream)

IOUtils.buffer(Reader reader)

IOUtils.buffer(Writer writer)

 

// 将输入流转换成字符串

IOUtils.toString(Reader input)

IOUtils.toString(byte[] input, String encoding)

IOUtils.toString(InputStream input, Charset encoding)

IOUtils.toString(InputStream input, String encoding)

IOUtils.toString(URI uri, String encoding)

IOUtils.toString(URL url, String encoding)

 

// 将输入流转换成字符数组

IOUtils.toByteArray(InputStream input)

IOUtils.toByteArray(InputStream input, int size)

IOUtils.toByteArray(URI uri)

IOUtils.toByteArray(URL url)

IOUtils.toByteArray(URLConnection urlConn)

IOUtils.toByteArray(Reader input, String encoding)

 

// 字符串读写

IOUtils.readLines(Reader input)

IOUtils.readLines(InputStream input, Charset encoding)

IOUtils.readLines(InputStream input, String encoding)

IOUtils.writeLines(Collection<?> lines, String lineEnding, Writer writer)

IOUtils.writeLines(Collection<?> lines, String lineEnding, OutputStream output, Charset encoding)

IOUtils.writeLines(Collection<?> lines, String lineEnding, OutputStream output, String encoding)

// 从一个流中读取内容

IOUtils.read(InputStream input, byte[] buffer)

IOUtils.read(InputStream input, byte[] buffer, int offset, int length) IOUtils.read(Reader input, char[] buffer)

IOUtils.read(Reader input, char[] buffer, int offset, int length)

// 把数据写入到输出流中

IOUtils.write(byte[] data, OutputStream output)

IOUtils.write(byte[] data, Writer output, Charset encoding)

IOUtils.write(byte[] data, Writer output, String encoding)

IOUtils.write(char[] data, Writer output)

IOUtils.write(char[] data, OutputStream output, Charset encoding) IOUtils.write(char[] data, OutputStream output, String encoding)

IOUtils.write(String data, Writer output)

IOUtils.write(CharSequence data, Writer output)

 

// 从一个流中读取内容,如果读取的长度不够,就会抛出异常

IOUtils.readFully(InputStream input, int length)

IOUtils.readFully(InputStream input, byte[] buffer)

IOUtils.readFully(InputStream input, byte[] buffer, int offset, int length) IOUtils.readFully(Reader input, char[] buffer)

IOUtils.readFully(Reader input, char[] buffer, int offset, int length)

 

IOUtils.contentEquals(InputStream input1, InputStream input2) // 比较两个流是否相等

IOUtils.contentEquals(Reader input1, Reader input2)

IOUtils.contentEqualsIgnoreEOL(Reader input1, Reader input2) // 比较两个流,忽略换行符

 

IOUtils.skip(InputStream input, long toSkip) // 跳过指定长度的流

IOUtils.skip(Reader input, long toSkip)

IOUtils.skipFully(InputStream input, long toSkip) // 如果忽略的长度大于现有的长度,就会抛出异常

IOUtils.skipFully(Reader input, long toSkip)

 

// 读取流,返回迭代器

IOUtils.lineIterator(Reader reader)

IOUtils.lineIterator(InputStream input, Charset encoding)

IOUtils.lineIterator(InputStream input, String encoding)

 

// 关闭流

IOUtils.close(URLConnection conn)

// 其他的关闭方法推荐使用 Closeable.close()

 

FileUtils的使用:

// 复制文件夹

FileUtils.copyDirectory(File srcDir, File destDir) // 复制文件夹(文件夹里面的文件内容也会复制)

FileUtils.copyDirectory(File srcDir, File destDir, FileFilter filter) // 复制文件夹,带有文件过滤功能

FileUtils.copyDirectoryToDirectory(File srcDir, File destDir) // 以子目录的形式将文件夹复制到到另一个文件夹下

 

// 复制文件

FileUtils.copyFile(File srcFile, File destFile) // 复制文件

FileUtils.copyFile(File input, OutputStream output) // 复制文件到输出流

FileUtils.copyFileToDirectory(File srcFile, File destDir) // 复制文件到一个指定的目录

FileUtils.copyInputStreamToFile(InputStream source, File destination) // 把输入流里面的内容复制到指定文件

FileUtils.copyURLToFile(URL source, File destination) // 把URL 里面内容复制到文件(可以下载文件)

FileUtils.copyURLToFile(URL source, File destination, int connectionTimeout, int readTimeout)

 

// 把字符串写入文件

FileUtils.writeStringToFile(File file, String data, String encoding)

FileUtils.writeStringToFile(File file, String data, String encoding, boolean append)

// 把字节数组写入文件

FileUtils.writeByteArrayToFile(File file, byte[] data)

FileUtils.writeByteArrayToFile(File file, byte[] data, boolean append) FileUtils.writeByteArrayToFile(File file, byte[] data, int off, int len) FileUtils.writeByteArrayToFile(File file, byte[] data, int off, int len, boolean append)

// 把集合里面的内容写入文件

// encoding:文件编码,lineEnding:每行以什么结尾

FileUtils.writeLines(File file, Collection<?> lines)

FileUtils.writeLines(File file, Collection<?> lines, boolean append)

FileUtils.writeLines(File file, Collection<?> lines, String lineEnding)

FileUtils.writeLines(File file, Collection<?> lines, String lineEnding, boolean append)

FileUtils.writeLines(File file, String encoding, Collection<?> lines)

FileUtils.writeLines(File file, String encoding, Collection<?> lines, boolean append)

FileUtils.writeLines(File file, String encoding, Collection<?> lines, String lineEnding)

FileUtils.writeLines(File file, String encoding, Collection<?> lines, String lineEnding, boolean append)

// 往文件里面写内容

FileUtils.write(File file, CharSequence data, Charset encoding)

FileUtils.write(File file, CharSequence data, Charset encoding, boolean append)

FileUtils.write(File file, CharSequence data, String encoding)

FileUtils.write(File file, CharSequence data, String encoding, boolean append)

 

// 文件移动

FileUtils.moveDirectory(File srcDir, File destDir) // 文件夹在内的所有文件都将移动FileUtils.moveDirectoryToDirectory(File src, File destDir, boolean createDestDir) // 以子文件夹的形式移动到另外一个文件下

FileUtils.moveFile(File srcFile, File destFile) // 移动文件

FileUtils.moveFileToDirectory(File srcFile, File destDir, boolean createDestDir) // 以子文件的形式移动到另外一个文件夹下

FileUtils.moveToDirectory(File src, File destDir, boolean createDestDir) // 移动文件或者目录到指定的文件夹内

 

// 清空和删除文件夹

FileUtils.deleteDirectory(File directory) // 删除文件夹,包括文件夹和文件夹里面所有的文件

FileUtils.cleanDirectory(File directory) // 清空文件夹里面的所有的内容

FileUtils.forceDelete(File file) // 删除,会抛出异常

FileUtils.deleteQuietly(File file) // 删除,不会抛出异常

 

// 创建文件夹

FileUtils.forceMkdir(File directory) // 创建文件夹(可创建多级)

FileUtils.forceMkdirParent(File file) // 创建文件的父级目录

 

// 获取文件输入/输出流

FileUtils.openInputStream(File file)

FileUtils.openOutputStream(File file)

// 读取文件

FileUtils.readFileToByteArray(File file) // 把文件读取到字节数组

FileUtils.readFileToString(File file, Charset encoding) // 把文件读取成字符串

FileUtils.readFileToString(File file, String encoding)

FileUtils.readLines(File file, Charset encoding) // 把文件读取成字符串集合

FileUtils.readLines(File file, String encoding)

 

// 测试两个文件的修改时间

FileUtils.isFileNewer(File file, Date date)

FileUtils.isFileNewer(File file, File reference)

FileUtils.isFileNewer(File file, long timeMillis)

FileUtils.isFileOlder(File file, Date date)

FileUtils.isFileOlder(File file, File reference)

FileUtils.isFileOlder(File file, long timeMillis)

 

 

// 文件/文件夹的迭代

FileUtils.iterateFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)

FileUtils.iterateFiles(File directory, String[] extensions, boolean recursive)

FileUtils.iterateFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)

FileUtils.lineIterator(File file)

FileUtils.lineIterator(File file, String encoding)

 

FileUtils.listFiles(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)

FileUtils.listFiles(File directory, String[] extensions, boolean recursive)

FileUtils.listFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter)

 

// 其他

FileUtils.isSymlink(File file) // 判断是否是符号链接

FileUtils.directoryContains(File directory, File child) // 判断文件夹内是否包含某个文件或者文件夹

 FileUtils.sizeOf(File file) // 获取文件或者文件夹的大小

FileUtils.getTempDirectory()// 获取临时目录文件

FileUtils.getTempDirectoryPath()// 获取临时目录路径

FileUtils.getUserDirectory()// 获取用户目录文件

FileUtils.getUserDirectoryPath()// 获取用户目录路径

FileUtils.touch(File file) // 创建文件

FileUtils.contentEquals(File file1, File file2) // 比较两个文件内容是否相同

 

 

FilenameUtils的使用

FilenameUtils.concat(String basePath, String fullFilenameToAdd) // 合并目录和文件名为文件全路径

FilenameUtils.getBaseName(String filename) // 去除目录和后缀后的文件名

FilenameUtils.getExtension(String filename) // 获取文件的后缀

FilenameUtils.getFullPath(String filename) // 获取文件的目录

FilenameUtils.getName(String filename) // 获取文件名

FilenameUtils.getPath(String filename) // 去除盘符后的路径

FilenameUtils.getPrefix(String filename) // 盘符

FilenameUtils.indexOfExtension(String filename) // 获取最后一个.的位置

FilenameUtils.indexOfLastSeparator(String filename) // 获取最后一个/的位置

FilenameUtils.normalize(String filename) // 获取当前系统格式化路径

FilenameUtils.removeExtension(String filename) // 移除文件的扩展名

FilenameUtils.separatorsToSystem(String path) // 转换分隔符为当前系统分隔符

FilenameUtils.separatorsToUnix(String path) // 转换分隔符为linux系统分隔符

FilenameUtils.separatorsToWindows(String path) // 转换分隔符为windows系统分隔符

FilenameUtils.equals(String filename1, String filename2) // 判断文件路径是否相同,非格式化

FilenameUtils.equalsNormalized(String filename1, String filename2) // 判断文件路径是否相同,格式化

FilenameUtils.directoryContains(String canonicalParent, String canonicalChild) // 判断目录下是否包含指定文件或目录

FilenameUtils.isExtension(String filename, String extension) // 判断文件扩展名是否包含在指定集合(数组、字符串)中

FilenameUtils.wildcardMatch(String filename, String wildcardMatcher) // 判断文件扩展名是否和指定规则匹配

 

 

FileSystemUtils的使用:

// 仅有这一个方法,及其重载方法

FileSystemUtils.freeSpaceKb() throws IOException

//推荐使用

java.nio.file.FileStore.getUsableSpace()

 

 

二、输入、输出

在org.apache.commons.io.input包下有许多InputStrem类的实现,我们来测试一个最实用的类,TeeInputStream,将InputStream以及OutputStream作为参数传入其中,自动实现将输入流的数据读取到输出流中。

@Test

public void test() throws IOException {

 

    // XmlStreamReader

    File xml = new File("E:\\test\\data\\io\\test.xml");

    XmlStreamReader xmlReader = new XmlStreamReader(xml);

    System.out.println("XML encoding: " + xmlReader.getEncoding());

 

    String INPUT = "This should go to the output.";

 

    // TeeInputStream

    ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));

    ByteArrayOutputStream out = new ByteArrayOutputStream();

 

    TeeInputStream tee = new TeeInputStream(in, out, true);

    tee.read(new byte[INPUT.length()]);

 

    System.out.println("Output stream: " + out.toString());

}

 

同样,在 org.apache.commons.io.output包中同样有OutputStream类的实现,这里介绍TeeOutputStream,它可以将输出流进行分流,换句话说我们可以用一个输入流将数据分别读入到两个不同的输出流。

@Test

public void test8() throws IOException {

    String INPUT = "This should go to the output.";

 

    // TeeOutputStream

    ByteArrayInputStream in = new ByteArrayInputStream(INPUT.getBytes("US-ASCII"));

    ByteArrayOutputStream out1 = new ByteArrayOutputStream();

    ByteArrayOutputStream out2 = new ByteArrayOutputStream();

 

    TeeOutputStream teeOut = new TeeOutputStream(out1, out2);

    TeeInputStream teeIn = new TeeInputStream(in, teeOut, true);

    teeIn.read(new byte[INPUT.length()]);

 

    System.out.println("Output stream 1: " + out1.toString());

    System.out.println("Output stream 2: " + out2.toString());

}

 

 

三、Filters过滤器

1.基本功能过滤器 

类型:
FileFileFilter       仅接受文件

DirectoryFilter          仅接受目录

名称:

PrefixFileFilter          基于前缀(不带路径的文件名)

SuffixFileFilter          基于后缀(不带路径的文件名)

NameFileFilter         基于文件名称(不带路径的文件名)

WildcardFileFilter 基于通配符(不带路径的文件名)
RegexFileFilter         基于正则表达式

时间:

AgeFileFilter       基于最后修改时间

MagicNumberFileFileter   基于Magic Number

大小:
EmptyFileFilter         基于文件或目录是否为空

SizeFileFilter      基于文件尺寸
 

隐藏属性:
HiddenFileFilter   基于文件或目录是否隐藏
读写属性:
CanReadFileFilter 基于是否可读
CanWriteFileFilter     基于是否可写入

DelegateFileFilter 将普通的FileFilter和FilenameFilter包装成IOFileFilter


2.逻辑关系过滤器        
AndFileFilter       基于AND逻辑运算
OrFileFilter        基于OR逻辑运算
NotFileFilter       基于NOT逻辑运算
 

TrueFileFilter           不进行过滤
FalseFileFilter          过滤所有文件及目录
 



工具类:FileFilterUtils     

提供一些工厂方法用于生成各类文件过滤器

提供一些静态方法用于对指定的File集合进行过滤

FileFilterUtils.ageFileFilter(Date cutoffDate)

FileFilterUtils.and(IOFileFilter... filters)

FileFilterUtils.asFileFilter(FileFilter filter)

FileFilterUtils.directoryFileFilter()

FileFilterUtils.falseFileFilter()

FileFilterUtils.fileFileFilter()

FileFilterUtils.filter(IOFileFilter filter, File... files)

FileFilterUtils.filterList(IOFileFilter filter, File... files)

FileFilterUtils.filterSet(IOFileFilter filter, File... files)

FileFilterUtils.nameFileFilter(String name)

FileFilterUtils.notFileFilter(IOFileFilter filter)

FileFilterUtils.or(IOFileFilter... filters)

FileFilterUtils.prefixFileFilter(String prefix)

FileFilterUtils.sizeFileFilter(long threshold)

FileFilterUtils.suffixFileFilter(String suffix)

FileFilterUtils.trueFileFilter()

 

@Test

public void test() throws IOException {

    String PARENT_DIR = "E:\\test\\data\\io\\filter";

 

    File dir = new File(PARENT_DIR);

 

    String[] acceptedNames = { "test", "testTxt.txt" };

 

    // 匹配文件名

    for (String file : dir.list(new NameFileFilter(acceptedNames, IOCase.INSENSITIVE))) {

        System.out.println("File found, named: " + file);

    }

 

    System.out.println("=========================================");

 

    // 根据通配符匹配

    for (String file : dir.list(new WildcardFileFilter("*est*"))) {

        System.out.println("Wildcard file found, named: " + file);

    }

 

    System.out.println("=========================================");

 

    // 匹配前缀

    for (String file : dir.list(new PrefixFileFilter("test"))) {

        System.out.println("Prefix file found, named: " + file);

    }

 

    System.out.println("=========================================");

 

    // 匹配后缀

    for (String file : dir.list(new SuffixFileFilter(".txt"))) {

        System.out.println("Suffix file found, named: " + file);

    }

 

    System.out.println("=========================================");

 

    // 逻辑或

    for (String file : dir

            .list(new OrFileFilter(new WildcardFileFilter("*est*"), new SuffixFileFilter(".txt")))) {

        System.out.println("Or file found, named: " + file);

    }

 

    System.out.println("=========================================");

 

    // 逻辑与

    for (String file : dir.list(new AndFileFilter(new WildcardFileFilter("*est*"),

            new NotFileFilter(new SuffixFileFilter(".txt"))))) {

        System.out.println("And/Not file found, named: " + file);

    }

}

 

 

四、Comparators比较器

org.apache.commons.io.comparator包下只有这四个类:

CompositeFileComparator

DefaultFileComparator

DirectoryFileComparator

ExtensionFileComparator

LastModifiedFileComparator

NameFileComparator

PathFileComparator

SizeFileComparator

都有着四个方法:

compare(File file1, File file2)

sort(File... files)

sort(List<File> files)

toString()

 

@Test

public void test() {

    String dir = "E:\\test\\data\\io\\comparator";

 

    // NameFileComparator 按名称

    File dirFile = new File(dir);

    NameFileComparator comparator = new NameFileComparator(IOCase.SENSITIVE);

    File[] files = comparator.sort(dirFile.listFiles());

 

    System.out.println("\nSorted by name files in parent directory: ");

    for (File f : files) {

        System.out.println("t" + f.getAbsolutePath());

    }

 

    // SizeFileComparator 按大小

    SizeFileComparator sizeComparator = new SizeFileComparator(true);

    File[] sizeFiles = sizeComparator.sort(dirFile.listFiles());

 

    System.out.println("\nSorted by size files in parent directory: ");

    for (File f : sizeFiles) {

        System.out.println(f.getName() + " with size (kb): " + f.length());

    }

 

    // LastModifiedFileComparator 按修改时间

    LastModifiedFileComparator lastModified = new LastModifiedFileComparator();

    File[] lastModifiedFiles = lastModified.sort(dirFile.listFiles());

 

    System.out.println("\nSorted by last modified files in parent directory: ");

    for (File f : lastModifiedFiles) {

        Date modified = new Date(f.lastModified());

        System.out.println(f.getName() + " last modified on: " + modified);

    }

}

 

 

五、Monitor文件监控

原理:

由文件监控类FileAlterationMonitor中的线程按指定的间隔不停的扫描文件观察器FileAlterationObserver,如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描) 

 

使用方法:

1、创建一个FileAlterationObserver对象,传入一个要监控的目录,这个对象会观察这些变化。

2、通过调用addListener()方法,为observer对象添加一个 FileAlterationListener对象。你可以通过很多种方式来创建,继承适配器类或者实现接口或者使用匿名内部类,实现所需要的监控方法。

3、创建一个FileAlterationMonitor 对象,将已经创建好的observer对象添加其中并且传入时间间隔参数(单位是毫秒)。

4、调用start()方法即可开启监视器,如果你想停止监视器,调用stop()方法即可。

// 继承FileAlterationListenerAdaptor适配器类或者是实现FileAlterationListener接口

class MyFileListener extends FileAlterationListenerAdaptor {

    private Log log = LogFactory.getLog(MyFileListener.class);

 

    // 文件创建

    @Override

    public void onFileCreate(File file) {

        log.info("[新建]:" + file.getAbsolutePath());

    }

 

    // 文件修改

    @Override

    public void onFileChange(File file) {

        log.info("[修改]:" + file.getAbsolutePath());

    }

 

    // 文件删除

    @Override

    public void onFileDelete(File file) {

        log.info("[删除]:" + file.getAbsolutePath());

    }

 

    // 目录创建

    @Override

    public void onDirectoryCreate(File directory) {

        log.info("[新建]:" + directory.getAbsolutePath());

    }

 

    // 目录修改

    @Override

    public void onDirectoryChange(File directory) {

        log.info("[修改]:" + directory.getAbsolutePath());

    }

 

    // 目录删除

    @Override

    public void onDirectoryDelete(File directory) {

        log.info("[删除]:" + directory.getAbsolutePath());

    }

 

    @Override

    public void onStart(FileAlterationObserver observer) {

        super.onStart(observer);

    }

 

    @Override

    public void onStop(FileAlterationObserver observer) {

        super.onStop(observer);

    }

}

 

public static void main(String[] args) throws Exception {

    String rootDir = "E:\\test\\data\\io\\monitor";

 

    // 创建一个文件观察器用于处理文件的格式

    // FileAlterationObserver _observer = new FileAlterationObserver(rootDir,

    // FileFilterUtils.and(FileFilterUtils.fileFileFilter(),

    // FileFilterUtils.suffixFileFilter(".txt")), null);// 过滤文件格式

    FileAlterationObserver observer = new FileAlterationObserver(rootDir);

 

    observer.addListener(new MyFileListener()); // 设置文件变化监听器

 

    FileAlterationMonitor monitor = new FileAlterationMonitor(5000, observer);// 创建文件变化监听器,间隔5秒

 

    monitor.start();// 开始监控

}

 

maven解决依赖库版本冲突:案例commons-io版本冲突问题(NoSuchMethodError: UnsynchronizedByteArrayOutputStream) 其他库依赖了不同版本的 commons-io,可能会导致版本冲突。检查项目的依赖管理工具,解决版本冲突。如果不使用依赖管理工具,可以手动删除或排除掉项目中不需要的旧版本 commons-io。定义依赖管理来统一版本号。 阅读详情

相关推荐

commons-io-2.2

commons-io-2.2 maven 依赖 jar包 commons-io-2.2maven 依赖 jar包 commons-io-2.2 commons-io-2.2

java中InputStream转化为byte[]数组

在commons-io包中org.apache.commons.io.IOUtils类的toByteArray(InputStream input)已经有实现了,我们可以参考下思路,完成我们的方法,我们可以用类似下面的代码实现inputStream转化为byte[]数组 public static byte[] toByteArray(InputStream input) throws IOEx

Mr. David 专栏 8万+

计数译码驱动显示电路实验报告_京东方G0A电路、阵列基板、显示 装置及驱动方法广州威彩...

图1、实施例二所述的选择子单元的结构示意图图2、实施例四所述的GOA电路结构示意图图3、实施例七所述的阵列基板的局部结构示意图图4、实施例所述的极性反转驱动方法的第一场的各信号时序图图5、实施例所述的极性反转驱动方法的第二场的各信号时序图图6、实施例所述的极性反转驱动方法的第三场的各信号时序图图7、实施例所述的极性反转驱动方法的第四场的各信号时序图图8、为图4所示时序下,实施例八所述显示...

weixin_35696112的博客 924

常用工具类commons-io的学习使用

commons-io的学习使用

weixin_53998054的博客 1万+

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3933

从智能手机到汽车电子:聊聊IPC-9702/9704A标准如何帮我们搞定不同场景下的PCB可靠性设计

本文探讨了IPC-9702/9704A标准在智能手机和汽车电子等不同场景下的PCB可靠性设计应用。通过分析消费电子、汽车电子和工业设备中的应力特征,详细解读了IPC标准在应变识别和测试方法论中的核心价值,并提供了具体的轻量化设计策略和全生命周期验证方案,帮助工程师提升PCB的长期可靠性。

weixin_30693683的博客 279

Java commons-io 工具包

本文介绍了 Java commons-io 工具包的相关内容。。。

Regino的博客 1683

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 437

【Java】工具包(Commons-io)

但是在以后我们会用到很多很多别人写好的代码,因此在正式使用的第一步是:在项目中新建一个文件夹:lib,这个文件夹以后去专门存放第三方jar包。中其实就是别人写好的各种各样的类,如果你想要使用这些类中的方法,是不能直接用的,而是需要先将别人的代码导入到我们自己的项目中。这个组织有很多很多项目,现在在世界各地被广泛的使用,这些开源的项目为Java的快速发展提供了不可磨灭的贡献。淘汰了,它也会出现其他的替代品,但是只要基础扎实了,这些替代品学起来也是非常简单的。双击打开,是可以将jar包展开,看见里面的内容。

qq_39921135的博客 3518

黑猫带你学Nand第11篇:万字长文带你了解NandFlash的数据保持原理及特性(Data Retention)

TATTAT:Trap-assistedtunneling,陷阱辅助隧穿,也有叫法称为电荷陷阱现象。这是一种物理现象,它发生在非挥发性存储器,如NAND闪存。在这种效应中,存储在闪存单元浮动栅极上的电荷(电子)由于隧道氧化物中捕获的电荷形成的电场影响,导致电荷通过隧道效应从一个能级隧穿到另一个能级,从而造成电荷泄漏。这种电荷泄漏是导致闪存数据保持问题的主要原因之一,因为它可以改变存储在闪存单元中的电荷量,进而改变其阈值电压水平,最终可能导致数据错误。在NANDFlash中,电荷被存储在浮置栅极上。

黑猫奥利奥的博客 1095

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

java之IO篇——工具包Commons-io和Hutool

结束了IO篇的File、基本流和高级流。还要认识IO流的一些工具包Commons-io和hutool,不算是框架,但是非常实用。目录前言一、Commons-io1.来历及作用2.使用二、Hutool1.简介2.使用Hutool这个工具包有很多工具类,这节我们主要说的就是IO工具类。IO工具类要说的一共有7个。

2202_75483664的博客 2253

YOLO26 网络结构逐模块解析:Backbone/Neck/Head

本文解析了YOLO26目标检测网络的架构设计,重点介绍其在Backbone、Neck和Head三个核心组件的创新优化。Backbone采用改进的CSP模块与轻量级注意力机制,提升特征提取效率;Neck使用改进的BiFPN结构实现高效多尺度特征融合;Head采用完全解耦设计简化回归流程。文章详细分析了各模块的技术演进、实现细节和设计思想,通过流程图和代码示例展示了YOLO26的整体架构和关键组件实现。该研究对模型优化、定制开发和硬件部署具有重要指导意义。

一键难忘的博客 1241

java工具包—Commons-io和使用文档,Hutool工具包

readUtf8 Lines:按照UTF-8的形式,把文件中的数据,读到集合中。appendLines:把集合中的数据写出到文件中,续写模式,readLines:指定字符编码,把文件中的数据,读到集合中。appendLines:把集合中的数据写出到文件中,续写模式,readLines:指定字符编码,把文件中的数据,读到集合中。writeLines:把集合中的数据写出到文件中,覆盖模式。writeLines:把集合中的数据写出到文件中,覆盖模式。fi1e:根据参数创建一个fi1e对象。

2302_80073130的博客 800

20251121更新纷玩岛

【代码】20251121更新纷玩岛。

猫敷雪 1017

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java打印流,commons-io工具包,IO总结

System.out就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上。commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以挺提高IO功能开发的效率。commons-io工具包提供了很多有关io操作的类。commons-io提供了一个工具类 org.apache.commons.io.IOUtils,封装了大量IO读写操作的代码。public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。

2401_86102746的博客 505

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Commons-io工具包与Hutool工具包

Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包作用:提高I0流的开发效率。

fuladulu的博客 794

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Commons-IO java外接工具包

介绍一个JAVA外接工具包Commons-IO工具包。并将工具包中的二个代表性的类静态方法进行介绍并且给出了代码实现。最后对此开源工具包进行学习交流分享。同时,此工具包中类的class文件,还有源码JAVA文件,以及如何使用这些工具类的说明文件API都给出开源代码,方便学习使用。

qq_41805361的博客 530

工具包(Commons-io)&工具包(hutool)

Commons是国人开发的开源工具包,里面有很多帮助我们提高开发效率的API。

m0_71174751的博客 900

重学java 70.IO流 Commons-io工具包

IO技术开发中,代码量很大,而且代码的重复率较高。如果我们要遍历目录,拷贝自录就需要使用方法的递归调用,也增大了程序的复杂度。

m0_73983707的博客 1441

【从入门到起飞】JavaSE—IO工具包(Commons-io,Hutool) (2)

IO工具包

小吉妙妙屋 1841

【Apache Commons IO 工具包常用方法】

处理路径字符串的工具类(与 FilenameUtils 互补)。提供简单流操作的补充方法(部分与 IOUtils 重叠)。增强的 File 类,支持直接比较文件内容。处理字节序(大端序、小端序)转换的工具类。处理 I/O 流、读写操作的通用方法。用于跟踪和自动删除临时文件的工具类。处理文件路径和名称的规范化与转换。实时监听文件尾部内容变化的工具类。提供文件及目录操作的常用方法。统计读取或写入字节数的代理流。逐行读取文件的迭代器工具。监听文件系统变化的工具类。组合文件过滤器的工具类。

m0_72516377的博客 1224
上一篇: commons-email邮件工具类的基本使用
下一篇: commons-lang包常用工具类的基本使用
淋雨一直走啊
博客等级 码龄11年 39粉丝 46原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值