java學習筆記--IO流


第十二章大綱:
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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM