Java学习笔记-7.Java IO流
一、輸入/輸出流
1.流:不同類型的輸入、輸出源??? 數據流:輸入或輸出的數據
?? Java數據流的所有接口和類都是在java.io包中定義的,因此應在程序開頭加入
?? import java.io.*
2.流的分類:
? (1)從流的流動方向來看,可以將IO流分為輸入流和輸出流
????????? 輸入流:數據信息從某個地方流向程序中
????????? 輸出流:數據信息從程序中發送到某個目的地
? (2)從流的數據處理單位來看,可以將IO流分為字節流和字符流
????????? 字節流:以字節方式處理的二進制數據
????????? 字符流:以字符方式處理的數據流(Java使用Unicode字符集,存放一個字符需要兩個字節)
? (3)從流的功能來看,可以將IO流分為節點流和過濾流
????????? 節點流:程序中用于直接操作目標設備所對應的IO流
????????? 過濾流(也稱為包裝流):通過一個間接IO流去調用相應的節點流,以更加靈活方便地讀/寫各種類型的數據
二、字節流和字符流
1.java.io包中有兩大繼承體系:
?? 一類是以字節為單位處理數據的Stream,它們的命名方式都是***Stream
?? 另一類是以字符為單位處理數據的Reader和Writer,它們的命名方式都是*Reader或*Writer
三、文件及文件流
1.Java中IO流操作的基本流程
?? 使用File類定位一個文件->通過字節流或字符流的子類進行流對象的實例化
?? ->進行讀寫操作->關閉字節或字符流
2.Java字節流和字符流的區別:在字符流進行操作時會使用到緩沖區,字節流操作不會使用緩沖區
import java.io.*; class FileStream {public static void main(String[] args) {try {File inFile = new File("file1.txt");File outFile = new File("file2.txt");FileReader fis = new FileReader(inFile);FileWriter fos = new FileWriter(outFile);int c;while ((c = fis.read()) != -1) {fos.write(c);}fis.close();//fos.close();fos.flush(); //若無此語句,file2.txt文件為空} catch(FileNotFoundException e) {System.out.println("FileStream: " + e);} catch (IOException e) {System.out.println("FileStream: " + e);}} }?? flush();語句強制緩沖區輸出,若使用FileInputStream字節流操作則無該技術
?? 字符流在緩沖區未滿前先存放在緩沖區中,除非使用flush() 或 close()強制輸出
3.在Windows系統下文件名稱分隔符使用"/"或轉義字符"\\"
?? 而Linux中使用"/"
?? 為了保持Java系統很好的可移植性,在操作文件時最好使用File.separator
?? 例:File f = new FIle("D:" + File.seperator + "test.txt");
?? 一般使用"./"表示當前目錄,"../"表示當前目錄的父目錄
4.隨機文件讀寫:RandomAccessFile類
?? 訪問模式值及含義
| mode值 | 含義 |
| "r" | 以只讀方式打開 |
| "rw" | 打開以便讀取和寫入,如果該文件不存在,則嘗試創建該文件 |
| "rws" | 同步讀/寫,任何寫操作的內容都被直接寫入物理文件,包括文件內容和文件屬性 |
| "rwd" | 同步讀/寫,任何寫操作的內容都被直接寫入物理文件,不包括文件屬性 |
?? "rw"模式時,僅當RandomAccessFile類對象執行close方法時才將更新內容寫入文件
?? 而"rws"和"rwd"模式是同步讀/寫,因此可以保證數據實時更新
?? RandomAccessFile類一般方法
| 方法名稱 | 含義 |
| public long getFilePointer() throws IOException | 返回當前的文件指針位置 |
| public void seek(long pos) throws IOException | 移動文件指針到pos位置 |
| public int skipBytes(int n) throws IOException | 文件指針向后移動n個字節,n為負數時指針不移動 |
| public int read(byte[] b) throws IOException | 將最多b.length個字節讀入數組b |
| public void write(byte[] b) throws IOException | 將b.length個字節從指定數組b寫入到文件 |
| public final byte readByte() throws IOException | 讀取一個字節 |
| public final void writeByte(int v) throws IOException | 將(byte) v寫入文件 |
| public final String readLine() throws IOException | 讀取一行 |
| public void close() throws IOException | 關閉流 |
四、過濾流
1.緩沖流
?? 為提高IO流的讀取效率,Java提供了具有緩沖功能的流類,使用這些流類時,會創建一個內部的緩沖區。
?? 在讀字節或字符時,先從數據源讀取到的數據填充到緩沖區,然后再返回
?? 在寫字節或字符時,先把寫入的數據填充到內部緩沖區,然后一次性寫入到目標數據源中,從而提高了I/O流的讀取效率
?? 緩沖流包括:
?? 字節流:BufferedInputStream??? BufferedOutputStream
?? 字符流:BufferedReader??? BufferedWriter
?? 注意:緩沖區的大小默認為32字節大小,一般緩沖區的大小為內存頁或磁盤塊等的整數倍
??????????? 只有緩沖區滿時,才會將數據真正送到輸出流,但可以使用flush()方法人為地將尚未填滿的緩沖區中的數據送出
2.數據流:DataInputStream 和 DataOutputStream
?? 作用:允許程序按與機器無關的風格讀取Java原始數據,即不關心一個數值應當是多少字節
例:
import java.io.IOException; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class DataStreamDemo {public static void main(String[] args) throws IOException {//write the dataFileOutputStream fos = new FileOutputStream("data.txt");DataOutputStream dos = new DataOutputStream(fos);dos.writeBoolean(true);dos.writeByte((byte)123);dos.writeChar('J');dos.writeDouble(3.1415926);dos.writeFloat(2.7182f);dos.writeInt(1234567);dos.writeLong(998877665544332211L);dos.writeShort((short)11223);dos.close();//read the dataFileInputStream fis = new FileInputStream("data.txt");DataInputStream dis = new DataInputStream(fis);System.out.println(dis.readBoolean());System.out.println(dis.readByte());System.out.println(dis.readChar());System.out.println(dis.readDouble());System.out.println(dis.readFloat());System.out.println(dis.readInt());System.out.println(dis.readLong());System.out.println(dis.readShort());dis.close();} }3.打印流:使輸出信息更方便的類,主要包含PrintStream和PrintWriter
?? 包含輸出方法print? println? printf
五、標準流
1.語言包java.lang中的System類管理標準IO流和錯誤流。System是final類,System類中定義了以下三個靜態變量成員變量
?? public static final InputStream in:標準輸入,一般是鍵盤
?? public static final PrintStream out:標準輸出,一般是顯示器
?? public static final PrintStream err:錯誤信息輸出,通常是顯示器
例:
public class SystemDemo {public static void main(String[] args) {try {byte bArray[] = new byte[20];String str;System.out.print("Input:");System.in.read(bArray);str = new String(bArray, 0);System.out.print("Output:");System.out.println(str.trim());}catch (IOException ioe) {System.err.println(ioe.toStirng());}} }六、對象流
1.對象的序列化:把一個對象變為二進制的數據流的方法,可以實現對象的傳輸和存儲
?? 只有實現 java.io.Serializable 接口的類才能被序列化
?? java.io.Serializable接口中沒有任何方法,一個類聲明實現java.io.Serializable只是表明該類加入對象序列化協議
2.對象流
?? 類ObjectOutputStream和ObjectInputStream繼承了接口ObjectOutput和ObjectInput
?? 將數據流功能擴展到可以讀/寫對象,方法:readObject(); 和 writeObject();
?? 注:通常,只要某個類實現了Serializable接口,那么該類的類對象中的所有屬性都會被串行化
???????? 對于一些敏感信息,只需在不串行化的屬性上用 transient 修飾即可
七、Scanner類
1.Scanner類處于java.util包中,使用時需要import引入
?? Scanner類常用方法
| 方法名稱 | 含義 |
| public Scanner(InputStream source) | 從指定字節輸入流中接收內容 |
| public Scanner(File source) throws FileNotFoundException | 從文件中接收內容 |
| public boolean hasNextInt() | 判斷輸入的是否是整數 |
| public boolean hasNextDouble() | 判斷輸入的是否是小數 |
| public String next() | 接收數據 |
| public int nextInt() | 接收整數 |
| public float nextDOuble() | 接收小數 |
| public Scanner useDelimiter(String pattern) | 設置分隔符 |
例:
Scanner reader = new Scanner(System.in); while(reader.hasNextDouble()) {double x = reader.nextDouble(); }八、流的選擇
1.步驟:
? (1)選擇合適的節點流:按照鏈接的數據源種類進行選擇
???????????????????????????????????? 讀寫文件應該使用文件流,讀寫字節數組應該使用字節數組流
? (2)選擇合適方向的流:讀:輸入流/寫:輸出流
? (3)選擇字節流或字符流:所有的文件在傳輸時都是以字節的方式進行的(包括圖片等)
??????????????????????????????????????? 而字符時只有在內存中才會形成的,因此字節流使用較廣泛
? (4)包裝流:可以選擇多個,例如:
????????????????????? 如果需要讀/寫格式化數據,選擇DataInputStream/DataOutputStream
????????????????????? 如果需要提高讀/寫的效率,選擇BufferedReader/BufferedWriter
轉載于:https://www.cnblogs.com/trj14/p/4300462.html
總結
以上是生活随笔為你收集整理的Java学习笔记-7.Java IO流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SICP练习】66 练习2.37
- 下一篇: Java并发编程之ConcurrentH