流的概念
流是指任何有能力產生數據的數據源對象或者接收數據的接收端對象。
字節流和字符流
java中的流可以分為字節流和字符流兩大類。java類庫中字節流由inputStream類和outputStream類派生,按照不同的數據源對象和接收端對象提供了多個類,如FileInputStream類和FileOutputStream類用於對文件讀寫字節,ByteArrayInputStream類和ByteArrayOutputSream類用於對內存緩沖區讀寫字節等。字符流由Reader類和Writer類派生,按照不同的數據源對象和接收端對象提供了多個類,如FileReader類和FileWriter類用於對文件讀寫字符,CharArrayReader類和CharArrayWriter類用於對內存緩沖區讀寫字符等。java類庫中提供了將字節流轉化成字符流的類,InputStreamReader類用於將inputStream對象轉換成Reader對象,OutputSreamWriter類用於將OutputStream對象轉換成Writer對象。
文件的讀寫
字節流對文件讀寫的一般形式為:
FileInputStream fis=new FileInputStream("filename");
fis.read();
FileOutputStream fos=new FIleOutputStream("filename");
fos.read();
采用字符流對文件讀寫的一般形式為:
FileReader fr=new FileReader("filename");
fr.read();
FileWriter fw=new FileWriter("filename");
fw.read();
當文件讀取結束后都需要調用close();方法
緩沖區的讀寫
直接對文件讀寫容易造成過多的磁盤訪問,從而影響讀寫效率。為了提高讀寫讀寫速度,可以利用內存緩沖區對需要讀寫的文件進行緩沖,從而減少對磁盤訪問次數。
java提供了BufferedOutputStream和BufferedWriter類用於與輸出流進行連接,一般形式為
BufferedOutputStream bos=new BufferedOutputStream(fos);
BufferedWriter bw=new BufferedWriter(fw);
fos和fw分別為FileOutputStream對象和FileWriter對象
java提供了BufferedInputStream和BufferedReader類用於與輸入流進行連接,一般形式為
BufferedInputStream bis=new BufferedInputStream(fis);
BufferedReader br=new BufferedReader(fr);
對象序列化的讀寫
某些情況下,需要記錄對象的狀態,用於數據備份或者網絡傳輸。我們可以通過將對象序列化將對象自動轉換為一個字節序列進行存儲或傳輸,並通過解序列化將這個字節序列完全恢復為原來的對象,只需要實現Serializable接口。
java提供了ObjectOutputStream類和ObjectWriter類將序列化的對象寫入文件,一般形式為
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("filename"));
ObjectWriter ow=new ObjectWriter(new FileWriter("filename"));
java提供了ObjectInputStream類和ObjectReader類從文件中解序列化對象,其一般形式為:
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("filename));
ObjectReader or=new ObjectReader(new FileReader("filename"));
標准的輸入輸出
java中提供了3中標准輸入輸出流:System.in、System.out、System.err
其中System是用來封裝程序運行環境的類。這三種流被定義為public和static的,所以不需要創建System對象而直接使用。System.in是標准輸入流,是未經包裝的InputStream流,讀取之前需要進行包裝,System.out是標准輸出流,已經被包裝秤PrintStream流,System.err是標准錯誤流,已經被包裝成PrintStream流。
一般對上述輸入輸出流進行如下包裝:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(System.out,true);