目錄
一、概述
二、File類
2.1作用
2.2構造方法
2.3常用方法
2.3.1創建方法
2.3.2判斷方法
2.3.3獲取方法
2.3.4洗掉方法
三、IO流
3.1分類
3.2位元組流
3.2.1位元組輸入流(InputStream)
3.2.2位元組輸出流(OutputStream)
3.3字符流
3.3.1字符輸入流(Reader)
FileReader類
FileReader讀取字符資料
3.3.2字符輸出流(Writer)
共性方法:
FileWriter類
案例:使用FileWiter和FileReader實作對文本檔案的復制
四、緩沖流
4.1位元組緩沖流
4.2字符緩沖流
總結:
一、概述
Hello,各位觀眾老爺,又到了每周的分享時間了,這周小的學習了Java中的IO流,在這里...算了不廢話了,直接開始!
IO流其實在我理解看來就分成三部分,即I、O、流,I即Input,輸入,O即Output,輸出,流是資料傳輸的總稱,
更通俗一點、把自己想成計算機的記憶體,以第一人稱去理解這個問題,比如人要看書對吧,那么把書中的知識讀取到自己的大腦(也就是記憶體)中這個操作就是輸入,這個操作類比到計算機中就是從硬碟上讀取資料到記憶體中,也就是IO流中的I(Input),
同理,我們有時候要寫博客對吧,那么寫博客這個操作是不是人把自己大腦(也就是記憶體)中想的東西寫到紙上,那這個操作類比到計算機上就是把記憶體中的資料寫到硬碟上,即IO流中的O(Output),
好了,上述是本人對IO流的一個最基本的理解,主要是助于快速理清Input和Output的區別,如果有錯誤的地方,請各位觀眾老爺指出,接下來正式進入IO流的探討了!
二、File類
在計算機中,對于資料的存盤都離不開檔案,IO流也是對檔案進行操作,所以我們先來探討File類,
2.1作用
File類是檔案和目錄名路徑的抽象表示形式,其封裝的并不是一個真正存在的檔案,而僅僅是一個路徑名,可以存在,也可以不存在,
2.2構造方法
| File(String pathName) | 根據字串路徑創建一個File物件 |
| File(String parent,String child) | 根據字串父級路徑和子級路徑創建File物件 |
| File(File parent,String child) | 根據File型別父級路徑和字串子級路徑創建File物件 |
2.3常用方法
2.3.1創建方法
| boolean createNewFile() | 創建一個新檔案 |
| boolean mkdir() | 創建單級檔案夾 |
| boolean mkdirs() | 創建多級檔案夾 |
2.3.2判斷方法
| boolean isDirectory() | 判斷是否是檔案夾 |
| boolean isFile() | 判斷是否是檔案 |
| boolean exists() | 判斷檔案是否存在 |
2.3.3獲取方法
| String getAbsolutePath() | 獲取絕對路徑 |
| String getPath() | 獲取構造方法中的路徑 |
| String getName() | 獲取檔案或檔案夾的名稱 |
| String[] list() | 獲取目錄下所有內容,回傳字串陣列 |
| File[] listFiles() | 獲取目錄下所有內容,回傳File物件陣列 |
這里要提兩個概念:相對路徑和絕對路徑 ,
相對路徑: 是一個簡化的路徑,不以根路徑為開頭,如:\\a.txt ,
絕對路徑:一個完整的路徑,以根路徑開頭,如:D:\\a.txt,
2.3.4洗掉方法
| boolean delete() | 洗掉檔案或檔案夾(檔案夾必須為空) |
注:當待洗掉檔案夾中還有檔案夾或者檔案時,是不能直接洗掉此檔案夾的,必須!!!把該檔案夾以下的檔案和檔案夾全部洗掉之后才能洗掉此檔案夾,
三、IO流
了解了File類時候,我們可以正式開始今天的探討內容IO流了,在前面本人對IO流作了一個大概的講述,下面我們來詳細探討!
3.1分類
按資料流向:輸入流和輸出流
輸入流:把資料從硬碟上讀取到記憶體中,
輸出流: 把資料從記憶體中寫出到硬碟上,
按資料型別:位元組流和字符流
位元組流:讀寫資料以位元組為單位的流,
字符流:讀寫資料以字符為單位的流,
在實際應用中,檔案的上傳下載以及傳輸是比較常見的,
以下兩張圖概括性的描述了位元組流和字符流:
位元組流:

字符流:

看完這兩張圖之后,我們接著再來分別對位元組流和字符流進行探討,
3.2位元組流
3.2.1位元組輸入流(InputStream)
InputStream:這個抽象類是表示位元組輸入流的所有類的超類,
位元組輸入流的共性方法;
| void close() | 關閉此流并釋放與此流相關的資源, |
| abstract int read() | 從輸入流讀取一個字符, |
| int read(byte[] b) | 該方法回傳的int值代表的是讀取了多少個位元組,讀到幾個回傳幾個,讀取不到回傳-1 |
FileInputStream
檔案輸入流,讀取的是位元組,
構造方法:
| FileInputStream(File file) | 通過打開與實際檔案的連接來創建一個 FileInputStream ,該檔案由檔案系統中的 File物件 file命名, |
| FileInputStream(String name) | 通過打開與實際檔案的連接來創建一個FileInputStream ,該檔案由檔案系統中的路徑名name命名, |
FileInputStreram讀取位元組資料
1.一次讀一個字符資料

2.一次讀一個位元組陣列的資料

提問:如何實作圖片的復制呢?
3.2.2位元組輸出流(OutputStream)
位元組輸出流,將資料以位元組形式寫到檔案中,
構造方法:
| public FileOutputStream(File file) | 以File物件為引數創建物件 |
| public FileOutputStream(String name) | 以字串名稱為引數創建物件 |
OutputStream寫資料:
| write(int b) | 一次寫一個位元組資料 |
| write(byte[] arr) | 一次寫一個位元組陣列 |
| write(byte[] arr,int index,int len) | 寫位元組陣列的一部分 |
看到這里,我們就可以解決剛才的提問了,
現在我們再次把目光轉回剛才的問題:如何實作文本檔案的復制,對了,我們可以先創建FileInputStream物件先讀取需要復制的文本檔案,再創建FileOutputStream物件關聯需要寫出的檔案,通過回圈進行讀和寫的操作,最后釋放資源,
步驟:
??????? ???????
具體代碼:
public class FosTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\mytemp\\mn.jpg");
//創建位元組輸入流物件,關聯檔案.這里的檔案為自己需要復制檔案的路徑
FileOutputStream fos = new FileOutputStream("path08\\mytemp\\mn.jpg");
//創建位元組輸出流物件,關聯檔案
//回圈讀寫操作
int len;
byte[] bys = new byte[1024];
while ((len = fis.read(bys))!=-1){
fos.write(bys,0,len);
}
//釋放資源
fis.close();
fos.close();
}
}
兩個問題:
??????? ??????? ??????? 
3.3字符流
3.3.1字符輸入流(Reader)
讀取字符資訊到記憶體中,
字符輸入流的共性方法:
| public void close() | 關閉此流并釋放與此流相關聯的任何系統資源, |
| int read() | 從輸入流讀取一個字符, |
| int read(char[] cbuf) | 從輸入流中讀取一些字符,并將它們存盤到字符陣列cbuf中 |
FileReader類
構造方法:
| FileReader(File file) | 創建一個新的 FileReader ,給定要讀取的File物件, |
| FileReader(String fileName) | 創建一個新的 FileReader ,給定要讀取的檔案的字串名稱, |
FileReader讀取字符資料

3.3.2字符輸出流(Writer)
將指定的字符資料寫到檔案中,
共性方法:
| Write(int b) | 寫一個字符 |
| write(char[] c) | 寫一個字符陣列 |
| write(char[] c,int off,int len) | 寫一個字符陣列的一部分 |
| write(String s) | 寫一個字串 |
| write(String s,int off,int len) | 寫一個字串的一部分· |
| flush() | 重繪該流的緩沖 |
| close() | 釋放資源,先重繪 |
FileWriter類
構造方法:
| FileWriter(File file) | 創建一個新的 FileWriter,給定要讀取的File物件, |
| FileWriter(String fileName) | 創建一個新的 FileWriter,給定要讀取的檔案的名稱 |
寫資料方法:

案例:
public class FwTest {
public static void main(String[] args) throws IOException {
//創建字符輸出流物件
FileWriter fw = new FileWriter("D:\\mytemp\\a.txt");
//續寫
//FileWriter fw = new FileWriter("D:\\mytemp\\a.txt",true);
//寫資料
fw.write(97);
fw.write("\r\n");//換行操作
fw.write("hello");
//釋放資源
fw.close();
}
}
注:FileWiter中的換行是書寫"\r\n", 續寫則是在創建物件時加上true,
案例:使用FileWiter和FileReader實作對文本檔案的復制
這里只使用了一種方式,其他方式請各位觀眾老爺自己動動小手,嘗試一下,
public class FwTest {
public static void main(String[] args) throws IOException {
//創建字符輸出流物件
FileWriter fw = new FileWriter("path08\\mytemp\\read.txt",true);
FileReader fr = new FileReader("D:\\mytemp\\read.txt");
//回圈讀寫檔案
int len;
char[] ch = new char[1024];
while ((len = fr.read(ch))!=-1){
fw.write(ch,0,len);
}
fw.flush();
//釋放資源
fw.close();
fr.close();
}
}
四、緩沖流
緩沖流也叫高效流,是一個增強流,
4.1位元組緩沖流
構造方法:
| public BufferedInputStream(InputStream in) | 創建一個新的緩沖輸入流,引數是InputStream |
| public BufferedOutputStream(OutputStream out) | 創建一個新的緩沖輸出流,引數是OutputStream |
舉例:
public class BufferTest {
public static void main(String[] args) throws IOException {
//創建一個位元組緩沖輸入流物件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("path08\\mytemp\\read.txt"));
//創建一個位元組緩沖輸出流物件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\mytemp\\read.txt"));
}
}
4.2字符緩沖流
構造方法:
| public BufferedReader(Reader in) | 創建一個緩沖輸入流物件,引數是Reader |
| public BufferedWriter(Writer out) | 創建一個緩沖輸出流物件,引數是Writer |
舉例:
public class BufferTest {
public static void main(String[] args) throws IOException {
//創建一個字符緩沖輸入流物件
BufferedReader br = new BufferedReader(new FileReader("D:\\mytemp\\read.txt"));
//創建一個字符緩沖輸出流物件
BufferedWriter bw = new BufferedWriter(new FileWriter("path08\\mytemp\\read.txt"));
}
}
字符緩沖流特有方法 :
BufferedReader: readLine(): 讀取一行資料,讀到最后回傳空值,
BufferedWriter: newLine():換行,
總結:
緩沖流的作用,本人的理解就是高效,他的讀寫速度比基本流要快,至于驗證,就交給各位觀眾老爺了,這里提供一個驗證思路,先使用基礎流讀寫一個檔案,在讀之前我們使用System.currentTimeMillis()方法,再寫完檔案之后,我們再次使用此方法獲取時間,然后兩者相減,我們就能得到其中的運行時間了,同理,我們使用緩沖流再次讀取檔案,比較時間,我們就可以看出兩者時間的差距了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356973.html
標籤:java
下一篇:Java面向物件編程詳解
