一、IO 概述 1、IO 概念 IO:I 代表 Input 輸入;O 代表 Output 輸出。 Java 中 IO 是以流為基礎進行輸入輸出,所有的數據被串列化(保存)寫入輸出流,或者從輸入流讀入。 註:數據串列化指把對象的狀態以特定的形式(比如 byte[])保存到流,通過流的方式寫入。 2、I ...
一、IO 概述
1、IO 概念
IO:I 代表 Input 輸入;O 代表 Output 輸出。
Java 中 IO 是以流為基礎進行輸入輸出,所有的數據被串列化(保存)寫入輸出流,或者從輸入流讀入。
註:數據串列化指把對象的狀態以特定的形式(比如 byte[])保存到流,通過流的方式寫入。
2、IO 的作用
1、文本文件,通過特定方法能夠把數據寫到文件,也能夠讀取出文件中的內容。
2、把信息保存到磁碟文件中。
3、Java 操作文件
1、創建 File 對象方式
測試創建文件的三種方式:
1 import org.junit.Test; 2 3 import java.io.File; 4 5 /** 6 * @author zt1994 7 * @date 2018/3/2 10:56 8 */ 9 public class CreateFile { 10 11 /** 12 * 測試創建文件的三種方式,僅僅在程式中創建File對象 13 */ 14 @Test 15 public void testCreateFile(){ 16 //1、File(String pathname) 通過將給定路徑名字元串轉換為抽象路徑名來創建一個新 File 實例。 17 File file = new File("test1.txt"); //相對路徑(相對於當前工程) 18 File file1 = new File("D:\\file\\test1.txt");//絕對路徑 19 20 //2、File(String parent, String child) 根據 parent 路徑名字元串和 child 路徑名字元串創建一個新 File 實例。 21 File file2 = new File("D:\\file\\", "test2.txt"); 22 23 //3、File(File parent, String child) 根據 parent 抽象路徑名和 child 路徑名字元串創建一個新 File 實例。 24 File file3 = new File(new File("D:\\file\\"), "test3.txt"); 25 26 System.out.println(file); //test1.txt 27 System.out.println(file1); //D:\file\test1.txt 28 System.out.println(file2); //D:\file\test2.txt 29 System.out.println(file3); //D:\file\test3.txt 30 } 31 }
2、創建刪除文件和文件夾
1、創建文件
1 import org.junit.Test; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * @author zt1994 8 * @date 2018/3/2 11:16 9 */ 10 public class CreateNewFile { 11 12 /** 13 * 在磁碟上面創建文件 14 * 1、創建文件的路徑必須存在,否則拋出異常 15 * 2、如果文件已經存在,返回false 16 * 3、此方法只能創建文件,不能創建文件夾 17 */ 18 @Test 19 public void testCreateNewFile() throws IOException { 20 File file1 = new File("D:\\test.txt");//絕對路徑 21 boolean b = file1.createNewFile(); 22 System.out.println(b); 23 } 24 }
2、創建和刪除文件夾
測試創建和刪除文件夾:
1 import java.io.File; 2 3 /** 4 * @author zt1994 5 * @date 2018/3/2 11:27 6 */ 7 public class CreateDir { 8 /** 9 * 測試和刪除創建文件夾 10 */ 11 @Test 12 public void testMakeDir(){ 13 //創建文件夾 14 File dir = new File("E:\\testIo"); 15 System.out.println(dir); 16 //1、創建單層文件夾 17 boolean mkdir = dir.mkdir(); 18 System.out.println(mkdir); 19 20 //2、創建多層文件夾 21 File dirs = new File("E:\\Demo\\test\\file"); 22 boolean mkdirs = dirs.mkdirs(); 23 System.out.println(mkdirs); 24 boolean deleteDirs = dirs.delete(); //刪除 25 System.out.println(deleteDirs); 26 27 //刪除文件夾 public boolean delete() 28 boolean delete = dir.delete(); 29 System.out.println(delete); 30 } 31 }
3、其他常用方法
boolean exists() 測試文件或者目錄是否存在;
String getName() 得到文件或者目錄的名稱;
String getParent() 返回此抽象路徑名父目錄的路徑名字元串;如果此路徑名沒有指定父目錄,則返回 null。
boolean isFile() 測試是否是一個文件;
boolean isDirectory 測試是否一個目錄;
3、刪除文件夾目錄的全部內容(遞歸刪除)
1 import org.junit.Test; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 public class TestDeleteAll { 7 /** 8 * 刪除文件夾內所有文件,遞歸刪除 9 */ 10 @Test 11 public void testDeleteAll(){ 12 //創建一個多層文件夾 13 File file = new File("E:\\Demo\\test\\file"); 14 file.mkdirs(); 15 16 File file1 = new File("E:\\Demo"); 17 deleteAll(file1); 18 19 } 20 21 //刪除指定目錄下所有文件 22 public static void deleteAll(File file){ 23 if (file.isFile() || file.list().length==0){ 24 file.delete(); 25 }else { 26 File[] files = file.listFiles(); 27 for (File f:files){ 28 deleteAll(f); //調用方法自身 29 f.delete(); 30 } 31 } 32 } 33 }
二、IO 流讀寫文件
1、IO 流分類
1、按流動方向分類
輸入流和輸出流,流動方向是相對的。
2、按數據的單位分類
位元組流和字元流。
測試 IO 流代碼:
1 import org.junit.Test; 2 3 import java.io.*; 4 5 /** 6 * 輸出流和輸入流程測試 7 */ 8 public class TestIoStream { 9 /** 10 * 1.讀取單個字元和字元轉換 11 */ 12 @Test 13 public void test1() throws IOException { 14 //創建文件對象 15 File file = new File("f1.txt"); 16 17 FileInputStream fileInputStream = new FileInputStream(file); 18 19 int i = fileInputStream.read(); 20 System.out.println(i); 21 22 //字元編碼轉換 23 char x = (char) i; 24 System.out.println(x); 25 } 26 27 28 /** 29 * 2.讀取多個字元 30 */ 31 @Test 32 public void test2() throws Exception { 33 File file = new File("f1.txt"); 34 FileInputStream fileInputStream = new FileInputStream(file); 35 36 byte[] fs = new byte[(int) file.length()]; 37 while (fileInputStream.read(fs) != -1){ 38 System.out.println(new String(fs)); 39 for (byte b: fs){ 40 System.out.print((char) b); 41 } 42 } 43 44 fileInputStream.close(); 45 } 46 47 48 /** 49 * 3.輸出流,會覆蓋 50 * @throws IOException 51 */ 52 @Test 53 public void test3() throws IOException { 54 File file = new File("f1.txt"); 55 56 FileOutputStream fileOutputStream = new FileOutputStream(file); 57 58 String str = "你好,世界!"; 59 60 //獲取字元串數組對象 61 byte[] bytes = str.getBytes(); 62 63 fileOutputStream.write(bytes); 64 fileOutputStream.flush(); 65 fileOutputStream.close(); 66 } 67 68 /** 69 * 4.字元流輸入 70 */ 71 @Test 72 public void test4() throws IOException { 73 FileReader fileReader = new FileReader("f1.txt"); 74 75 boolean f = true; 76 while(f){ 77 78 int read = fileReader.read(); 79 System.out.print((char) read); 80 if (read == -1){ 81 f = false; 82 } 83 } 84 } 85 86 87 /** 88 * 5.字元流輸出 89 */ 90 @Test 91 public void test5() throws IOException { 92 FileWriter fileWriter = new FileWriter("f1.txt"); 93 94 fileWriter.write("方便的輸出"); 95 96 fileWriter.close(); 97 } 98 99 100 /** 101 * 6.位元組流轉字元流 102 */ 103 @Test 104 public void test6() throws IOException { 105 FileInputStream inputStream = new FileInputStream("f1.txt"); 106 InputStreamReader reader = new InputStreamReader(inputStream, "utf-8"); 107 108 boolean f = true; 109 while (f){ 110 int i = reader.read(); 111 System.out.print((char) i); 112 if (i == -1){ 113 f = false; 114 } 115 } 116 } 117 }
3、位元組流和字元流的區別
①操作的單位不一樣,一個是位元組,一個是字元;
②操作中文使用字元流很爽;
③字元流的輸出流可以直接寫一個字元串 write(String msg);
④執行流程:
位元組輸出流 --》程式 --》文件
字元輸出流 --》程式 --》緩存 ---》文件
測試:
A:位元組流調用了寫數據的方法之後如果沒有關閉,還是會把數據寫到文件;
B:字元流調用了寫數據的方法之後如果沒有關閉,不會把數據寫到文件;