Java中I/O操做主要是指使用Java進行輸入,輸出操做. Java全部的I/O機制都是基於數據流進行輸入輸出,這些數據流表示了字符或者字節數據的流動序列。java
數據流是一串接二連三的數據的集合,就象水管裏的水流,在水管的一端一點一點地供水,而在水管的另外一端看到的是一股接二連三的水流。數據寫入程序能夠是一段、一段地向數據流管道中寫入數據,這些數據段會按前後順序造成一個長的數據流。對數據讀取程序來講,看不到數據流在寫入時的分段狀況,每次能夠讀取其中的任意長度的數據,但只能先讀取前面的數據後,再讀取後面的數據(不能隨機讀取)。無論寫入時是將數據分屢次寫入,仍是做爲一個總體一次寫入,讀取時的效果都是徹底同樣的。數組
簡而言之:數據流是一組有序,有起點和終點的字節的數據序列。包括輸入流和輸出流。安全
當程序須要讀取數據的時候,就會創建一個通向數據源的鏈接,這個數據源能夠是文件,內存,或是網絡鏈接。相似的,當程序須要寫入數據的時候,就會創建一個通向目的地的鏈接。網絡
數據流分類:dom
流序列中的數據既能夠是未經加工的原始二進制數據,也能夠是經必定編碼處理後符合某種格式規定的特定數據。所以Java中的流分爲兩種: 1) 字節流:數據流中最小的數據單元是字節 2) 字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個字符佔用兩個字節。編碼
http://Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable。掌握了這些就掌握了Java I/O的精髓了。spa
Java I/O主要包括以下3層次:操作系統
主要類以下:線程
http://java.io包裏有4個基本類:InputStream、OutputStream及Reader、Writer類,它們分別處理字節流和字符流。3d
其餘各類各樣的流都是由這4個派生出來的。
按來源/去向分類:
InputStream 爲字節輸入流,它自己爲一個抽象類,必須依靠其子類實現各類功能,此抽象類是表示字節輸入流的全部類的超類。 繼承自InputStream 的流都是向程序中輸入數據的,且數據單位爲字節(8bit);
InputStream是輸入字節數據用的類,因此InputStream類提供了3種重載的read方法.Inputstream類中的經常使用方法:
來看看幾種不一樣的InputStream:
OutputStream提供了3個write方法來作數據的輸出,這個是和InputStream是相對應的。
幾種不一樣的OutputStream:
Reader和InputStream相似;Writer和OutputStream相似。
有兩個須要注意的:
1.肯定是輸入仍是輸出
輸入:輸入流 InputStream Reader
輸出:輸出流 OutputStream Writer
2. 明確操做的數據對象是不是純文本
是:字符流 Reader,Writer
否:字節流 InputStream,OutputStream
3. 明確具體的設備。
4. 是否須要轉換流
是,就使用轉換流,從Stream轉化爲Reader、Writer:InputStreamReader,OutputStreamWriter
5. 是否須要緩衝提升效率
是就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter
6. 是否須要格式化輸出
char ch; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //將字節流轉爲字符流,帶緩衝 try { while ((ch = (char) in.read()) != -1){ System.out.print(ch); } } catch (IOException e) { e.printStackTrace(); }
方法一:
BufferedReader in = new BufferedReader(new FileReader("AtomicityTest.java")); String s; try { while ((s = in.readLine()) != null){ System.out.println(s); } in.close(); } catch (IOException e) { e.printStackTrace(); }
方法二:
FileReader in = new FileReader("AtomicityTest.java"); int b; try { while ((b = in.read()) != -1){ System.out.print((char)b); } in.close(); } catch (IOException e) { e.printStackTrace(); }
方法三:(有可能出現亂碼)
FileInputStream in = new FileInputStream("AtomicityTest.java"); int n = 50; byte[] buffer = new byte[n]; try { while ((in.read(buffer,0,n) != -1 && n > 0)){ System.out.print(new String(buffer)); } in.close(); } catch (IOException e) { e.printStackTrace(); }
FileInputStream in = new FileInputStream("AtomicityTest.java"); FileOutputStream out = new FileOutputStream("copy.txt"); int b; while ((b = in.read()) != -1){ out.write(b); } out.flush(); in.close(); out.close();
Scanner in = new Scanner(System.in); FileWriter out = new FileWriter("systemIn.log"); String s; while (!(s = in.nextLine()).equals("Q")){ out.write(s + "\n"); } out.flush(); out.close(); in.close();