专栏首页Hcode网站Java中的IO流(三)Apache Commons IO组件的常用操作

Java中的IO流(三)Apache Commons IO组件的常用操作

前言

这次带来的是Apache开源组织的CommonsIO集成组件的FileUtils和IOUtils常用操作。

下载

首先应该去Apache CommonsIO下载网址将组件的压缩包下载到本地。

下载完后解压打开文件夹,这两个圈着的jar包便是需要导入到java的JVM里面的

导包

  1. 如何往eclipse导入jar包,可以看看百度经验的eclipse导jar包操作
  2. 往idea导包操作如下 1)打开项目(或者创建项目以后,点击菜单File->Project Structure)

2) 选择Modules点击要添加的项目名,在选择Dependencies,

3)点击添加,添加JAR,然后选择已经本地路径中下载好的jar包。

具体使用

打开CommonsIO的API文档,一些常用的方法如下

cleanDirectory:清空目录,但不删除目录。 contentEquals:比较两个文件的内容是否相同。 copyDirectory:将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的 文件。 copyFile:将一个文件拷贝到一个新的地址。 copyFileToDirectory:将一个文件拷贝到某个目录下。 copyInputStreamToFile:将一个输入流中的内容拷贝到某个文件。 deleteDirectory:删除目录。 deleteQuietly:删除文件。 listFiles:列出指定目录下的所有文件。 openInputSteam:打开指定文件的输入流。 readFileToString:将文件内容作为字符串返回。 readLines:将文件内容按行返回到一个字符串数组中。 size:返回文件或目录的大小。 write:将字符串内容直接写到文件中。 writeByteArrayToFile:将字节数组内容写到文件中。 writeLines:将容器中的元素的toString方法返回的内容依次写入文件中。 writeStringToFile:将字符串内容写到文件中。

FileUtils类

Ⅰ统计文件和文件夹的部分操作

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

       long len1 =  FileUtils.sizeOf(new File("E:/py/小说/第一章.txt"));//获取文件大小
       long len2 = FileUtils.sizeOf(new File("E:/py"));//获取整个文件夹目录的大小
       //过滤,空文件不记录,递归进行遍历
       Collection<File> files= FileUtils.listFiles(new File("E:/py/小说"), EmptyFileFilter.NOT_EMPTY, DirectoryFileFilter.INSTANCE);
        for (File file:files) {//遍历文件夹
            System.out.println(file.getAbsolutePath());
        }

        //只取文件后缀名为class和txt的文件,DirectoryFileFilter.INSTANCE,方法将使用递归的形式来进行文件过滤扫描。
        Collection<File> files1= FileUtils.listFiles(new File("E:/py/小说"),
                FileFilterUtils.or(new SuffixFileFilter("txt"),new SuffixFileFilter("class")), DirectoryFileFilter.INSTANCE);

    }

Ⅱ文件的内容读取

public static void main(String[] args) throws IOException {
        //文件读取
        String msg = FileUtils.readFileToString(new File("E:/py/小说/第一章.txt"),"UTF-8");
        System.out.println(msg);
        byte[] datas = FileUtils.readFileToByteArray(new File("E:/py/小说/第一章.txt"));
        //逐行读取
        List<String> msgs = FileUtils.readLines(new File("E:/py/小说/第一章.txt"),"UTF-8");
        for (String str:msgs){
            System.out.println(str);
        }
        LineIterator it = FileUtils.lineIterator(new File("E:/py/小说/第一章.txt"),"UTF-8");
        while(it.hasNext()){
            System.out.println(it.nextLine());
        }

    }

Ⅲ内容写出到文件

 //写出文件
 String st="h哈哈";
 FileUtils.write(new File("123.txt"),st,"UTF-8",true);//true表示可用追加内容
 FileUtils.writeStringToFile(new File("123.txt"),st,"UTF-8",true)//写出字符串
 FileUtils.writeByteArrayToFile(new File("123.sxt"), "Himit_ZH真帅\r\n".getBytes("UTF-8"),true);//将一个字节数组写到文件。
 //写出一个列表
 List<String> datas =new ArrayList<String>();
 datas.add("你好");
 datas.add("我好");
 FileUtils.writeLines(new File("123.sxt"), datas,"#",true);//#为间隔符

Ⅳ文件拷贝

//将文件123copy到123副本
FileUtils.copyFile(new File("123.txt"),new File("123副本.txt"));
//将文件123复制到指定文件夹目录
FileUtils.copyFileToDirectory(new File("123.txt"),new File("E:/py"));
//复制目录到目录
FileUtils.copyDirectoryToDirectory(new File("E:/py"),new File("E:/py"));
//拷贝URL对应网页的内容到文件
String url ="http://www.baidu.com";
IOUtils.toString(new URL(url),"UTF-8");
FileUtils.copyURLToFile(new URL(url),new File("123.txt"));

IOUtils类

常用的静态变量设置如下

public static final char DIR_SEPARATOR_UNIX = '/';
public static final char DIR_SEPARATOR_WINDOWS = '\\';
public static final char DIR_SEPARATOR;
public static final String LINE_SEPARATOR_UNIX = "\n";
public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
public static final String LINE_SEPARATOR;


static {
    DIR_SEPARATOR = File.separatorChar;

    StringBuilderWriter buf = new StringBuilderWriter(4);
    PrintWriter out = new PrintWriter(buf);
    out.println();
    LINE_SEPARATOR = buf.toString();
    out.close();
}

一些常用的主要方法,具体使用可用去看官方给的API文档

copy 支持多种数据间的拷贝: copy(inputstream,outputstream) copy(inputstream,writer)..... read 从一个流中读取内容 read(inputstream,byte[]) .... readFully 这个方法会读取指定长度的流,如果读取的长度不够,就会抛出异常 readLines 方法可以从流中读取内容,并转换为String的list skip 这个方法用于跳过指定长度的流, skipFully 这个方法类似skip,只是如果忽略的长度大于现有的长度,就会抛出异常 write 这个方法可以把数据写入到输出流中 writeLines 这个方法可以把string的List写入到输出流中 close 关闭URL连接 closeQuietly 忽略nulls和异常,关闭某个流 contentEquals 比较两个流是否相同 contentEqualsIgnoreEOL 比较两个流,忽略换行符 lineIterator 读取流,返回迭代器 toBufferedInputStream 把流的全部内容放在另一个流中 toBufferedReader 返回输入流 toByteArray 返回字节数组 toCharArray 返回字符数组 toInputStream 返回输入流 toString 返回字符串

一个小小的例子对比

Ⅰ读取内容

//使用JDK的方法
InputStream in = new URL( "https://www.hcode.top" ).openStream();
try {
   InputStreamReader inR = new InputStreamReader( in );
   BufferedReader buf = new BufferedReader( inR );
   String line;
   while ( ( line = buf.readLine() ) != null ) {
     System.out.println( line );
   }
} finally {
   in.close();
}



// 使用 IOUtils 的方法
InputStream in = new URL( "https://www.hcode.top" ).openStream();
try {
   System.out.println( IOUtils.toString( in ) );
} finally {
   IOUtils.closeQuietly(in);
}

List<String> list = IOUtils.readLines(in, "UTF-8");//只要是InputStream流都可以,比如http响应的流
//直接把流读取为String
String content = IOUtils.toString(in,"UTF-8");
//把流转换为byte数组
byte[] bytes = IOUtils.toByteArray(in);

Ⅱ内容写入流

//把数据写入输出流
char [] ch = new char[]{'a','a','b'};
byte [] by =  "aaaa".getBytes();
IOUtils.write("abc", outputStream);
IOUtils.write(ch, outputStream);
IOUtils.write(by, outputStream,"UTF-8");
List<String> lines = new ArrayList();
lines.add("Himit_ZH");
lines.add("handsome");
OutputStream os = new FileOutputStream("E:/123.txt");
IOUtils.writeLines(lines,IOUtils.LINE_SEPARATOR,os);
//把字符串转换流
InputStream inputStream = IOUtils.toInputStream("Himit_ZH", "UTF-8");

Ⅲ流的关闭

try {
     IOUtils.copy(inputStream, outputStream);
 } finally {
     IOUtils.closeQuietly(inputStream);
     IOUtils.closeQuietly(outputStream);
 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java利用多线程和Socket制作GUI界面的在线聊天室

    最近刚好是期末,碰上Java实训,借此将之前写的在线聊天室搬出来,加上GUI(Swing),当成实训作品,记录一下这次实训的结果。

    HcodeBlogger
  • Java中的IO流(二)字符流的常用操作

    其实输入(InputStream,Reader)和输出(OutputStream,Writer)是相对于程序来讲,例如一个文件的数据要想在程序中被操作,那么就得...

    HcodeBlogger
  • Java中的IO流(一)字节流的常用操作

    今天带来的是JAVA的IO流中的字节流,InputStream和OutputStram子类流的用法。

    HcodeBlogger
  • java+内存分配及变量存储位置的区别

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细...

    bear_fish
  • 聊聊storm TridentTopology的构建

    storm-core-1.2.2-sources.jar!/org/apache/storm/trident/TridentTopology.java

    codecraft
  • 聊聊storm TridentTopology的构建

    storm-core-1.2.2-sources.jar!/org/apache/storm/trident/TridentTopology.java

    codecraft
  • Java IO 操作基础1---普通文件的相关操作

    Java 中 IO 操作是 Java 的一个重要组成部分,这里总结一下 Java 中的 IO 的基础操作。

    指点
  • java学习---new的对象怎么被内存回收

    如上面代码,简单说就是new User()的时候,会返回一个地址,并且将地址赋值给引用u,当这个引用被u持有的时候,java会认为这个对象时有用的,不会回收对...

    wust小吴
  • 杂项及密码基础

    Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。 相比Base64,Base58不使用数字"0",字母大写...

    tinyfisher
  • 利用反射根据方法名执行方法的使用示例

    本人在使用httpclient做接口测试的过程中,写了一个简单框架,经过不断进行封装和优化代码,在昨天终于解决了困扰许久的问题。其中一个非常重要的方法就是在学了...

    FunTester

扫码关注云+社区

领取腾讯云代金券