今天是我自學Java的第40天。
感謝你的觀看,謝謝你。
話不多說,開始今天的學習:
一、IO流概述
說到IO流,先得提一提電腦的基本概念:
CPU:中央處理器,處理速度最快。memory:內存,臨時性存儲設備,處理速度次之,但數據不保存。disk:硬碟,持久性存儲設備,處理速度最慢,但數據永久保存。什麼叫IO流?
IO流,就是指讀寫文件的技術。
1.input
I就是指input:輸入的意思,這是輸入流。
意思是將硬碟裡的數據輸入到內存裡,也就是讀取文件。
2.output
O指output:輸出的意思,這是輸出流。
意思是將內存中的數據輸出到硬碟上,也就是寫入文件。
用一句話記憶就是:輸入到內存(讀取硬碟),從內存輸出(寫入硬碟)。
舉一個例子:
我們在記事本上寫東西,寫完後保存,保存的過程就是寫入文件的過程。
不保存:數據是在內存裡面,退出後數據會消失;保存:數據會被寫到硬碟上,退出後數據也會保存。其中根據數據的類型IO流又分為:
字節流:以字節為單位讀寫數據的流,能夠操作所有文件
字節輸入流: InputStream字節輸出流: OutputStream字符流 :以字符為單位讀寫數據的流,用於操作文本文件
字符輸入流: Reader字符輸出流: Writer今天主要學習字節流:
二、OutputStream輸出流
它是輸出流最上層的父類,是一個抽象類,其中它有一個子類叫FileOutputStream。
1.構造方法(一)
先介紹其兩個構造方法:
①構造方法一:路徑存在
FileOutputStream(String name)。
根據文件路徑輸出文件,「a.txt」是一個相對路徑,所以是輸出在當前項目下。
②構造方法一:路徑不存在
「aa/a.txt」因為其父路徑不存在,所以會報錯。
③構造方法二
FileOutputStream(File file)。
一般都是使用構造方法一,簡單方法,只要輸入路徑就好了,但是會出現②中的這種情況。
而構造方法二就是解決這類問題的。
可以先在file中加一個判斷,父路徑不存在就先創建目錄,再創建輸出流。
2.常用方法
①write(int b)方法
這個方法表示是一個字節一個字節地寫。
按照ASCII碼錶編碼,97就對應a,98就對應b,99就對應c。
所以①的操作會在文件裡寫入abc。
②write(byte[] b)方法
這是先寫一個byte數組,在寫入文件。
也是按照ASCII碼錶編碼。
③write(byte[] b, int off, int len)
off表示的是偏移量
len表示的是長度
也就是說寫入文件的數組,是從b數組中off索引位開始,2個長度。
④close()方法
關流,節省資源。就可以將其理解成關閉水龍頭。
所以在a.txt文件中會寫入:abcabcbc。
3.構造方法(二)
我們新創建一個輸出流,操作同一個文件,寫入一個數組,會將文件中的內容覆蓋掉。
a.txt文件裡的內容從abcabcbc變成了劉小愛。
但若是我不是想覆蓋而是續寫在後面該怎麼辦?
構造方法三:
FileOutputStream(String name,boolean append)
append,附加的意思,默認值為false。
如果append為true的話,會拼接到文件後面;如果append為false的話,就會覆蓋。
①直接輸入換行符
不同的作業系統有著不同的換行符
Windows 系統識別的換行符:\r\nUnix 系統識別的換行符:\nMacOs/Linux系統識別的換行符:\r②System方法輸入換行符
System.lineSeparator():該方法會根據系統的不同而輸入不同的換行符。
二、InputStream輸入流
它是輸入流最上層的父類,是一個抽象類,其中它有一個子類叫FileInputStream。
1.read方法基本用法
①創建輸入流
如果文件不存在,輸入流會直接報錯。
②read()方法
輸入流的讀操作。
返回值即為讀取的字符,一次只能讀取一個;如果讀到了文件末尾,返回值為-1。③使用while循環
一次讀取所有內容,當返回值為-1時結束循環。
2.read方法(利用buffer讀取文件)
這個稍稍有點難理解,我們一步一步分析:
①創建一個輸入流
其中文件裡的內容為abcdefgh.
創建buffer數組,長度為3,(buffer為緩存的意思)
②第一次讀數據
將讀到的數據放入buffer中,並返回讀到的長度。
因為buffer的長度為3,所以每次讀取讀3個字節。
所以讀到的是abc,長度為3。
③第二次讀數據
讀到的是def,長度為3。
buffer中def將abc覆蓋掉了,所以列印def。
④第三次讀數據
文件中只有最後兩個字節了,
所以讀到的是gh,長度為2
buffer中只覆蓋了前兩個字節,後面的第3個字節保持不變(gh將def覆蓋得到ghf),所以列印ghf。
⑤第四次讀數據
因為都讀完了,根本就沒有讀文件,所以返回值為-1(注意不為0哦)
buffer沒有改變,所以還是列印ghf。
以上就是利用buffer數組讀取文件時的工作原理。
但這樣太繁瑣了,有沒有簡單的方法?
有的,使用while循環就好了。
3.read方法(利用buffer讀取文件while循環)
①使用while循環
當length不為-1時,一直循環執行read操作;
當length為-1時,表示文件讀到了最後,所以結束循環。
②使用字符串偏移
最後一次的字符串長度我們只需要讀取到的數據,也就是ghf只需要gh即可。
總結