Java入門需要了解(IO-三十五)
阿新 • • 發佈:2021-01-16
技術標籤:java學習分享記錄javajavase程式語言stream
IO目錄
IO概述
什麼是IO
IO 就是 Input 和 Output 的首寫字母,輸入輸出。
這裡的輸入輸出,是以記憶體為中心來定義的,讀取資料到記憶體中,叫輸入。
如果讀取記憶體中的資料到其他裝置,叫輸出。
IO的作用
IO 流用來處理裝置之間的資料傳輸
什麼是裝置
儲存資料的介質,如硬碟,U盤,光碟,記憶體,快取,印表機等都是裝置。
IO流
IO流,是一種資料傳輸時的形象描述,像水一樣流動。
輸入流,InputStream,是讀取資料到記憶體,從根本上講是讀取資料的動作。
輸出流,OutputStream,是從記憶體中寫資料到裝置,從根本上講是寫資料的動作。
流按操作資料分類
- 位元組流:處理位元組的流。(能處理所有的資料)
- 字元流:處理字元的流。(位元組流讀取資料後,不直接操作,而是先查詢指定的編碼表,以獲取編碼表對於的文字,即:位元組流+編碼)
IO流的頂層基類
位元組流頂層基類
InputStream
OnputStream
字元流頂層基類Reader、Writer
如果是處理文字資料,優先考慮字元流
FileReader讀取一個文字檔案
用來讀取字元檔案的便捷類
讀取檔案內容,並且列印到控制檯上!
/**
* 1.建立讀取字元資料的流物件
* 建立讀取流物件時,必須要明確被讀取的檔案,要確定該檔案是存在的
* 用一個讀取流關聯一個已經存在的檔案
*/
public static void readTxtFile() {
FileReader fileReader = null;
try {
fileReader = new FileReader("demo.txt");
do {
int ch = fileReader.read();
if (ch < 0) {
break;
}
System.out.println("ch = " + ch);
} while (true);
fileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
FileReader讀取一個文字檔案2
/**
* 讀取一組字元到指定的字元陣列中
*/
public static void readTxtFile2() {
FileReader fileReader = null;
try {
fileReader = new FileReader("demo.txt");
//定義每次讀取的字元陣列長度建議為1024的整數倍
char[] chars = new char[10];
do {
//讀取字元到字元陣列中,並返回每次讀取的長度
int charNum = fileReader.read(chars);
if (charNum < 0) {
break;
}
//將讀取的字元陣列組合成字串列印到控制檯
System.out.print(new String(chars,0,charNum));
} while (true);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
結果:
檔案內容為:
1234567890
cde
輸出結果為:
1234567890
cde
FileWriter將字元寫入一個檔案
try {
//建立一個可以往檔案中寫入字元資料的字元輸出流物件。
//往檔案中寫入文字資料,那麼在物件建立時,就應該明確檔案
//如果檔案不存在,則會自動建立
//如果檔案存在,則會被覆蓋。
FileWriter fileWriter = new FileWriter("demo.txt");
//呼叫FileWriter物件中的writer方法
/**
* 呼叫這個方法之後,資料寫入到臨時緩衝區中
*
*/
fileWriter.write("abcde");
/**
* 對資料立即進行重新整理,將資料寫入到目的檔案中!
*/
// fileWriter.flush();
//在呼叫close時,先會呼叫重新整理
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
FileWriter追加檔案內容
使用構造方法:FileWriter(String fileName,boolean append)
try {
//對檔案進行繼續寫入
FileWriter fileWriter = new FileWriter("demo2.txt",true);
//獲取換行符,每種系統的換行符不一樣
//String lineStr = System.getProperty("line.separator");
fileWriter.write("eeee1");
// fileWriter.write("ab" + lineStr + "cde");
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
IO異常處理的最基本程式碼結構
public static void exceptionTest() {
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("L:/demo2.txt",true);
fileWriter.write("adbcd");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
throw new RuntimeException("");
}
}
}
}
複製文字檔案
這是一個讀取檔案和寫入檔案的綜合應用,這裡的檔案是在classPath路徑下,也可以指定絕對路徑
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 複製文字檔案測試(每次讀取一個字元和寫入一個字元)
*/
class CopyTxtFileTest {
public static void main(String[] args) {
copyTxtFile("demo.txt","demo_copy.txt");
}
public static void copyTxtFile(String sourceFile,String targetTxtFile) {
FileReader fileReader = null;
FileWriter fileWriter = null;
try {
fileReader = new FileReader(sourceFile);
fileWriter = new FileWriter(targetTxtFile);
do {
int ch = fileReader.read();
if (ch < 0) {
break;
}
fileWriter.write(ch);
} while (true);
//fileWriter.write(fileReader);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//關閉已經開啟的檔案
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
讀寫(IO)緩衝區 Buffer
緩衝區提高了對資料的讀寫效率;
緩衝區要結合流才有用;
緩衝區可以看做是流的增強套件。
BufferedReader
從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取
/**
* 通過緩衝區來讀取一個檔案
*/
public static void testBuffedRead() {
FileReader fileReader = null;
try {
fileReader = new FileReader("demo.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
//bufferedReader.readLine();
do {
String lineStr = bufferedReader.readLine();
if (lineStr == null) {
break;
}
System.out.println("lineStr = " + lineStr);
bufferedReader.close();
} while (true);
//fileReader.read();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedWriter
將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入
緩衝區必須有緩衝的物件,對於 BufferedWriter 他緩衝的物件是 Writer
public static void bufferWriter() {
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("bufferWriter.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write("bufferedWriter test");
//使用緩衝區去的重新整理把資料重新整理到目的檔案中
bufferedWriter.flush();
//關閉緩衝區時,也會關閉
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}