第十二章大綱:
I/O input/output 輸入/輸出
一、創建文件,借助File類來實現
file.createNewFile() : 創建文件
file.exists() : 判斷文件是否存在,如果存在,則返回true
delete() : 刪除文件,如果刪除成功,則返回true
deleteOnExit() : 程序退出的時候才刪除文件
1 import java.io.File; 2 import java.io.IOException; 3 4 public class FileDemo { 5 6 public static void main(String[] args) throws IOException { 7 File file = new File("D:\\123.txt"); 8 //判斷文件是否存在 9 if(!file.exists()){ 10 //文件不存在,創建該文件 11 file.createNewFile(); 12 } 13 14 } 15 }
二、創建文件夾
exists() : 判斷文件夾是否存在,如果存在,則返回true
delete() : 刪除文件夾,如果刪除成功,則返回true
mkdir() : 創建文件夾
mkdirs() : 創建嵌套的文件夾
1 import java.io.File; 2 import java.io.IOException; 3 4 public class FileDemo { 5 6 public static void main(String[] args) throws IOException { 7 File file = new File("D:\\test"); 8 //判斷文件是否存在 9 if(!file.exists()){ 10 //文件不存在,創建該文件 11 file.mkdir(); 12 } 13 14 //多個文件夾嵌套時,使用mkdirs()方法創建文件 15 File file2 = new File("D:\\test2\\demo"); 16 //判斷文件是否存在 17 if(!file2.exists()){ 18 //文件不存在,創建該文件 19 file2.mkdirs(); 20 } 21 22 } 23 }
三、
輸入還是輸出參照物是內存。我們的程序是在內存運行的
輸入:d:\\720.txt--->內存
輸出:內存---->f:\\721.txt
字節流和字符流,都可以實現文本的輸入輸出,區別是讀寫單位(速度)不一樣
字節流:每次讀寫一個字節 1Byte=8bit 2^8-1 可以表示255個字符
字符流:每次讀寫一個字符 1字符=2字節 常見漢字5000多 2^16
節點流和過濾流都是對字節流和字符流做了封裝,好處是讀寫速度更快。
1.字節流: FileInputStream 和 FileOutputStream
FileInputStream
read() :每次都一個字節,返回值是int,如果讀到頭,返回值是-1 想要讀完文本中的數據,要用循環
available() :返回可讀的字節數,返回值是int
close() :關閉輸入流,釋放資源
FileOutputStream
write() :向指定文件寫數據
close() :關閉輸出流
把720.txt文本中的內容輸入到721.txt文本中去
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 /** 8 * 字節流演示 9 * @author Administrator 10 * 11 */ 12 public class FileInputDemo { 13 14 public static void main(String[] args) throws IOException { 15 16 //打開字節輸入流 17 FileInputStream fis = new FileInputStream(new File("D:\\720.txt")); 18 //打開字節輸出流 19 FileOutputStream fos = new FileOutputStream(new File("D:\\721.txt")); 20 //獲取字節長度 21 int length = fis.available(); 22 for(int i =0 ; i < length ; i++){ 23 //把從720.txt讀取的字節輸出到721.txt中 24 fos.write(fis.read()); 25 } 26 27 //關閉輸入輸出流 28 fis.close(); 29 fos.close(); 30 31 } 32 33 }
2.字符流 :FileReader FileWriter
FileReader
read() : 讀 參數可以是char數組,存放讀到內存中的數據
close() : 關閉資源
FileWriter
write() :寫 參數可以是char數組,也可以是String
close() : 關閉資源
1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 7 public class FileReaderDemo { 8 9 public static void main(String[] args) throws IOException { 10 11 FileReader fr = new FileReader(new File("D:\\720.txt")); 12 FileWriter fw = new FileWriter(new File("D:\\721.txt")); 13 char[] ch = new char[1024]; 14 int i=0; 15 String s=""; 16 while((i=fr.read())!=-1){ 17 //把int類型的 i ,強轉為char類型 18 s=s+(char)i; 19 } 20 21 //把取出的內容寫入到721.txt中 22 fw.write(s); 23 fr.close(); 24 fw.close(); 25 } 26 27 }
從流向分
輸入流 FileInputStream FileReader
輸出流 FileOutputStream FileWriter
從讀寫單位
字節流 FileInputStream FileOutputStream
字符流 FileReader FileWriter
補充: 過濾流:給節點流做封裝,提供緩沖區,讀寫速度會更快
BufferedReader
readLine() :每次讀取一行
BufferedWriter
write() :寫
newLine() :換行
1 import java.io.*; 2 public class BufferedDemo { 3 4 public static void main(String[] args) throws IOException { 5 BufferedReader bfr = new BufferedReader(new FileReader(new File("D:\\720.txt"))); 6 BufferedWriter bfw = new BufferedWriter(new FileWriter(new File("D:\\721.txt"))); 7 //每次讀取一行 8 String str = bfr.readLine(); 9 String ss = str; 10 while(str!=null){ 11 System.out.println(str); 12 str = bfr.readLine(); 13 14 //每拼接一次要換行,換行符也可以寫成 15 //ss= ss+System.getProperty("line.separator")+str; 16 ss = ss + "\r\n" + str; 17 } 18 bfw.write(ss); 19 bfr.close(); 20 bfw.close(); 21 22 } 23 24 }
補充:序列化(Serializable)和反序列化 讀寫對象 讀對象就是反序列化 寫對象就是序列化
一個對象想要被序列化,必須實現一個接口:Serializable
ObjectOutputStream
writeObject(obj) :把對象obj作為整體以二進制流的形式寫到指定文本中
ObjectInputStream
readObject() :把文本中的二進制對象讀入內存
問: 當我們要保存多個對象的時候怎么辦?可以多次調用writeObject()實現寫,但是讀的時候就麻煩了,我們可以把對象放到一個數組中,對數組執行序列化和反序列化操作
1 import java.io.Serializable; 2 /** 3 * 創建一個學生類,實現Serializable接口 4 * @author Administrator 5 * 6 */ 7 public class Student implements Serializable{ 8 9 public String name; 10 public String sex; 11 12 }
如果學生類沒有實現Serializable接口,會報錯java.io.NotSerializableException
對學生對象序列化后,會在磁盤中保存一個二進制文件
1 import java.io.*; 2 3 /** 4 * 序列化類 5 * @author Administrator 6 * 7 */ 8 public class XuLieDemo { 9 10 public static void main(String[] args) throws IOException { 11 12 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:\\123.txt"))); 13 //聲明一個學生類型是數組,把實例化的學生對象存入數組中 14 Student[] stu = {new Student("張三","男"),new Student("麗麗","女")}; 15 //對學生類型的數組序列化 16 oos.writeObject(stu); 17 oos.close(); 18 19 } 20 21 }
反序列化操作
1 import java.io.*; 2 3 /** 4 * 反序列化類 5 * @author Administrator 6 * 7 */ 8 public class FanXuLieDemo { 9 10 public static void main(String[] args) throws IOException, ClassNotFoundException { 11 12 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:\\123.txt"))); 13 Student[] stu = (Student[]) ois.readObject(); 14 for (Student student : stu) { 15 System.out.println(student.name+" "+student.sex); 16 } 17 ois.close(); 18 19 } 20 21 }