番石榴文件: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.pswp.cn/news/371373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371373.shtml
英文地址,請注明出處:http://en.pswp.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…