回顧JAVA---6. IO基礎

IO基礎

IO流

(1)IO用於在設備間進行數據傳輸的操做
(2)分類:
A:流向
輸入流 讀取數據
輸出流 寫出數據
B:數據類型
字節流
字節輸入流 InputStream (FileInputStream  BufferedInputStream)
字節輸出流 OutputStream (FileOutputStream BufferedOutputStream)
字符流
字符輸入流 Reader (FileReader BufferedReader)
字符輸出流 Writer (FileWriter BufferedWriter)
注意:
a:若是咱們沒有明確說明按照什麼分,默認按照數據類型分。
b:除非文件用windows自帶的記事本打開咱們可以讀懂,才採用字符流,不然建議使用字節流。
(3)FileOutputStream寫出數據
A:操做步驟
a:建立字節輸出流對象
b:調用write()方法
c:釋放資源

B:代碼體現:
FileOutputStream fos = new FileOutputStream("fos.txt");

fos.write("hello".getBytes());

fos.close();

C:要注意的問題?
a:建立字節輸出流對象作了幾件事情?
b:爲何要close()?
c:如何實現數據的換行?
d:如何實現數據的追加寫入?
(4)FileInputStream讀取數據
A:操做步驟
a:建立字節輸入流對象
b:調用read()方法
c:釋放資源

B:代碼體現:
FileInputStream fis = new FileInputStream("fos.txt");

//方式1
int by = 0;
while((by=fis.read())!=-1) {
System.out.print((char)by);
}

//方式2
byte[] bys = new byte[1024];
int len = 0;
while((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}

fis.close();

字符流

(1)字節流操做中文數據不是特別的方便,因此就出現了轉換流。
   轉換流的做用就是把字節流轉換字符流來使用。
(2)轉換流實際上是一個字符流
字符流 = 字節流 + 編碼表
(3)編碼表
A:就是由字符和對應的數值組成的一張表
B:常見的編碼表
ASCII
ISO-8859-1
GB2312
GBK
GB18030
UTF-8
C:字符串中的編碼問題
編碼
String -- byte[]
解碼
byte[] -- String
(4)IO流中的編碼問題
A:OutputStreamWriter
OutputStreamWriter(OutputStream os):默認編碼,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定編碼。
B:InputStreamReader
InputStreamReader(InputStream is):默認編碼,GBK
InputStreamReader(InputStream is,String charsetName):指定編碼
C:編碼問題其實很簡單
編碼只要一致便可
(5)字符流
Reader
|--InputStreamReader
|--FileReader
|--BufferedReader
Writer
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter

數據操做流(操做基本類型數據的流)

(1)能夠操做基本類型的數據
(2)流對象名稱
DataInputStream
DataOutputStream


內存操做流

(1)有些時候咱們操做完畢後,未必須要產生一個文件,就可使用內存操做流。
(2)三種
A:ByteArrayInputStream,ByteArrayOutputStream
B:CharArrayReader,CharArrayWriter
C:StringReader,StringWriter


打印流

(1)字節打印流,字符打印流
(2)特色:
A:只操做目的地,不操做數據源
B:能夠操做任意類型的數據
C:若是啓用了自動刷新,在調用println()方法的時候,可以換行並刷新
D:能夠直接操做文件
問題:哪些流能夠直接操做文件呢?
看API,若是其構造方法可以同時接收File和String類型的參數,通常都是能夠直接操做文件的
(3)複製文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);

String line = null;
while((line=br.readLine())!=null) {
pw.println(line);
}

pw.close();
br.close();

標準輸入輸出流

(1)System類下面有這樣的兩個字段
in 標準輸入流
out 標準輸出流
(2)三種鍵盤錄入方式
A:main方法的args接收參數
B:System.in經過BufferedReader進行包裝
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
C:Scanner
Scanner sc = new Scanner(System.in);
(3)輸出語句的原理和如何使用字符流輸出數據
A:原理
System.out.println("helloworld");

PrintStream ps = System.out;
ps.println("helloworld");
B:把System.out用字符緩衝流包裝一下使用
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));


隨機訪問流

(1)能夠按照文件指針的位置寫數據和讀數據。
(2)案例:
A:寫數據
B:讀數據
C:獲取和改變文件指針的位置


合併流

(1)把多個輸入流的數據寫到一個輸出流中。
(2)構造方法:
A:SequenceInputStream(InputStream s1, InputStream s2) 
B:SequenceInputStream(Enumeration<? extends InputStream> e) 


序列化流

(1)能夠把對象寫入文本文件或者在網絡中傳輸
(2)如何實現序列化呢?
讓被序列化的對象所屬類實現序列化接口。
該接口是一個標記接口。沒有功能須要實現。
(3)注意問題:
把數據寫到文件後,在去修改類會產生一個問題。
如何解決該問題呢?
在類文件中,給出一個固定的序列化id值。
並且,這樣也能夠解決黃色警告線問題
(4)面試題:
何時序列化?
如何實現序列化?
什麼是反序列化?


Properties

(1)是一個集合類,Hashtable的子類
(2)特有功能
A:public Object setProperty(String key,String value)
B:public String getProperty(String key)
C:public Set<String> stringPropertyNames()
(3)和IO流結合的方法
把鍵值對形式的文本文件內容加載到集合中
public void load(Reader reader)
public void load(InputStream inStream)


把集合中的數據存儲到文本文件中
public void store(Writer writer,String comments)
public void store(OutputStream out,String comments)
(4)案例:
A:根據給定的文件判斷是否有鍵爲"lisi"的,若是有就修改其值爲100
B:寫一個程序實現控制猜數字小遊戲程序不能玩超過5次


NIO

(1)JDK4出現的NIO,對之前的IO操做進行了優化,提供了效率。可是大部分咱們看到的仍是之前的IO (2)JDK7的NIO的使用 Path:路徑 Paths:經過靜態方法返回一個路徑 Files:提供了常見的功能 複製文本文件 把集合中的數據寫到文本文件
相關文章
相關標籤/搜索