java基礎——IO
阿新 • • 發佈:2020-07-19
IO流
在 Java IO 中,流是一個核心的概念。流表示的是連續的資料,稱之為資料流。我們既可以讀取流中的資料,也可向流中寫入資料。在 Java IO 中,根據讀寫資料的型別不同,可以將流分為兩種型別:位元組流(按位元組讀取資料),字元流(按字元讀取資料)。
java.io 包提供了操作流的類,而這些類的頂層父類如下(輸入和輸出是相對於 JVM 來說的):
位元組流 | 字元流 | |
---|---|---|
輸入流 | InputStream | Reader |
輸出流 | OutputStream | Writer |
位元組流
計算機中的檔案都是以位元組的形式進行儲存。
位元組輸出流——OutputStream
以上就是 OutputStream 類的所有方法。OutputStream 只是提供了一些共用的方法,其直接子類共有六個。
FileOutputStream
該類是向磁碟檔案中寫入資料。以下是其構造方法和一般方法。
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file= new File("D:\\javaTest\\IO\\a.txt"); //建立一個輸出流物件, 引數是一個File物件, 路徑必須是實際存在的, 否則會報FileNotFoundException //如果路徑下的檔案不存在, 則會建立該檔案 FileOutputStream out = new FileOutputStream(file); //呼叫write()方法, 向檔案中寫入資料, 只能以位元組的方式寫入 out.write(97); //寫入檔案的是字母 a//關閉資料流, 釋放資源 out.close(); } }
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file = new File("D:\\javaTest\\IO\\a.txt"); //建立一個輸出流物件, 引數是一個File物件, 路徑必須是實際存在的, 否則會報FileNotFoundException //如果路徑下的檔案不存在, 則會建立該檔案 FileOutputStream out = new FileOutputStream(file); //寫入資料會先轉換為ASII碼, 然後在根據ASII碼寫入資料 //呼叫write(Byte byte)方法, 向檔案中寫入資料, 以單個位元組的方式寫入 out.write(97); //寫入檔案的是字母 a //呼叫write(Byte []byte)方法, 向檔案中寫入資料, 以位元組陣列的方式寫入 //如果某個位元組是負數,那該位元組就會與後一個位元組一起以GBK編碼格式顯示字元 byte[] bytes = {-47, 64, -65, -66}; out.write(bytes); //寫入的是 袬烤 //如果想寫入一個字串, 可以使用String類中的getBytes(); String str = "向檔案中寫入字串"; out.write(str.getBytes()); //關閉資料流, 釋放資源 out.close(); } }
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { File file = new File("D:\\javaTest\\IO\\a.txt"); //通過建構函式 FileOutputStream(File file, boolean append)向檔案中續寫資料,不會覆蓋 //append為true表示續寫, 為false會建立一個新檔案覆蓋原檔案 FileOutputStream out = new FileOutputStream(file, true); out.write("可以".getBytes()); out.write("向檔案".getBytes()); out.write("中".getBytes()); out.write("\r".getBytes()); //換行 out.write("續寫資料".getBytes()); //關閉資料流, 釋放資源 out.close(); } }
位元組輸入流——InputStream
FileInputStream
import java.io.FileInputStream; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileInputStream in = new FileInputStream("D:\\javaTest\\IO\\a.txt"); int len1 = 0; while((len1 = in.read()) != -1) { //read()每次只能讀入一個位元組, 方法呼叫一次指標就後移一位 System.out.println(len1); } byte[] bytes = new byte[2]; int len2 = 0; while((len2 = in.read(bytes)) != -1) { //read(byte []bytes), 每次最多讀取byte陣列的長度個位元組 System.out.println(new String(bytes, 0, len2)); //讀取byte陣列中有效的位元組個數,以免出現空格或陣列之前的內容 } //關閉資料流, 釋放資源 in.close(); } }
字元流
字元流與包括讀(Reader)和寫(Writer),每次讀或寫一個字元。使用方式和位元組流一樣,只需要把 InputStream 和 OutputStream 替換成 Reader 和 Writer。
字元輸入流——Reader
import java.io.FileReader; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileReader reader = new FileReader("D:\\javaTest\\IO\\a.txt"); int len1 = 0; while((len1 = reader.read()) != -1) { //read()每次只能讀入一個位元組, 方法呼叫一次指標就後移一位 System.out.print((char)len1); } char[] c = new char[2]; int len2 = 0; while((len2 = reader.read(c)) != -1) { //read(byte []bytes), 每次最多讀取byte陣列的長度個位元組 System.out.print(new String(c, 0, len2)); //讀取byte陣列中有效的位元組個數,以免出現空格或陣列之前的內容 } //關閉資料流, 釋放資源 reader.close(); } }
字元輸出流
import java.io.FileWriter; import java.io.IOException; public class IOTest { public static void main(String[] args) throws IOException { FileWriter writer = new FileWriter("D:\\javaTest\\IO\\a.txt", true); writer.write("字元寫入檔案"); writer.flush(); //寫完資料必須重新整理回硬碟 char[] c = {'可', '以', '通', '過', '數', '組' }; writer.write(c); writer.flush(); //關閉資料流, 釋放資源 writer.close(); //flush()和close()都可以把緩衝重新整理回記憶體, 但是flush()使用後還可以繼續使用流, 而close則已經關閉了流 } }