java 文件File與byte[]數組相互轉換的兩種方式


1.文件轉byte[]

方式一:文件輸入流

File file = new File("C:\\Users\\Marydon\\Desktop\\個人信用報告.pdf");
try {
    FileInputStream fis = new FileInputStream(file);
    // 強轉成int類型大小的數組
    byte[] fileBytes = new byte[(int) file.length()];
    // 將pdf內容放到數組當中
    fis.read(fileBytes);
    // 關閉文件流
    fis.close();
    System.out.println(Arrays.toString(fileBytes));
} catch (IOException e) {
    e.printStackTrace();
}

  在這里會觸發一個思考題:

  將文件的長度類型long強制轉換成int,真的可以嗎?

  起初,我覺得這樣不妥,原因在於:假設當文件的長度>Integer類型的最大值時,那就這樣肯定就不行了,byte[]將不是一個完整的文件數組集合,怎么辦?

  我首先想到的是:

  我們在進行文件流的讀寫操作時,通常使用的是這種方式

  寫到這里,我才明白,這種循環讀取的方式是因為有地方可以接受讀取到的字節,我們這里呢?本來就是要用數組接收的,現在接收不下,沒有辦法,要想實現的話,也就只能將文件拆分成多個數字集合,這樣一來,和我的初衷背道而馳,我就是想要將它們融合到一個數組,顯然,這種方式是行不通的。

  接下來,我就查了在Java中,數組的最大限制相關信息:

  數組的最大限制,理論值是:

  相當於2G的大小,對應應用內存的話是4G(源自網絡,不知其真假性,如果有好心人進行測試一下,歡迎留言)

  當我創建一個最大的數組時,結果如下:

  數組所需內存超過了Java虛擬機的內存,GAME OVER。

  然后,繼續查:
  了解到:Java數組最大容量同時受兩方面限制

  一是:數組可索引的最大元素(也就是Integer的最大值);二是:應用程序可用的內存量(也就是JVM的容量)。
  走到這里,基本上恍然大悟啦:

  只要我們能將文件成功轉換成單個數組,就說明:

  文件的長度必然<數組容量的最大值,否則運行起來肯定報錯。

  所以,上述代碼中將文件的長度類型long強制轉換成int,是完全可以的,如果不可以(也就是文件超過了數組最大容量) ,那就不用考慮將文件轉單個數組的實現方式啦。

  另外,如果你想用BufferInputStream來加快讀取速度的話,也是可以噠。

  對於有強迫症的人來說,強轉還是很讓人不舒服的,可以使用下面代碼,一勞永逸

  推薦使用

File file = new File("C:\\Users\\Marydon\\Desktop\\個人信用報告.pdf");
try {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    // 以字節流的大小來指定數組大小
    byte[] fileBytes = new byte[bis.available()];
    // 將pdf內容放到數組當中
    bis.read(fileBytes);
    // 關閉文件流
    bis.close();
    System.out.println(Arrays.toString(fileBytes));
} catch (IOException e) {
    e.printStackTrace();
} 

方式二:原生工具類Files(不推薦)

  使用條件:>=JDK1.8

try {
    // 方式一
    byte[] bytes = Files.readAllBytes(Paths.get("C:\\Users\\Marydon\\Desktop\\個人信用報告.pdf"));
    // 方式二
    // bytes = Files.readAllBytes(new File(("C:\\Users\\Marydon\\Desktop\\個人信用報告.pdf")).toPath());
    System.out.println(Arrays.toString(bytes));
} catch (IOException e) {
    e.printStackTrace();
}

  但是,這種方式比較雞肋,大文件(100多兆)讀取容易內存溢出。

  如果發現讀取完畢,獲得的數組始終為空[],很有可能是你的原文件已經被破壞

2.byte[]轉文件 

方式一:文件輸出流

// 文件流
byte[] fileBytes = {37, 80, 68, 70, 45, 49, 46, 52, 10, 37, -30, -29, -49, -45, 10, 50, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, 112, 101, 47, 88, 79};
try {
    // 將要輸出的文件
    File outFile = new File("C:\\Users\\Marydon\\Desktop\\aa.pdf");
    // 文件轉輸出流
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFile));
    // 將文件流寫入文件
    bos.write(fileBytes);
    bos.close();
} catch (IOException e) {
    e.printStackTrace();
}

  上面提供的文件字節數組,是無法轉成正常文件的哦,我這里僅提供實現方法

方式二:原生工具類Files

// 文件流
byte[] fileBytes = {37, 80, 68, 70, 45, 49, 46, 52, 10, 37, -30, -29, -49, -45, 10, 50, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, 112, 101, 47, 88, 79};
try {
    // 將數組輸出到指定文件當中
    Files.write(Paths.get("C:\\Users\\Marydon\\Desktop\\aa.pdf"), fileBytes);
} catch (IOException e) {
    e.printStackTrace();
}

  

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM