日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

用Java将文件读入字节数组的7个示例

發布時間:2023/12/3 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Java将文件读入字节数组的7个示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

嗨,大家好,Java程序員經常在現實世界中遇到編程問題,他們需要將文件中的數據加載到字節數組中,該文件可以是文本或二進制文件。 一個示例是將文件的內容轉換為String以便顯示。 不幸的是,用于表示文件和目錄的Java的File類沒有方法toByteArray() 。 它僅保存路徑,并允許您執行某些操作,例如打開和關閉文件,但不允許直接將File轉換為字節數組 。 無論如何,無需擔心,因為還有其他幾種將File讀入字節數組的方法,您將在此Java文件教程中學習這些方法。

如果您像我一樣是Apache Commons和Google Guava的粉絲,那么您可能已經熟悉單行代碼,該代碼可以將文件快速讀取為字節數組。 如果不是,那么現在正是探索這些API的合適時機。

在本教程中,我們將看到7個不同的示例,以將File讀取為字節數組 ,一些示例使用第三方庫,而另一些示例使用JDK 6和JDK 7核心Java庫。

根據您的選擇,可以使用以下任何一種方法將文件數據轉換為字節。 要記住的一件事是您對字節數組的處理方式。 如果要從字節數組創建String ,請提防字符編碼。 您可能需要通過讀取元數據信息(例如HTML頁面和XML文檔的Content-Type)來找出正確的字符編碼。

在讀取XML文檔時,首先讀取XML文件并將其存儲在String中是個壞主意。 相反,最好將InputStream傳遞給XML解析器,它們將自己正確地確定編碼。

還有一點要注意的是,您不能將大于2GB的文件讀取到一個字節數組中,為此您需要多個字節數組。 此限制來自Java中的數組索引為int類型,其最大值為2147483647 ,大約等于2GB 。

順便說一句,我希望您總體上熟悉基本的Java編程和Java API。

用Java將文件讀入字節數組的7種方法

在不浪費您更多時間的情況下,以下是將文件加載到Java中的字節數組中的所有七種方法:

1)使用Apache Commons IOUtils

如果您不討厭第三方庫,這是將文件數據讀入字節數組的最簡單方法之一。 它之所以有用,是因為您不需要從頭開始編寫代碼,也不必擔心異常處理等。

byte [] filedata = IOUtils.toByteArray( new FileInputStream( "info.xml" [] filedata = IOUtils.toByteArray( "info.xml" ));

IOUtils.toByteArray(InputStream input)獲取以下內容:
InputStream作為byte [] 。 此方法還在內部緩沖輸入,因此無需使用BufferedInputStream ,但它不是null安全的。 如果輸入為null ,則拋出NullPointerException 。

2)使用Apache Commons FileUtils

org.apache.commons.io包中的FileUtils class提供了常規的文件操作功能,例如寫入文件或從文件讀取。 此方法用于將文件的內容讀取到字節數組中,這的好處是文件始終處于關閉狀態。

byte [] data = FileUtils.readFileToByteArray( new File( "info.xml" ));

3)使用FileInputStream和JDK

這是將文件內容讀入字節數組的經典方法。 完成操作后,別忘了關閉流 。 這是使用Java中的FileInputStream類將文件讀入字節數組的代碼:

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; ? }

在生產中,使用finally塊關閉流以釋放文件描述符。

4)使用Google Guava Files類

Google Guava的Files類提供了用于處理文件的實用方法,例如將文件轉換為字節數組,具有指定字符集的字符串,進行復制,移動等Files.toByteArray()方法將文件中的所有字節讀取為字節數組,然后如果文件大小大于可能的最大字節數組(2 ^ 31 – 1),則拋出IllegalArgumentException 。

byte [] bytes = Files.toByteArray( new File( "info.xml" [] bytes = Files.toByteArray( "info.xml" ));

這種將文件內容讀入字節數組的方法具有多個優點,首先,您不需要重新發明輪子 。 其次,它使用NIO讀取文件 ,其性能將比流IO更好。 您也不必像Guava那樣擔心處理異常和關閉流。

5)使用番石榴的ByteStreams實用程序

Guava的ByteStreams類提供了用于處理字節數組和I / O流的實用程序方法。 toByteArray()使用InputStream并將所有字節讀入字節數組,但它不會關閉流 ,因此您需要自己關閉它。

這是一個原因,我不喜歡這種方法,我們在上一節中看到的Java 7示例負責關閉流。

byte [] g2Bytes = ByteStreams.toByteArray( new FileInputStream( "info.xml" ));

順便說一句,如果您正在使用Java內存約束環境,例如
Android ,然后考慮使用諸如proguard之類的混淆器從第三方庫中刪除未使用的類。 例如,默認情況下,番石榴會為APK添加2MB以上的內存。 但是使用Proguard時,它的大小約為250KB

6)使用JDK 7 NIO文件和路徑

如果您使用的是Java 7,則這是將File轉換為字節數組的最佳方法。 它允許您從文件讀取所有字節并將其捕獲到字節數組中。 您只需要知道文件的路徑即可。

以下是在Java 7中讀取文件的代碼示例:

Path path = Paths.get( "info.xml" Path path = Paths.get( "info.xml" ); byte [] raw = java.nio.file.Files.readAllBytes(path);

這種方法的最大優點是它不需要任何第三方庫 。 這也是一種靜態方法,因此非常方便。 它還確保在讀取所有字節或引發I / O錯誤或其他運行時異常時關閉文件。 從第一版開始就缺少Java。

順便說一句,此方法僅適用于方便將所有字節讀入字節數組的情況。 如果不能分配所需大小的數組(例如, 文件大于2GB) ,則不適合讀取大文件并拋出OutOfMemoryError 。

順便說一句,如果您只有File對象而不是Path,那么您也可以使用
File.toPath()在JDK 1.7中將File轉換為Path。

7)在Java中使用RandomAccessFile

您還可以使用RandomeAccessFile將File轉換為字節數組,如下所示,盡管您也可以使用read(byte[])方法,但最好使用readFully。

RandomAccessFile f = new RandomAccessFile( "info.xml" , "rw" ); ? byte [] b = new byte [( int )f.length()]; ? f.readFully(b); ??

另外,請注意, RandomAccessFile不是線程安全的。 因此,在某些情況下可能需要同步。

最后,這里的某些代碼不是生產質量,因為它們無法正確處理異常。 在現實世界中,所有文件處理代碼都必須在finally塊中關閉流以釋放與此相關的文件描述符,否則可能會導致java.io.IOException:打開文件太多錯誤 。

有時您會期望像Apache commons IO之類的庫能夠正確關閉流,如下面從的代碼段所示
FileUtils類阿帕奇百科全書IO,所述的closeQuietly()方法關閉流忽略空值和異常。

?InputStream in = null ; ?try { ?in = openInputStream(file); ?return IOUtils.toByteArray(in, file.length()); ?} finally { ?IOUtils.closeQuietly(in); ?} ?}

但這并不總是正確的,因為Google Guava的ByteStreams.toByteArray方法不會關閉流。 最好在生產代碼中使用特定方法之前檢查文檔。 通常,最好使用JDK API(如果可用),這就是為什么對JDK的充分了解對成為一名專業Java程序員有很大幫助。

Java程序,用Java將文件讀入字節數組

這是我們完整的Java程序,用于將文件讀入Java中的字節數組。 這結合了我上面顯示的所有6種方法。 您可以復制粘貼此示例,然后在您喜歡的IDE(如Eclipse,NetBeans或IntelliJIDEA)中運行。

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 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將文件讀入字節數組的全部內容 。 現在,您知道有多種使用Java讀取文件的方法,其中一些方法是使用第三方庫,例如Apache Commons IO,Google Guava,Apache MINA,以及其他方法,僅使用標準JDK文件輸入輸出類。 根據您的要求,可以使用這些解決方案中的任何一種來將文件數據讀取為Java中的字節。 如果要將字節數組轉換為字符串,請注意字符編碼。

另外,請記住,Java中的數組只能容納有限數量的數據,因為其長度不能超過Integer.MAX_VALUE (2GB)。 因此,盡管可以使用輸入流讀取大數據,但不能將大文件轉換為單字節數組,但需要分塊或使用多個字節數組處理它們。

如果您喜歡本文,并且想了解有關最新Java版本中改進的文件IO的更多信息,請查看以下教程:

  • 完整的Java開發人員路線圖( 指南 )
  • Java 8中逐行讀取文件的3種方法( 示例 )
  • 2020年學習Java的10門課程( 課程 )
  • 如何在Java中使用BufferedReader逐行讀取文本文件? ( 回答 )
  • 2020年Java程序員可以學習的15件事( 文章 )
  • 如何在Java中使用內存映射文件? ( 回答 )
  • 破解編碼面試的5大技巧( 技能 )
  • 如何在Java中將XML文件讀取為String? ( 教程 )
  • 如何使用Apache POI在Java中讀取/寫入Excel(XLS和XLSX)文件? ( 教程 )
  • 用Java解析CSV文件的2種方法? ( 回答 )
  • 如何用Java刪除包含文件的目錄? ( 回答 )
  • 如何使用SAX解析器解析Java中的XML文件? ( 指南 )
  • 如何在Java中將JSON轉換為Object? ( 示例 )
  • 如何使用JDOM解析器讀取Java中的XML文件? ( 教程 )
  • 如何使用Jackson Streaming API解析大的JSON文件? ( 示例 )
  • 如何在Java 8中一行讀取文件? ( 示例 )
  • 如何用Java復制文件? ( 示例 )
  • 如何在Java中為文件生成MD5校驗和? ( 解決方案 )
  • 如何在Java中讀取/寫入RandomAccessFile? ( 示例 )

感謝您到目前為止閱讀本文。 如果您發現此Java文件教程很有用,請與您的朋友和同事分享。 如果您有任何疑問或反饋,請留言。

翻譯自: https://www.javacodegeeks.com/2020/04/7-examples-to-read-file-into-a-byte-array-in-java.html

總結

以上是生活随笔為你收集整理的用Java将文件读入字节数组的7个示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。