Java IO流及應用(一)
IO流
- IO流概述及FileWriter類的使用
- FileReader類使用
- 緩衝流介紹和使用
- IO流相關案例
NO.one IO流概述及FileWriter類使用
1.1 IO流概述及分類
IO流用來處理裝置之間的資料傳輸
Java對資料的操作是通過流的方式
Java用於操作流的類都在IO包中
流按流向分為兩種:輸入流,輸出流
1.2 FileWriter類使用
A:開啟幫助文件
B:點選顯示,找到索引,看到輸入框
C:你要學習什麼內容,你就在框框裡面輸入什麼內容
舉例:Random
D:看包
java.lang包下的類在使用的時候是不需要導包的
E:看類的描述
Random類是用於生成隨機數的類
F:看構造方法
Random():無參構造方法
Random r = new Random();
G:看成員方法
public int nextInt(int n):產生的是一個[0,n)範圍內的隨機數
呼叫方法:
看返回值型別:人家返回什麼型別,你就用什麼型別接收
看方法名:名字不要寫錯了
看形式引數:人家要幾個引數,你就給幾個,人家要什麼資料型別的,
你就給什麼資料型別的
int number = r.nextInt(100);
1.2.1 FileWriter向檔案中寫資料
A:FileWriter向檔案中寫資料操作步驟:
a:使用FileWriter流關聯檔案
b:利用FileWriter的寫方法寫資料
c:利用FileWriter的重新整理方法將資料從記憶體刷到硬碟上
d:利用FileWriter的關流方法將釋放佔用的系統底層資源
B:FileWriter方法:
構造方法
FileWriter(String fileName) 傳入一個檔案的路徑
成員方法
void write(String str) 向檔案中寫str
void flush() 將記憶體中的資料重新整理到檔案中
void close() 關流釋放系統底層資源
1.2.1.1 案例程式碼一:
package com.gao_01; import java.io.FileWriter; import java.io.IOException; /* * 需求:往檔案中寫資料 * 寫資料--輸出流--FileWriter * * FileWriter: * FileWriter(String fileName):傳遞一個檔名稱 * * 輸出流寫資料的步驟: * A:建立輸出流物件 * B:呼叫輸出流物件的寫資料的方法 * C:釋放資源 */ public class FileWriterDemo { public static void main(String[] args) throws IOException { //建立輸出流物件 FileWriter fw = new FileWriter("d:\\a.txt"); /* * 建立輸出流物件做了哪些事情: * A:呼叫系統資源建立了一個檔案 * B:建立輸出流物件 * C:把輸出流物件指向檔案 */ //呼叫輸出流物件的寫資料的方法 //寫一個字串資料 fw.write("IO流你好"); //資料沒有直接寫到檔案,其實是寫到了記憶體緩衝區 fw.flush(); //釋放資源 //通知系統釋放和該檔案相關的資源 fw.close(); //while(true) {} } }
1.2.2 FileWriter 注意事項
1.2.2.1 案例程式碼二:
package com.gao_01; import java.io.FileWriter; import java.io.IOException; /* * 輸出流寫資料的步驟: * A:建立輸出流物件 * B:呼叫輸出流物件的寫資料方法,並重新整理緩衝區 * C:釋放資源 * * 相對路徑:相對當前專案而言的,在專案的根目錄下(a.txt) * 絕對路徑:以碟符開始的路徑(d:\\a.txt) * * close()和flush()方法的區別: * flush():重新整理緩衝區。流物件還可以繼續使用。 * close():先重新整理緩衝區,然後通知系統釋放資源。流物件不可以再被使用了。 */ public class FileWriterDemo2 { public static void main(String[] args) throws IOException { //建立輸出流物件 //FileWriter fw = new FileWriter("d:\\a.txt"); FileWriter fw = new FileWriter("a.txt"); //呼叫輸出流物件的寫資料方法,並重新整理緩衝區 fw.write("helloworld"); fw.flush(); fw.write("java"); fw.flush(); //釋放資源 fw.close(); //Stream closed //fw.write("javaee"); //fw.flush(); } }
1.2.3 FileWriter 其他寫方法
void write(String str):寫一個字串資料
void write(String str,int index,int len):寫一個字串中的一部分資料
void write(int ch):寫一個字元資料,這裡寫int型別的好處是既可以寫char型別的資料,
也可以寫char對應的int型別的值。'a',97
void write(char[] chs):寫一個字元陣列資料
void write(char[] chs,int index,int len):寫一個字元陣列的一部分資料
1.2.3.1 案例程式碼三:
package com.gao_01; import java.io.FileWriter; import java.io.IOException; /* * void write(String str):寫一個字串資料 * void write(String str,int index,int len):寫一個字串中的一部分資料 * void write(int ch):寫一個字元資料,這裡寫int型別的好處是既可以寫char型別的資料,也可以寫char對應的int型別的值。'a',97 * void write(char[] chs):寫一個字元陣列資料 * void write(char[] chs,int index,int len):寫一個字元陣列的一部分資料 */ public class FileWriterDemo3 { public static void main(String[] args) throws IOException { //建立輸出流物件 FileWriter fw = new FileWriter("b.txt"); //void write(String str):寫一個字串資料 //fw.write("abcde"); //void write(String str,int index,int len):寫一個字串中的一部分資料 //fw.write("abcde",0,5); //fw.write("abcde",1,3); //void write(int ch):寫一個字元資料,這裡寫int型別的好處是既可以寫char型別的資料,也可以寫char對應的int型別的值。'a',97 //fw.write('a'); //fw.write(97); //void write(char[] chs):寫一個字元陣列資料 char[] chs = {'a','b','c','d','e'}; //fw.write(chs); //void write(char[] chs,int index,int len):寫一個字元陣列的一部分資料 //fw.write(chs,0,5); fw.write(chs,2,3); //釋放資源 fw.close(); } }
1.2.4 FileWriter 寫入換行以及向文字末尾追加
1.2.4.1 案例程式碼四:
package com.gao_01; import java.io.FileWriter; import java.io.IOException; /* * 如何實現資料的換行? * \n可以實現換行,但是windows系統自帶的記事本開啟並沒有換行,這是為什麼呢?因為windows識別的換行不是\n,而是\r\n * windows:\r\n * linux:\n * mac:\r * 如何實現資料的追加寫入? * FileWriter(String fileName, boolean append) */ public class FileWriterDemo4 { public static void main(String[] args) throws IOException { //建立輸出流物件 //FileWriter fw = new FileWriter("c.txt"); FileWriter fw = new FileWriter("c.txt",true); //表示追加寫入,預設是false for(int x=0; x<10; x++) { fw.write("hello"+x); fw.write("\r\n"); } //釋放資源 fw.close(); } }
NO.two FileReader類使用
2.1 FileReader 讀資料一次讀取一個字元
2.1.1 案例程式碼五:
package com.gao_02; import java.io.FileReader; import java.io.IOException; /* * 需求:從檔案中讀資料並顯示到控制檯 * 讀資料--輸入流--FileReader * * FileReader: * FileReader(String fileName):傳遞檔名稱 * * 輸入流讀檔案的步驟: * A:建立輸入流物件 * B:呼叫輸入流物件的讀資料方法 * C:釋放資源 * * java.io.FileNotFoundException: fr.txt (系統找不到指定的檔案。) */ public class FileReaderDemo { public static void main(String[] args) throws IOException { //建立輸入流物件 // FileReader fr = new FileReader("fr.txt"); FileReader fr = new FileReader("FileWriterDemo.java"); //呼叫輸入流物件的讀資料方法 //int read():一次讀取一個字元 /* //第一次讀資料 int ch = fr.read(); System.out.println(ch); System.out.println((char)ch); //第二次讀資料 ch = fr.read(); System.out.println(ch); System.out.println((char)ch); //第三次讀資料 ch = fr.read(); System.out.println(ch); System.out.println((char)ch); //這是時候,我們發現程式碼的重複度很高,想用迴圈改進,但是不知道迴圈的結束條件是什麼 ch = fr.read(); System.out.println(ch); ch = fr.read(); System.out.println(ch); //通過測試,我們知道,如果讀取資料的返回值是-1的時候,就說明沒有資料了,這也是我們迴圈的結束條件 */ int ch; //1:fr.read() //2:ch=fr.read() //3:ch != -1 while((ch=fr.read())!=-1) { //System.out.println(ch); //System.out.println((char)ch); System.out.print((char)ch); } //釋放資源 fr.close(); } }
2.2 利用FileReader 和 FileWriter完成檔案複製
2.2.1 讀一次寫一次
2.2.1.1 案例程式碼六:
package com.gao_03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求: * 把專案路徑下的FileWriterDemo.java中的內容複製到專案路徑下的Copy.java中 * * 檔案複製也是有規律可循的,也就是說有套路。 * * 資料來源: * FileWriterDemo.java -- 讀資料 -- FileReader * 目的地: * Copy.java -- 寫資料 -- FileWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { //建立輸入流物件 FileReader fr = new FileReader("FileWriterDemo.java"); //建立輸出流物件 FileWriter fw = new FileWriter("Copy.java"); //讀寫資料 int ch; while((ch=fr.read())!=-1) { fw.write(ch); } //釋放資源 fw.close(); fr.close(); } }
2.2.2 利用字元陣列拷貝檔案
2.2.2.1 案例程式碼七:
package com.gao_03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求: * 把專案路徑下的FileWriterDemo.java中的內容複製到專案路徑下的Copy.java中 * * 資料來源: * FileWriterDemo.java -- 讀資料 -- FileReader * 目的地: * Copy.java -- 寫資料 -- FileWriter */ public class CopyFileDemo2 { public static void main(String[] args) throws IOException { //建立輸入流物件 FileReader fr = new FileReader("FileWriterDemo.java"); //建立輸出流物件 FileWriter fw = new FileWriter("Copy.java"); //讀寫資料 char[] chs = new char[1024]; int len; while((len=fr.read(chs))!=-1) { fw.write(chs, 0, len); } //釋放資源 fw.close(); fr.close(); } }
2.2.3 拷貝檔案的兩種方式圖解
NO.three 緩衝流介紹和使用
3.1 緩衝流的基本使用
3.1.1 案例程式碼八:
package com.gao_04; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /* * BufferedWriter:將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。 * BufferedReader:從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。 */ public class BufferedStreamDemo { public static void main(String[] args) throws IOException { //建立輸出緩衝流物件 /* BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); bw.write("hello"); //bw.flush(); bw.close(); */ //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java")); /* //一次讀寫一個字元 int ch; while((ch=br.read())!=-1){ System.out.print((char)ch); } */ //一次讀寫一個字元陣列 char[] chs = new char[1024]; int len; while((len=br.read(chs))!=-1) { System.out.print(new String(chs,0,len)); } //釋放資源 br.close(); } }
3.2 緩衝流複製文字檔案的兩種方式
利用緩衝流把專案路徑下的FileWriterDemo.java中的內容複製到專案路徑下的Copy.java中
第一種方式:使用緩衝流不使用字元陣列
第二種方式:使用緩衝流使用字元陣列
3.2.1 案例程式碼九:
package com.gao_04; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求: * 把專案路徑下的FileWriterDemo.java中的內容複製到專案路徑下的Copy.java中 * * 資料來源: * FileWriterDemo.java -- 讀資料 -- FileReader -- 高效的讀資料 -- BufferedReader * 目的地: * Copy.java -- 寫資料 -- FileWriter -- 高效的寫資料 -- BufferedWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java")); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); //讀寫資料 /* //一次讀寫一個字元 int ch; while((ch=br.read())!=-1) { bw.write(ch); } */ //一次讀寫一個字元陣列 char[] chs = new char[1024]; int len; while((len=br.read(chs))!=-1) { bw.write(chs,0,len); } //釋放資源 bw.close(); br.close(); } }
3.3 緩衝流的特有方法使用
BufferedWriter
void newLine():寫一個換行符,這個換行符由系統決定,不同的作業系統newLine()方法使用的換行符不同
windows: \r\n
linux: \n
mac: \r
BufferedReader
String readLine():一次讀取一行資料,但是不讀取換行符
3.3.1 案例程式碼十:
package com.gao_05; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /* * 緩衝流的特殊功能: * BufferedWriter * void newLine():寫一個換行符,這個換行符由系統決定 * BufferedReader * String readLine():一次讀取一行資料,但是不讀取換行符 */ public class BufferedStreamDemo { public static void main(String[] args) throws IOException { /* BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt")); for(int x=0; x<10; x++) { bw.write("hello"+x); //bw.write("\r\n"); bw.newLine(); bw.flush(); } bw.close(); */ BufferedReader br = new BufferedReader(new FileReader("br.txt")); /* String line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); line = br.readLine(); System.out.println(line); */ String line; //1:br.readLine() //2:line=br.readLine() //3:line != null while((line=br.readLine())!=null) { System.out.println(line); } br.close(); } }
3.4 緩衝流的特有方法複製檔案
3.4 案例程式碼十一:
package com.gao_05; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 需求: * 把專案路徑下的FileWriterDemo.java中的內容複製到專案路徑下的Copy.java中 * * 資料來源: * FileWriterDemo.java -- 讀資料 -- FileReader -- 高效的讀資料 -- BufferedReader * 目的地: * Copy.java -- 寫資料 -- FileWriter -- 高效的寫資料 -- BufferedWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java")); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); //讀寫資料 String line; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); bw.flush(); } //釋放資源 bw.close(); br.close(); } }
NO.four IO流相關案例
4.1 複製文字檔案的5中方式
A:利用基本流一次讀寫一個字元
B:利用基本流一次讀寫一個字元陣列
C:利用緩衝流一次讀寫一個字元
D:利用緩衝流一次讀寫一個字元陣列
E:利用緩衝流的特有方法一次讀寫一個字串
4.1.1 案例程式碼十二:
package com.gao_06; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 複製文字檔案(5種方式) * * 資料來源: * FileWriterDemo.java * 目的地: * Copy.java */ public class CopyFileTest { public static void main(String[] args) throws IOException { /* method1("FileWriterDemo.java","Copy.java"); method2("FileWriterDemo.java","Copy.java"); method3("FileWriterDemo.java","Copy.java"); method4("FileWriterDemo.java","Copy.java"); method5("FileWriterDemo.java","Copy.java"); */ String srcFileName = "FileWriterDemo.java"; String destFileName = "Copy.java"; // method1(srcFileName,destFileName); // method2(srcFileName,destFileName); method3(srcFileName,destFileName); // method4(srcFileName,destFileName); // method5(srcFileName,destFileName); } //緩衝流一次讀寫一個字串 public static void method5(String srcFileName,String destFileName) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); //一次讀寫一個字串 String line; while((line=br.readLine())!=null){ bw.write(line); bw.newLine(); bw.flush(); } //釋放資源 bw.close(); br.close(); } //緩衝流一次讀寫一個字元陣列 public static void method4(String srcFileName,String destFileName) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); //一次讀寫一個字元陣列 char[] chs = new char[1024]; int len; while((len=br.read(chs))!=-1) { bw.write(chs,0,len); } //釋放資源 bw.close(); br.close(); } //緩衝流一次讀寫一個字元 public static void method3(String srcFileName,String destFileName) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); //一次讀寫一個字元 int ch; while((ch=br.read())!=-1) { bw.write(ch); } //釋放資源 bw.close(); br.close(); } //基本流一次讀寫一個字元陣列 public static void method2(String srcFileName,String destFileName) throws IOException { //建立輸入流物件 FileReader fr = new FileReader(srcFileName); //建立輸出流物件 FileWriter fw = new FileWriter(destFileName); //一次讀寫一個字元陣列 char[] chs = new char[1024]; int len; while((len=fr.read(chs))!=-1) { fw.write(chs,0,len); } //釋放資源 fw.close(); fr.close(); } //基本流一次讀寫一個字元 public static void method1(String srcFileName,String destFileName) throws IOException { //建立輸入流物件 FileReader fr = new FileReader(srcFileName); //建立輸出流物件 FileWriter fw = new FileWriter(destFileName); //一次讀寫一個字元 int ch; while((ch=fr.read())!=-1) { fw.write(ch); } //釋放資源 fw.close(); fr.close(); } }
4.2 把集合中的資料寫到文字檔案
把ArrayList集合中的字串資料儲存到文字檔案專案根目下的array.txt中
每一個字串元素作為檔案中的一行資料
4.2.1 案例程式碼十三:
package com.gao_06; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; /* * 把ArrayList集合中的字串資料儲存到文字檔案 * 每一個字串元素作為檔案中的一行資料 * * 分析: * A:建立集合物件 * B:往集合中新增字串元素 * C:建立輸出緩衝流物件 * D:遍歷集合,得到每一個字串元素,然後把該字串元素作為資料寫到文字檔案 * E:釋放資源 */ public class ArrayListToFileTest { public static void main(String[] args) throws IOException { //建立集合物件 ArrayList<String> array = new ArrayList<String>(); //往集合中新增字串元素 array.add("hello"); array.add("world"); array.add("java"); //建立輸出緩衝流物件 BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt")); //遍歷集合,得到每一個字串元素,然後把該字串元素作為資料寫到文字檔案 for(int x=0; x<array.size(); x++) { String s = array.get(x); bw.write(s); bw.newLine(); bw.flush(); } //釋放資源 bw.close(); } }
4.3 把文字檔案中的資料讀取到集合
從專案根目錄下的array.txt文字檔案中讀取資料到ArrayList集合中,並遍歷集合,每一行資料作為一個字串元素
4.3.1 案例程式碼十四:
package com.gao_06; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; /* * 從文字檔案中讀取資料到ArrayList集合中,並遍歷集合 * 每一行資料作為一個字串元素 * * 分析: * A:建立輸入緩衝流物件 * B:建立集合物件 * C:讀取資料,每次讀取一行資料,把該行資料作為一個元素儲存到集合中 * D:釋放資源 * E:遍歷集合 */ public class FileToArrayListTest { public static void main(String[] args) throws IOException { //建立輸入緩衝流物件 BufferedReader br = new BufferedReader(new FileReader("array.txt")); //建立集合物件 ArrayList<String> array = new ArrayList<String>(); //讀取資料,每次讀取一行資料,把該行資料作為一個元素儲存到集合中 String line; while((line=br.readLine())!=null) { array.add(line); } //釋放資源 br.close(); //遍歷集合 for(int x=0; x<array.size(); x++) { String s = array.get(x); System.out.println(s); } } }