咱們從兩個方面來理解Java IO,數據源(流)、數據傳輸,即IO的核心就是對數據源產生的數據進行讀寫並高效傳輸的過程。數據庫
數據源能夠理解爲水源,指能夠產生數據的事物,如硬盤(文檔、數據庫等文件...)、網絡(填寫的form表單、物聯感知信息..),在Java中有對文件及文件夾操做的類File,經常使用的文件方法以下:數組
public static void printFileDetail(File file) throws IOException { System.out.println("文件是否存在:" + file.exists()); if(!file.exists()){ System.out.println("建立文件:" + file.getName()); file.createNewFile(); } if(file.exists()){ System.out.println("是否爲文件:" + file.isFile()); System.out.println("是否爲文件夾:" + file.isDirectory()); System.out.println("文件名稱:" + file.getName()); System.out.println("文件構造路徑:" + file.getPath()); System.out.println("文件絕對路徑:" + file.getAbsolutePath()); System.out.println("文件標準路徑:" + file.getCanonicalPath()); System.out.println("文件大小:" + file.length()); System.out.println("所在文件夾路徑:" + file.getParentFile().getCanonicalPath()); System.out.println("設置爲只讀文件:" + file.setReadOnly()); } } public static void main(String[] args) throws IOException { File file = new File("./遮天.txt"); printFileDetail(file); }
結果以下:網絡
文件是否存在:false 建立文件:遮天.txt 是否爲文件:true 是否爲文件夾:false 文件名稱:遮天.txt 文件構造路徑:.\遮天.txt 文件絕對路徑:E:\idea-work\javase-learning\.\遮天.txt 文件標準路徑:E:\idea-work\javase-learning\遮天.txt 文件大小:0 所在文件夾路徑:E:\idea-work\javase-learning 設置爲只讀文件:true
數據傳輸的核心在於傳輸數據源產生的數據,Java IO對此過程從兩方面進行了考慮,分別爲輸入流和輸出流,輸入流完成外部數據向計算機內存寫入,輸出流則反之。ide
而針對輸入流和輸出流,Java IO又從字節和字符的不一樣,再次細分了字節流和字符流。
idea
說明:Java中最小的計算單元是字節,沒有字符流也能進行IO操做,只是由於現實中大量的數據都是文本字符數據,基於此單獨設計了字符流,使操做更簡便。設計
4個頂層接口有了,接下來Java IO又從多種應用場景(包括了基礎數據類型、文件、數組、管道、打印、序列化)和傳輸效率(緩衝操做)進行了考慮,提供了種類衆多的Java IO流的實現類,看下圖:
code
固然咱們不用都記住,而實際在使用過程當中用的最多的仍是文件類操做、轉換類操做、序列化操做,固然在此基礎上咱們可使用Buffered來提升效率(Java IO使用了裝飾器模式)。下面咱們經過文件拷貝來簡單說明一下主要類的使用orm
/** * 文件拷貝(全部文件,文檔、視頻、音頻、可執行文件...),未使用緩衝 * @param sourceFileName 源文件路徑 * @param targetFileName 拷貝後目標文件路徑 * @throws IOException IO異常 */ public static void slowlyCopyFile(String sourceFileName, String targetFileName) throws IOException{ //獲取字節輸入流 FileInputStream fileInputStream = new FileInputStream(sourceFileName); //File targetFile = new File(targetFileName); //獲取字節輸出流 FileOutputStream fileOutputStream = new FileOutputStream(targetFileName); byte[] bytes = new byte[1024]; //當爲-1時說明讀取到最後一行了 while ((fileInputStream.read(bytes)) != -1) { fileOutputStream.write(bytes); } fileInputStream.close(); fileOutputStream.close(); } /** * 文件拷貝(全部文件,文檔、視頻、音頻、可執行文件...),使用緩衝 * @param sourceFileName 源文件路徑 * @param targetFileName 拷貝後目標文件路徑 * @throws IOException IO異常 */ public static void fastCopyFile(String sourceFileName, String targetFileName) throws IOException{ //獲取字節輸入流 FileInputStream fileInputStream = new FileInputStream(sourceFileName); //緩衝字節輸入流 BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); //獲取字節輸出流 FileOutputStream fileOutputStream = new FileOutputStream(targetFileName); //緩衝字節輸出流 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); byte[] bytes = new byte[1024]; //當爲-1時說明讀取到最後一行了 while ((bufferedInputStream.read(bytes)) != -1) { bufferedOutputStream.write(bytes); } bufferedOutputStream.flush(); bufferedInputStream.close(); fileInputStream.close(); bufferedOutputStream.close(); fileOutputStream.close(); } public static void main(String[] args) throws IOException { long startTime = System.currentTimeMillis(); //文件215M slowlyCopyFile("D:\\Download\\jdk-8u221.exe","D:\\jdk-8u221.exe");//執行:1938ms fastCopyFile("D:\\Download\\jdk-8u221.exe","D:\\jdk-8u221.exe");//執行:490ms System.out.println(System.currentTimeMillis() - startTime); }
/** * 文本文件拷貝,不使用緩衝 * @param sourceFileName 源文件路徑 * @param targetFileName 拷貝後目標文件路徑 * @throws IOException IO異常 */ public static void slowlyCopyTextFile(String sourceFileName, String targetFileName) throws IOException { FileReader fileReader = new FileReader(sourceFileName); FileWriter fileWriter = new FileWriter(targetFileName); int c; while ((c = fileReader.read()) != -1) { fileWriter.write((char)c); } fileReader.close(); fileWriter.close(); } /** * 文本文件拷貝,使用緩衝 * @param sourceFileName 源文件路徑 * @param targetFileName 拷貝後目標文件路徑 * @throws IOException IO異常 */ public static void fastCopyTextFile(String sourceFileName, String targetFileName) throws IOException { FileReader fileReader = new FileReader(sourceFileName); BufferedReader bufferedReader = new BufferedReader(fileReader); FileWriter fileWriter = new FileWriter(targetFileName); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); String str; while ((str = bufferedReader.readLine()) != null) { bufferedWriter.write(str + "\n"); } bufferedReader.close(); fileReader.close(); bufferedWriter.close(); fileWriter.close(); } public static void main(String[] args) throws IOException { long startTime = System.currentTimeMillis(); //文件30M slowlyCopyTextFile("D:\\Download\\小說合集.txt","D:\\小說合集.txt");//3182ms fastCopyTextFile("D:\\Download\\小說合集.txt","D:\\小說合集.txt");//1583ms System.out.println(System.currentTimeMillis() - startTime); }
本文主要對Java IO相關知識點作告終構性梳理,包括了Java IO的做用,數據源File類,輸入流,輸出流,字節流,字符流,以及緩衝流,不一樣場景下的更細化的流操做類型,同時用了一個文件拷貝代碼簡單地說明了主要的流操做,如有不對之處,請批評指正,望共同進步,謝謝!。視頻