番石榴文件:Java文件管理

正如我在这里 , 这里 , 这里和这里所讨论的那样, Groovy和Java SE 7都为Java文件管理提供了改进。 但是,当特定的Java应用程序尚不能使用Java SE 7或Groovy进行文件管理时,仍然可以通过使用Guava的Files类获得改进的文件管理体验。

与其他许多编程语言相比,Java中的文件处理似乎总是有些困难。 Java SE 7当然可以通过NIO.2极大地提高Java的文件处理能力 ,但是并不是每个项目都可以使用Java SE7。对于那些不能使用Java SE 7的项目,Guava的Files类是一个很好的中间解决方案,可以更轻松地处理文件。 这里需要特别注意的是,Java SE 7引入了自己的Files类 ,因此,如果在同一代码中使用Files的Java版本,则Java SE 7中对Guava的Files类的任何使用都必须完全作用域。 我的示例是用Java SE 7编写和构建的,但是我避免使用Java SE 7的Files类,因此不需要完全限定Guava的同名类。

文件创建

Guava的Files类包含几个重载的write方法,可轻松地将内容写入文件。 下一个代码示例演示如何使用Files.write(byte [],File) 。

演示Files.write(byte [],File)

/*** Demonstrate writing bytes to a specified file.* * @param fileName Name of file to be written to.* @param contents Contents to be written to file.*/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());}}

从第一个代码示例中可以得到一些观察结果,它们将适用于本文中的所有其他代码示例。 首先,我利用静态导入的Guava Preconditions类来进行轻松检查,以确保所提供的参数不为null。 该代码的第二个共同特征是它显式捕获并“处理”已检查的异常IOException 。 本文中演示的所有其他Files方法类似地引发相同的检查异常。

文件复制

下一个示例演示使用Guava的Files.copy(File,File)方法(名称为“ copy”的几种重载方法之一)复制文件非常容易。

演示Files.copy(File,File)

/*** Demonstrate simple file copying in Guava. This demonstrates one of the* numerous overloaded copy methods provided by Guava's Files class. The* version demonstrated here copies one provided File instance to another* provided File instance.* * @param sourceFileName Name of file that is to be copied.* @param targetFileName Name of file that is result of file copying.*/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());}}


文件移动

使用番石榴移动文件就像复制一样容易。 下一个代码段中演示了Files.move(File,File)方法。

演示Files.move(File,File)

/*** Demonstrate moving a file with Guava's Files.move(File,File).* * @param sourceFileName Path/name of File to be moved.* @param targetFileName Path/name of Destination of file.*/public void demoMove(final String sourceFileName, final String targetFileName){checkNotNull(sourceFileName, 'Move source file name must NOT be null.');checkNotNull(targetFileName, 'Move destination name must NOT be null.');final File sourceFile = new File(sourceFileName);final File targetFile = new File(targetFileName);try{Files.move(sourceFile, targetFile);}catch (IOException fileIoEx){err.println('ERROR trying to move file '' + sourceFileName+ '' to '' + targetFileName + '' - ' + fileIoEx.toString());}}


比较文件

使用Gauva Files.equal(File,File)方法可以直接确定两个文件是否相同

演示Files.equal(File,File)

/*** Demonstrate using Guava's Files.equal(File,File) to compare contents of* two files.* * @param fileName1 Name of first file to be compared.* @param fileName2 Name of second file to be compared.*/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.touch(File)轻松完成触摸文件以创建新的空文件或更新现有文件上的时间戳的操作 ,如下面的代码示例所示。

演示Files.touch(File)

/*** Demonstrate Guava's Files.touch(File) method.* * @param fileNameToBeTouched Name of file to be 'touch'-ed.*/public void demoTouch(final String fileNameToBeTouched){checkNotNull(fileNameToBeTouched, 'Unable to 'touch' a null filename.');final File fileToTouch = new File(fileNameToBeTouched);try{Files.touch(fileToTouch);}catch (IOException fileIoEx){err.println('ERROR trying to touch file '' + fileNameToBeTouched+ '' - ' + fileIoEx.toString());}}


检索文件内容

通过使人联想到Groovy的GDK扩展File.getText() ,番石榴的Files.toString(File,Charset)使得检索文件的文本内容变得容易。

演示Files.toString(File,Charset)

/*** Demonstrate retrieving text contents of a specified file with Guava's * Files.toString(File) method.* * @param nameOfFileToGetTextFrom Name of file from which text is to be*    retrieved.*/public void demoToString(final String nameOfFileToGetTextFrom){checkNotNull(nameOfFileToGetTextFrom, 'Unable to retrieve text from null.');final File sourceFile = new File(nameOfFileToGetTextFrom);try{final String fileContents = Files.toString(sourceFile, Charset.defaultCharset());out.println('Contents of File '' + nameOfFileToGetTextFrom+ '' are: ' + fileContents);}catch (IOException fileIoEx){err.println('ERROR trying to get text contents of file ''+ nameOfFileToGetTextFrom + '' - ' + fileIoEx.toString());}}


临时目录创建

Guava使使用Files.createTempDir()生成临时目录变得容易。

演示Files.createTempDir()

/*** Demonstrate Guava's Files.createTempDir() method for creating a temporary* directory.*/public void demoTemporaryDirectoryCreation(){final File newTempDir = Files.createTempDir();try{out.println('New temporary directory is '' + newTempDir.getCanonicalPath() + ''.');}catch (IOException ioEx){err.println('ERROR: Unable to create temporary directory - ' + ioEx.toString());}}

我在这里没有提供代码示例,但是值得注意的是,Guava提供了一种方便的方法来创建新目录,该方法将使用其Files.createParentDirs(File)方法创建所有必需的新父目录。

以行的形式检索文件的内容

有时最方便的是将文件的内容作为一系列的行来获取,以便可以处理每一行。 在Groovy中,通常使用readLines()和eachLine()的重载版本来完成此操作。 番石榴通过其Files.readLines(File,Charset)方法提供了与Groovy的File.readLines()类似的功能。 在下面的代码示例中对此进行了演示。

演示Files.readLines(File,Charset)

/*** Demonstrate extracting lines from file.* * @param fileName Name of file from which lines are desired.*/public void demoRetrievingLinesFromFile(final String fileName){final File file = new File(fileName);try{final List<String> lines = Files.readLines(file, Charset.defaultCharset());for (final String line : lines){out.println('>> ' + line);}}catch (IOException ioEx){err.println('ERROR trying to retrieve lines from file ''+ fileName + '' - ' + ioEx.toString());}}

readLines的另一个重载版本很有趣,因为它允许指定LineProcessor回调以终止比文件结尾更早的行返回。

读取文件的第一行

我遇到了无数情况,其中仅读取文件的第一行很有用。 第一行可以告诉我的代码,什么类型的脚本正在运行,提供XML序言信息或文件内容的其他有趣概述数据。 Guava使使用Files.readFirstLine(File,Charset)方法仅检索第一行变得容易。 下一个代码清单对此进行了演示。

演示Files.readFirstLine(File,Charset)

/*** Demonstrate extracting first line of file.* * @param fileName File from which first line is to be extracted.*/public void demoRetrievingFirstLineFromFile(final String fileName){final File file = new File(fileName);try{final String line = Files.readFirstLine(file, Charset.defaultCharset());out.println('First line of '' + fileName + '' is '' + line + ''.');}catch (IOException fileIoEx){err.println('ERROR trying to retrieve first line of file ''+ fileName + '' - ' + fileIoEx.toString());}}


还有更多

尽管我在本文中讨论并演示了几个有用的Files方法,但该类还有很多其他提供。 其中一些功能包括使用Files.append(CharSequence,File,Charset)附加到现有文件的功能,使用Files.getChecksum(File,Checksum)获取文件的校验和 ,使用Files.getDigest(File,MessageDigest )获取文件的摘要的功能。 ) ,访问的BufferedReader与Files.newReader(文件,字符集) ,访问的BufferedWriter与Files.newWriter(文件,字符集) ,和访问MappedByteBuffer通过重载映射到一个基础文件Files.map方法。

结论

使用Guava的Files类,用Java处理文件更加容易和方便。 Guava为无法利用Groovy或Java SE 7的文件处理便利的Java应用程序带来了文件处理便利。

祝您编程愉快,别忘了分享!

参考:来自JCG合作伙伴 Dustin Marx的Guava的Files类中的Java文件管理, 来自Inspired by Actual Events博客。


翻译自: https://www.javacodegeeks.com/2012/09/guava-files-java-file-management.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顺序查找

顺序查找属于查找中较容易的一个方法&#xff0c;且对数据是否已经排序没有要求&#xff0c;是很常用的一个查找算法。 但缺点是必须一个一个数字进行比较查找&#xff0c;查找所需步骤可能较多。 顺序查找算法的思想是&#xff0c;将目标与待查找数据进行比较&#xff0c;若发…

王者荣耀微信哪个服务器人最少,王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实...

原标题&#xff1a;王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实大家好&#xff01;王者荣耀S16赛季已经开启一月之余&#xff…

一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘

什么是新拟态新拟态的英文名称是“Neumorphism”&#xff0c;也有人称为“Soft UI”。简单讲&#xff0c;新拟态是一种图形样式&#xff0c;其原理是通过模拟真实物体来为界面的UI元素赋予真实感。新拟态风格起源于dribbble&#xff0c;后面陆续被收录在2020设计趋势预测里面&a…

JBoss BRMS与JasperReports进行报告

介绍 Jasperreports是一个免费的可下载库&#xff0c;可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3&#xff08;从客户门户网站http://access.redhat.com &#xff09; JasperReports 4.6…

java字符串 删除指定字符的那些事

需求如下&#xff1a; 1.算出2周以前的时间&#xff0c;以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回结果&#xff0c;比如&#xff1a;2017-08-15 就需要显示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…

Hibernate中Hql查询

这篇随笔将会记录hql的常用的查询语句&#xff0c;为日后查看提供便利。 在这里通过定义了三个类&#xff0c;Special、Classroom、Student来做测试&#xff0c;Special与Classroom是一对多&#xff0c;Classroom与Student是一对多的关系&#xff0c;这里仅仅贴出这三个bean的属…

Java代码质量工具–概述

最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 这篇博客文章应该像是在此方向上进行进一步调查的起点。 1. CodePro Anal…

利用yum升级Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作&#xff0c;centos7下有问题。可能是因为centos下的scl我是拷贝的文件&#xff0c;没有完全验证centos6下肯定没问题。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷贝其关键内容就是&#xff1a; 1.使用 …

cuda版本查看_ubuntu安装CUDA

0 写在前面安装环境&#xff1a;ubuntu18.04以及GTX1050Ti笔记本为什么要安装CUDA&#xff1f; 参考百科&#xff0c;CUDA是英伟达推出的集成技术&#xff0c;通过该技术可利用GeForce 8 以后的GPU或者较新的Quadro GPU进行计算。例如典型的tensorflow-GPU和pyCUDA安装之前都要…

HTML 标签列表(功能排序) HTML 参考手册- (HTML5 标准)

HTML 标签列表&#xff08;功能排序&#xff09; HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签描述基础 <!DOCTYPE> 定义文档类型。<html>定义一个 HTML 文档<title>为文档定义一个标题<body>定义文档的主体<h1> to <h6>…

idea新建scala文件_IDEA maven项目中新建.scala文件

本文首发于我的博客[IDEA maven项目中新建.scala文件]分为三步第一步、IDEA中安装scala插件1、搜索安装File-Sittings-Plugins-搜索安装scala2、安装完成重启安装完成之后点击重启idea第二步、下载、安装、配置Scala1、下载安装Scala SDK本体搜索引擎搜索Scala SDK或者点我去Sc…

Linux中执行shell脚本的4种方法总结

文章来源&#xff1a;http://www.jb51.net/article/53924.htm 这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下 bash shell 脚本的方法有多种&#xff0c;现在作个小结。假设我们编写好的shell脚本的文件名为hel…

Log4j线程死锁–案例研究

此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案。 它还将说明在开发和支持Java EE应用程序时适当的Java类加载器知识的重要性。 本文也是您提高线程转储分析技能和了解线程竞争条件的另一个机会。 环境规格 Java …

代码实现:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

import java.util.Scanner;/*题目&#xff1a;求saaaaaaaaaaaa...a的值&#xff0c;其中a是一个数字。例如222222222222222(此时共有5个数相加)&#xff0c;几个数相加有键盘控制。 程序分析&#xff1a;关键是计算出每一项的值。*/public class Test08 {public static void ma…

堆栈跟踪从何而来?

我认为&#xff0c;阅读和理解堆栈跟踪是每个程序员都必须具备的一项基本技能&#xff0c;以便有效地解决每种JVM语言的问题&#xff08;另请参阅&#xff1a; 过滤日志中无关的堆栈跟踪行和首先记录引起异常的根本原因 &#xff09;。 那么我们可以从一个小测验开始吗&#xf…

@select 怎么写存储过程_MySQL4:存储过程和函数

什么是存储过程简单说&#xff0c;存储过程就是一条或多条SQL语句的集合&#xff0c;可视为批文件&#xff0c;但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用&#xff0c;如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表…

跨域访问-预请求及跨域常见问题

预请求 参考&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS#预请求 简而言之&#xff0c;在跨域并且尝试添加一些特殊头及自定义头的情况下&#xff0c;由于浏览器的安全机制&#xff0c;会加多一次OPTIONS预请求&#xff08;询问请求&am…

mysql查询优化之一:mysql查询优化常用方式

一、为什么查询速度会慢&#xff1f; 一个查询的生命周期大致可以按照顺序来看&#xff1a;从客户端&#xff0c;到服务器&#xff0c;然后在服务器上进行解析&#xff0c;生成执行计划&#xff0c;执行&#xff0c;并返回结果给客户端。其中在“执行”阶段包含了大量为了检索…

修复Sonar中常见的Java安全代码冲突

本文旨在向您展示如何快速修复最常见的Java安全代码冲突。 它假定您熟悉代码规则和违规的概念以及Sonar如何对其进行报告。 但是&#xff0c;如果您以前从未听说过这些术语&#xff0c;则可以阅读Sonar Concepts或即将出版的有关Sonar的书 &#xff0c;以获取更详细的解释。 为…

理解ThreadLocal

ThreadLocal:线程本地存储&#xff0c;为每个线程都创建了变量的副本&#xff0c;线程在访问变量时&#xff0c;可以直接访问自己内部的副本变量。 理解几个概念&#xff1a; 在java中ThreadLocal是一个类。 ThreadMap是一个类&#xff0c; Thread类是线程类。 ThreadLocal…