java IO 操做分析
package jdk.util.sourceCode; import java.io.*; /** * 常常會遇到各類 IO 流操做,IO 流操做通常分爲兩類:字符流和字節流。 * 以 "Reader" 結尾都是字符流,操做的都是字符型的數據 * 以 "Stream" 結尾的都是字節流,操做的都是 byte 類型的數據 * 兩者的區別: * 字節流沒有緩衝區,是直接輸出的;而字符流是先輸出到緩衝區,而後在調用 close() 方法後再輸出信息 * 處理對象不一樣,字節流能處理全部類型的數據,可是字符流只能處理字符類型的數據(只要是處理純文本數據,就優先考慮使用字符流,除此以外都使用字節流) * java byte -> short -> int -> long 1byte -> 2byte -> 4byte -> 8byte * * * * InputStream 和 OutputStream 是各類輸入輸出字節流的基類,全部字節流都繼承於這兩個基類 * * * FileInputStream 和 FileOutputStream 這兩個從字面意思很容易理解,是對文件的字節流操做,也是最多見的 IO 操做流 * * * 非流式文件類 -- File 類 * 從定義來看,File 類是 Object 的直接子類,同時它繼承了 Comparable 接口能夠進行數組的排序 * File 類的操做包括文件的建立,刪除,重命名,獲得文件/文件夾的路徑,建立時間等 * File 類是對文件系統中文件以及文件夾進行封裝的一個對象,能夠經過對象的思想來操做文件和文件夾 * / /** * @author: util.you.com@gmail.com * @date: 2019/5/25 15:40 * @description: * @version: 1.0 * @className: TestIO */ public class TestIO { public static void main(String[] args){ // 1.調用 新建文件 // createFile("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\", "測試io.txt"); // 2.調用刪除文件 // deleteFile("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\","測試io.txt"); // 3.調用建立文件夾 // createFolder("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\", "測試io文件夾"); // 4.列出指定目錄下面的全部文件,包括隱藏文件 // listFiles("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\"); // 5.判斷指定的 文件夾是不是一個 目錄(便是否是一個 文件夾) // isFolder("F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\", "測試io文件夾"); // 6. 向指定的文件中(須要在文件名中給出路徑和文件名,我這裏是爲了簡便這樣寫了)經過 字節流 寫入數據 (這裏前提:認爲該文件已經存在,不須要再建立) // writeFileByByte("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\測試io.txt"); // 7.從指定的文件中讀取內容 // readFileByByte("F:\\github\\util.you.com@gmail.com\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\測試io.txt"); // 8. 從 指定文件讀取內容並寫入到 目標文件 readWriteFile("F:\\game\\xx.mp4", "E:\\github-project\\jdk\\src\\main\\java\\jdk\\util\\sourceCode\\測試io.txt"); } /** * 由於 io 流基本是與 File(文件/文件夾) 操做密不可分的,所以 io 的操做,只要涉及到文件,文件夾的都必須使用 File 類 * 在指定的路徑下,新建一個 指定文件名的 文件 * @param path 文件路徑 * @param fileName 文件名 */ public static void createFile(String path, String fileName){ // 由於是在 操做 文件,因此用到 File 對象【記住:全部與文件/文件夾操做相關的內容,都必須第一時間想到要用 File 對象】 File file = new File(path+fileName); // 實例化一個 file 操做對象 try { file.createNewFile(); // 調用 file 文件/文件夾 實例對象的 方法,來新建文件 System.out.println("目標文件已存在: " + path + fileName); } catch (IOException e) { e.printStackTrace(); } } /** * 刪除一個指定路徑下的 文件 * @param path 該文件的路徑 * @param fileName 該文件的文件名 */ public static void deleteFile(String path, String fileName){ File file = new File(path+fileName); if(file.exists()){ file.delete(); System.out.println("目標文件已刪除"); }else{ System.out.println("要刪除的目標文件不存在"); } } /** * 新建一個 文件夾 * @param path 路徑 * @param folderName 文件夾名 */ public static void createFolder(String path, String folderName){ File file = new File(path+folderName); file.mkdir(); System.out.println("該文件夾已經存在於: " + path + folderName); } /** * 列出指定目錄下面的全部文件 * @param path 目錄的路徑名 */ public static void listFiles(String path){ File file = new File(path); if (file.isDirectory()){ File[] fileArray = file.listFiles(); for (int i = 0; i < fileArray.length; i++){ System.out.println( "該目錄下的文件: " + fileArray[i]); System.out.println( "該目錄下的文件或文件夾的名字: " + fileArray[i].getName()); } }else{ System.out.println(path + " 目錄不存在"); } } /** * 判斷給定的 文件夾 是不是一個目錄 * @param path */ public static void isFolder(String path, String folderName){ File file = new File(path + folderName); if (file.isDirectory()){ System.out.println(path + folderName + " 是一個目錄"); }else{ System.out.println(path + folderName + " 不是一個目錄"); } } /** * 經過 字節流 向 指定文件 寫入內容 * @param fileName 文件名,這裏爲了簡化,文件名中帶上 路徑 */ public static void writeFileByByte(String fileName){ File file = new File(fileName); OutputStream outputStream = null; // 從內存中 寫入內容 到 文件中,這是輸出流,所以要用 輸出流 // FileOutputStream 的構造器大致上有兩類:一類是 傳入一個帶有文件名和文件路徑的字符串;另外一類是 傳入一個 File 文件/文件夾對象 try { outputStream = new FileOutputStream(file, true); // 給 file 文件對象 構造一個字節輸出流 } catch (FileNotFoundException e) { e.printStackTrace(); } // 這裏穿插一個小知識點,即咱們 給一個 int 參數,可是咱們要讓 outputStream 以 byte[] 的形式寫入,接下來就看 int 轉 byte[] 吧 int a = 12345678; // 爲何這樣呢?由於 一個 int 是 4個byte,因此一個 int 轉成 byte[] 後,必定是裏面包含4個byte元素的 byte[] 數組 byte[] b = new byte[]{ (byte) ((a >> 24) & 0xFF), (byte) ((a >> 16) & 0xFF), (byte) ((a >> 8) & 0xFF), (byte) ((a ) & 0xFF) }; try { outputStream.write(b); // 這裏還有一個問題沒解決:寫入的時候,選擇編碼格式(稍後解決) outputStream.close(); }catch (IOException e) { e.printStackTrace(); } } /** * 經過 字節流 從 指定文件 讀取輸出內容 * @param fileName 文件名,這裏爲了簡化,文件名中帶上 路徑 */ public static void readFileByByte(String fileName){ File file = new File(fileName); InputStream inputStream = null; // 從 硬盤中 讀取內容 到 內存中,這是 輸入流,所以聲明 輸入流 對象 try { inputStream = new FileInputStream(file); // inputStream 讀取內容有5個方法 read():默認讀取一個byte,readBytes(byte b[], int off, int len) // 這裏咱們採用 read(byte b[], int off, int len) 方法 byte[] byter = new byte[1024]; // 因此先實例化一個 byte[] int len = inputStream.read(byter); inputStream.close(); // 最後咱們輸出一下讀取到的內容 System.out.println(new String(byter, 0, len)); } catch (Exception e) { e.printStackTrace(); } } /** * @author: util.you.com@gmail.com * @param: [sourceFile, desFile] * @return: void * @date: 2019/5/25 18:04 * @version: 1.0 * @description: 最後來一個 從 指定文件中 讀取內容 到 指定目標文件中 */ public static void readWriteFile(String sourceFile, String desFile){ File inputFile = new File(sourceFile); File outputFile = new File(desFile); InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new FileInputStream(inputFile); byte[] byter = new byte[1024]; inputStream.read(byter); outputStream = new FileOutputStream(outputFile, true); outputStream.write(byter); outputStream.close(); inputStream.close(); System.out.println("操做完成"); }catch (Exception e){ System.out.println(e.getMessage()); } } }
原創手敲不易,轉載請註明出處,謝謝。我是拉丁小毛,歡迎你們關注我哦,一塊兒交流,共同進步。有問題能夠
郵我哦(util.you.com@gmail.com)