继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Guava Files中的文件操作

哈士奇WWW
关注TA
已关注
手记 502
粉丝 71
获赞 400

Java的基本API对文件的操作很繁琐,为了向文件中写入一行文本,都需要写十几行的代码。guava对此作了很多改进,提供了很多方便的操作。

一. Guava的文件写入

Guava的Files类中提供了几个write方法来简化向文件中写入内容的操作,下面的例子演示 Files.write(byte[],File)的用法。

   /**     * 演示向文件中写入字节流     *      * @param fileName 要写入文件的文件名     * @param contents 要写入的文件内容     */    public void demoFileWrite(final String fileName, final String contents)    {       checkNotNull(fileName, "Provided file name for writing must NOT be null.");       checkNotNull(contents, "Unable to write null contents.");       final File newFile = new File(fileName);       try       {          Files.write(contents.getBytes(), newFile);       }       catch (IOException fileIoEx)       {          err.println(  "ERROR trying to write to file '" + fileName + "' - "                      + fileIoEx.toString());       }    }

需要注意上面的代码,需要import一些类和方法:

import static com.google.common.base.Preconditions.*; import static java.lang.System.*; import com.google.common.base.Charsets; import com.google.common.io.Files;

另外在演示代码中我捕获了IOException,并打印了一下错误信息。

二.获得文件内容

Files类提供了readLines方法可以方便的读取文件的内容,如下demo代码:

        String testFilePath = "d:\\test.txt";         File testFile = new File(testFilePath);         List<String> lines = Files.readLines(testFile, Charsets.UTF_16);         for (String line : lines) {             System.out.println(line);         }

注意这里的readLines方法返回的是List<String>的接口,这对于大文件处理是会有问题的。大文件处理可以使用readLines方法的另一个重载。下面的例子演示从一个大文件中逐行读取文本,并做行号计数。

package main.com.jd.coo.guava.io; import java.io.File; import java.io.IOException; import com.google.common.base.Charsets; import com.google.common.io.Files; import com.google.common.io.LineProcessor; /**  * Created by outofmemory.cn  on 2014/7/24.  */ public class FilesDemo {     static class CounterLine implements LineProcessor<Integer> {         private int rowNum = 0;        @Override         public boolean processLine(String line) throws IOException {             rowNum ++;             return true;         }         @Override         public Integer getResult() {             return rowNum;         }     }     public static void main(String[] args) throws IOException {         String testFilePath = "d:\\test.txt";         File testFile = new File(testFilePath);         CounterLine counter = new CounterLine();         Files.readLines(testFile, Charsets.UTF_16, counter);         System.out.println(counter.getResult());     } }

这个readLines的重载,需要我们实现一个LineProcessor的泛型接口,在这个接口的实现方法processLine方法中我们可以对行文本进行处理,getResult方法可以获得一个最终的处理结果,这里我们只是简单的返回了一个行计数。

另外还有readBytes方法可以对文件的字节做处理,readFirstLine可以返回第一行的文本,Files.toString(File,Charset)可以返回文件的所有文本内容。

三. 复制移动(剪切)文件

在Guava中复制文件操作提供了一组的copy方法,我们看一个示例:

   /**     * 演示如何使用guava的Files.copy方法复制文件     *      * @param sourceFileName 复制的源文件名     * @param targetFileName 目标文件名     */    public void demoSimpleFileCopy(       final String sourceFileName, final String targetFileName)    {       checkNotNull(sourceFileName, "Copy source file name must NOT be null.");       checkNotNull(targetFileName, "Copy target file name must NOT be null.");       final File sourceFile = new File(sourceFileName);       final File targetFile = new File(targetFileName);       try       {          Files.copy(sourceFile, targetFile);       }       catch (IOException fileIoEx)       {          err.println(               "ERROR trying to copy file '" + sourceFileName             + "' to file '" + targetFileName + "' - " + fileIoEx.toString());       }    }

Guava中移动文件使用move方法,用法和copy一样。

四. 比较文件内容

Guava中提供了Files.equal(File,File)方法来比较两个文件的内容是否完全一致,请看下面的示例:

   /**     * 演示 Files.equal(File,File) 来比较两个文件的内容     *      * @param fileName1 比较的文件1文件名     * @param fileName2 比较的文件2文件名     */    public void demoEqual(final String fileName1, final String fileName2)    {       checkNotNull(fileName1, "First file name for comparison must NOT be null.");       checkNotNull(fileName2, "Second file name for comparison must NOT be null.");       final File file1 = new File(fileName1);       final File file2 = new File(fileName2);       try       {          out.println(              "File '" + fileName1 + "' "            + (Files.equal(file1, file2) ? "IS" : "is NOT")            + " the same as file '" + fileName2 + "'.");       }       catch (IOException fileIoEx)       {          err.println(               "ERROR trying to compare two files '"             + fileName1 + "' and '" + fileName2 + "' - " + fileIoEx.toString());       }    }

五. 其他有用的方法

Guava的Files类中还提供了其他一些文件的简捷方法。比如

  1. touch方法创建或者更新文件的时间戳。

  2. createTempDir()方法创建临时目录

  3. Files.createParentDirs(File) 创建父级目录

  4. getChecksum(File)获得文件的checksum

  5. hash(File)获得文件的hash

  6. map系列方法获得文件的内存映射

  7. getFileExtension(String)获得文件的扩展名

  8. getNameWithoutExtension(String file)获得不带扩展名的文件名

Guava的方法都提供了一些重载,这些重载可以扩展基本用法,我们也有必要去多了解一下,这些重载的方法。

原文链接:http://outofmemory.cn/java/guava/IO/Files-operation

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP