读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例
讀入的字節(jié)都寫入字節(jié)數(shù)組中
嗨,大家好,Java程序員經(jīng)常在現(xiàn)實(shí)世界中遇到編程問題,他們需要將文件中的數(shù)據(jù)加載到字節(jié)數(shù)組中,該文件可以是文本文件或二進(jìn)制文件。 一個(gè)示例是將文件的內(nèi)容轉(zhuǎn)換為String以顯示。 不幸的是,用于表示文件和目錄的Java File類沒有方法toByteArray() 。 它僅保存路徑,并允許您執(zhí)行某些操作(如打開和關(guān)閉文件),但不允許直接將File轉(zhuǎn)換為字節(jié)數(shù)組 。 無論如何,無需擔(dān)心,因?yàn)檫€有其他幾種方法可以將File讀入字節(jié)數(shù)組,您將在此Java文件教程中學(xué)習(xí)這些方法。
如果您喜歡Apache Commons和像我這樣的Google Guava,那么您可能已經(jīng)熟悉單行代碼,該代碼可以將文件快速讀取到字節(jié)數(shù)組中。 如果不是,那么現(xiàn)在正是探索這些API的合適時(shí)機(jī)。
在本教程中,我們將看到7個(gè)不同的示例,將File讀取為字節(jié)數(shù)組 ,其中一些使用第三方庫,而另一些使用JDK 6和JDK 7核心Java庫。
根據(jù)您的選擇,可以使用以下任何一種方法將文件數(shù)據(jù)轉(zhuǎn)換為字節(jié)。 要記住的一件事是您對(duì)字節(jié)數(shù)組的處理方式。 如果要從字節(jié)數(shù)組創(chuàng)建String ,請(qǐng)?zhí)岱雷址幋a。 您可能需要通過讀取元數(shù)據(jù)信息(例如HTML頁面和XML文檔的Content-Type)來找出正確的字符編碼。
在讀取XML文檔時(shí),首先讀取XML文件并將其存儲(chǔ)在String中是一個(gè)壞主意。 相反,最好將InputStream傳遞給XML解析器,它們將自己正確地確定編碼。
還有一點(diǎn)要注意的是,您不能將大于2GB的文件讀取到一個(gè)字節(jié)數(shù)組中,為此您需要多個(gè)字節(jié)數(shù)組。 此限制來自Java中的數(shù)組索引為int類型,其最大值為2147483647 ,大約等于2GB 。
順便說一句,我希望您總體上熟悉基本的Java編程和Java API。
用Java將文件讀入字節(jié)數(shù)組的7種方法
在不浪費(fèi)您更多時(shí)間的情況下,以下是將文件加載到Java中的字節(jié)數(shù)組中的所有七種方法:
1)使用Apache Commons IOUtils
如果您不討厭第三方庫,這是將文件數(shù)據(jù)讀取到字節(jié)數(shù)組中最簡單的方法之一。 它之所以有用,是因?yàn)槟恍枰獜念^開始編寫代碼,也不必?fù)?dān)心異常處理等。
byte [] filedata = IOUtils.toByteArray( new FileInputStream( "info.xml" [] filedata = IOUtils.toByteArray( "info.xml" )); IOUtils.toByteArray(InputStream input)獲取以下內(nèi)容:
InputStream作為byte [] 。 此方法還在內(nèi)部緩沖輸入,因此不需要使用BufferedInputStream ,但是它不是null安全的。 如果輸入為null ,則拋出NullPointerException 。
2)使用Apache Commons FileUtils
org.apache.commons.io包中的FileUtils class提供了常規(guī)的文件操作功能,例如寫入文件或從文件讀取。 此方法用于將文件的內(nèi)容讀取到字節(jié)數(shù)組中,這的好處是文件始終處于關(guān)閉狀態(tài)。
byte [] data = FileUtils.readFileToByteArray( new File( "info.xml" ));3)使用FileInputStream和JDK
這是將文件內(nèi)容讀入字節(jié)數(shù)組的經(jīng)典方法。 完成操作后,別忘了關(guān)閉流 。 這是使用Java中的FileInputStream類將文件讀入字節(jié)數(shù)組的代碼:
public static byte [] readFile(String file) throws IOException { ?File f = new File(file); ?// work only for 2GB file, because array index can only up to Integer.MAX ?byte [] buffer = new byte [( int )f.length()]; ?FileInputStream is = new FileInputStream(file); ?is.read(buffer); ?is.close(); ?return buffer; ? }在生產(chǎn)中,使用finally塊關(guān)閉流以釋放文件描述符。
4)使用Google Guava Files類
Google Guava的Files類提供了用于處理文件的實(shí)用方法,例如將文件轉(zhuǎn)換為字節(jié)數(shù)組,具有指定字符集的字符串,進(jìn)行復(fù)制,移動(dòng)等Files.toByteArray()方法將文件中的所有字節(jié)讀取為字節(jié)數(shù)組,然后如果文件大小大于可能的最大字節(jié)數(shù)組(2 ^ 31 – 1),則拋出IllegalArgumentException 。
byte [] bytes = Files.toByteArray( new File( "info.xml" [] bytes = Files.toByteArray( "info.xml" ));這種將文件內(nèi)容讀入字節(jié)數(shù)組的方法具有多個(gè)優(yōu)點(diǎn),首先,您不需要重新發(fā)明輪子 。 其次,它使用NIO讀取文件 ,其性能將比流IO更好。 您也不必像Guava那樣擔(dān)心處理異常和關(guān)閉流。
5)使用番石榴的ByteStreams實(shí)用程序
Guava的ByteStreams類提供了用于處理字節(jié)數(shù)組和I / O流的實(shí)用程序方法。 toByteArray()使用InputStream并將所有字節(jié)讀入字節(jié)數(shù)組,但它不會(huì)關(guān)閉流 ,因此您需要自己關(guān)閉它。
這是一個(gè)原因,我不喜歡這種方法,我們?cè)谏弦还?jié)中看到的Java 7示例負(fù)責(zé)關(guān)閉流。
byte [] g2Bytes = ByteStreams.toByteArray( new FileInputStream( "info.xml" )); 順便說一句,如果您正在使用Java內(nèi)存約束環(huán)境,例如
Android ,然后考慮使用諸如proguard之類的混淆器從第三方庫中刪除未使用的類。 例如,默認(rèn)情況下,番石榴會(huì)為APK添加2MB以上的內(nèi)存。 但是使用Proguard時(shí),它的大小約為250KB
6)使用JDK 7 NIO文件和路徑
如果您使用的是Java 7,則這是將File轉(zhuǎn)換為字節(jié)數(shù)組的最佳方法。 它允許您從文件讀取所有字節(jié)并將其捕獲到字節(jié)數(shù)組中。 您只需要知道文件的路徑即可。
這是讀取Java 7中文件的代碼示例:
Path path = Paths.get( "info.xml" Path path = Paths.get( "info.xml" ); byte [] raw = java.nio.file.Files.readAllBytes(path);這種方法的最大優(yōu)點(diǎn)是它不需要任何第三方庫 。 這也是一種靜態(tài)方法,因此非常方便。 它還可以確保在讀取所有字節(jié)或引發(fā)I / O錯(cuò)誤或其他運(yùn)行時(shí)異常時(shí)關(guān)閉文件。 從第一版開始就缺少Java。
順便說一句,此方法僅打算用于方便將所有字節(jié)讀入字節(jié)數(shù)組的情況下使用。 如果不能分配所需大小的數(shù)組(例如, 文件大于2GB) ,則不適合讀取大文件并拋出OutOfMemoryError 。
順便說一句,如果您只有File對(duì)象而不是Path,那么您也可以使用
File.toPath()在JDK 1.7中將File轉(zhuǎn)換為Path。
7)在Java中使用RandomAccessFile
您還可以使用RandomeAccessFile將File轉(zhuǎn)換為字節(jié)數(shù)組,如下所示,盡管您也可以使用read(byte[])方法,但最好使用readFully。
RandomAccessFile f = new RandomAccessFile( "info.xml" , "rw" ); ? byte [] b = new byte [( int )f.length()]; ? f.readFully(b); ??另外,請(qǐng)注意, RandomAccessFile不是線程安全的。 因此,在某些情況下可能需要同步。
最后,這里的某些代碼不是生產(chǎn)質(zhì)量,因?yàn)樗鼈儫o法正確處理異常。 在現(xiàn)實(shí)世界中,所有文件處理代碼都必須在finally塊中關(guān)閉流以釋放與此相關(guān)的文件描述符,否則可能會(huì)導(dǎo)致java.io.IOException:打開文件太多錯(cuò)誤 。
有時(shí)您會(huì)期望像Apache commons IO之類的庫能夠正確關(guān)閉流,如下面從的代碼段所示
FileUtils類阿帕奇百科全書IO,所述的closeQuietly()方法關(guān)閉流忽略空值和異常。
但這并不總是正確的,因?yàn)镚oogle Guava的ByteStreams.toByteArray方法不會(huì)關(guān)閉流。 最好在生產(chǎn)代碼中使用特定方法之前檢查文檔。 通常,最好使用JDK API(如果可用),這就是為什么對(duì)JDK的充分了解對(duì)成為一名專業(yè)Java程序員有很大幫助。
Java程序,用Java將文件讀入字節(jié)數(shù)組
這是我們完整的Java程序,用于將文件讀入Java的字節(jié)數(shù)組中。 這結(jié)合了我上面顯示的所有6種方法。 您可以復(fù)制粘貼此示例,然后在您喜歡的IDE(如Eclipse,NetBeans或IntelliJIDEA)中運(yùn)行。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import com.google.common.io.ByteStreams; import com.google.common.io.Files; ?? /** * * @author Javin Paul */ ? public class Testing { ?public static void main(String args[]) throws IOException { ?// Example 1: Using Apache Commons IOUtils to read file into byte array ?byte [] filedata = IOUtils.toByteArray( new FileInputStream( "info.xml" [] filedata = IOUtils.toByteArray( "info.xml" )); ?String str = new String(filedata, "UTF-8" ); ?System.out.println( "File to byte[] using IOUtils.toByteArray \n" + str); ?// Example 2: Reading File to byte[] using FileUtils class ?byte [] data = FileUtils.readFileToByteArray( new File( "info.xml" )); ?System.out.println( "Converting File to byte[] using FileUtils \n" ?+ new String(data, StandardCharsets.UTF_8)); ?// Example 3: Using FileInputStream and JDK ?byte [] contents = readFile( "info.xml" ); ?System.out.printf( "File to byte[] Java without thirdpaty library %n %s %n" , ?new String(contents, StandardCharsets.UTF_8)); ?// Example 4: Using Google Guava, uses NIO ?byte [] bytes = Files.toByteArray( new File( "info.xml" [] bytes = Files.toByteArray( "info.xml" )); ?System.out.printf( "Convert File to byte array Using Google %n %s %n" , ?new String(bytes, "UTF-8" )); ?// Example 5: ?byte [] g2Bytes = ByteStreams.toByteArray( new FileInputStream( "info.xml" )); ?System.out.println( "File to byte[] using Guvava \n " + new String(g2Bytes, "UTF-8" )); "File to byte[] using Guvava \n " )); ?// Example 6: Using JDK 7 NIO Path and Files class ?Path path = Paths.get( "info.xml" Path path = Paths.get( "info.xml" ); ?byte [] raw = java.nio.file.Files.readAllBytes(path); ?System.out.println( "Read File to byte[] in JDK 7 \n " + new String(raw, "UTF-8" )); ?//Example 7: Using RandomAccessFile in Java ?RandomAccessFile f = new RandomAccessFile( "info.xml" , "rw" ); ?byte [] b = new byte [( int ) f.length()]; ?f.readFully(b); ?System.out.println( "Load File to byte[] in Java using RandomAccessFile \n " ?+ new String(b, "UTF-8" )); ?} ?/* ?* Reading File into byte array using JDK classes only ?*/ ?public static byte [] readFile(String file) throws IOException { ?File f = new File(file); ?// work only for 2GB file, because array index can only upto Integer.MAX ?byte [] buffer = new byte [( int ) f.length()]; ?FileInputStream is = new FileInputStream(file); ?is.read(buffer); ?is.close(); ?return buffer; ?} ? } ? Output: ? [] using IOUtils.toByteArray File to byte [] using IOUtils.toByteArray File to Name: Société Générale Headquarters: ?le-de-France, France [] using FileUtils Converting File to byte [] using FileUtils Name: Société Générale Headquarters: ?le-de-France, France File to byte [] Java without thirdpaty library ?Name: Société Générale Headquarters: ?le-de-France, France ? array Using Google Convert File to byte array Using Google Name: Société Générale ? Headquarters: ?le-de-France, France [] using Guvava File to byte [] using Guvava ?Name: Société Générale Headquarters: ?le-de-France, France ? [] in JDK 7 [] in JDK Read File to byte [] in JDK Name: Société Générale ? Headquarters: ?le-de-France, France ? [] in Java using RandomAccessFile Load File to [] in Java using RandomAccessFile byte [] in Java using RandomAccessFile Name: Société Générale ? Headquarters: ?le-de-France, France在7ways的本教程中,這就是用Java將文件讀入字節(jié)數(shù)組的全部內(nèi)容 。 現(xiàn)在,您知道有多種使用Java讀取文件的方法,其中一種方法是使用第三方庫,例如Apache Commons IO,Google Guava,Apache MINA,以及其他方法,僅使用標(biāo)準(zhǔn)JDK文件輸入輸出類。 根據(jù)您的要求,可以使用這些解決方案中的任何一種來將文件數(shù)據(jù)讀取為Java中的字節(jié)。 如果要將字節(jié)數(shù)組轉(zhuǎn)換為字符串,請(qǐng)注意字符編碼。
另外,請(qǐng)記住,Java中的數(shù)組只能容納有限數(shù)量的數(shù)據(jù),因?yàn)槠溟L度不能超過Integer.MAX_VALUE (2GB)。 因此,盡管可以使用輸入流讀取大數(shù)據(jù),但不能將大文件轉(zhuǎn)換為單字節(jié)數(shù)組,但需要分塊或使用多個(gè)字節(jié)數(shù)組處理它們。
如果您喜歡本文,并且想了解有關(guān)最新Java版本中改進(jìn)的文件IO的更多信息,請(qǐng)查看以下教程:
- 完整的Java開發(fā)人員路線圖( 指南 )
- Java 8中逐行讀取文件的3種方法( 示例 )
- 2020年學(xué)習(xí)Java的10門課程( 課程 )
- 如何使用Java中的BufferedReader逐行讀取文本文件? ( 回答 )
- Java程序員在2020年可以學(xué)習(xí)的15件事( 文章 )
- 如何在Java中使用內(nèi)存映射文件? ( 回答 )
- 破解編碼面試的5大技巧( 技能 )
- 如何在Java中將XML文件讀取為String? ( 教程 )
- 如何使用Apache POI在Java中讀取/寫入Excel(XLS和XLSX)文件? ( 教程 )
- 在Java中解析CSV文件的2種方法? ( 回答 )
- 如何在Java中刪除包含文件的目錄? ( 回答 )
- 如何使用SAX解析器解析Java中的XML文件? ( 指南 )
- 如何在Java中將JSON轉(zhuǎn)換為Object? ( 示例 )
- 如何使用JDOM解析器讀取Java中的XML文件? ( 教程 )
- 如何使用Jackson Streaming API解析大型JSON文件? ( 示例 )
- 如何在Java 8中一行讀取文件? ( 示例 )
- 如何用Java復(fù)制文件? ( 示例 )
- 如何在Java中為文件生成MD5校驗(yàn)和? ( 解決方案 )
- 如何在Java中讀取/寫入RandomAccessFile? ( 示例 )
感謝您到目前為止閱讀本文。 如果您發(fā)現(xiàn)此Java文件教程很有用,請(qǐng)與您的朋友和同事分享。 如果您有任何疑問或反饋,請(qǐng)留言。
翻譯自: https://www.javacodegeeks.com/2020/04/7-examples-to-read-file-into-a-byte-array-in-java.html
讀入的字節(jié)都寫入字節(jié)數(shù)組中
總結(jié)
以上是生活随笔為你收集整理的读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 穿盘是什么意思 穿盘意思是什么
- 下一篇: 都敏俊和允才对手指是什么意思 都敏俊和允