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(); }