文件与IO流
文章目錄
- 流的分類
- 字節流和字符流
- 輸入流InputStream和Reader
- RandomAccessFile
- InputStream 2 String(將字節輸入流中的數據存到字符串中)
流的分類
按流的的方向來分(程序運行的內存為參照):
- 輸入流:只能從中讀取數據,不能向其寫數據 。由InputStream和Reader作為基類。
- 輸出流:只能往里面寫數據,不能讀取數據。由OutputStream和Writer作為基類。
按操作的數據單元來分:
- 字節流:操作的最小數據單元是8位的字節。由InputStream和OutputStream作為基類。
- 字符流:操作的最小數據單元是16位的字符。由Reader和Writer作為基類。
| 輸入流 | InputStream | Reader |
| 輸出流 | OutputStream | Writer |
按流的角色分:
- 節點流:可以從/向一個特定的IO設備(如磁盤,網絡)讀/寫數據的流。
- 處理流:對一個已經存在的流進行連接或封裝,通過封裝后的流來實現數據的讀寫功能。
現階段我一般用的是節點流,處理流還不會。
字節流和字符流
輸入流InputStream和Reader
InputStream和Reader都是抽象類,故不能創建實例來執行輸入操作。但是它們是輸入流的基類,它們的方法是所有輸入流都可以使用的方法。
InputStream類的方法
Reader類的方法
int read():從輸入流中讀取單個字符,返回所讀取的數據(字節數據可以直接轉換成int類型)。 //從輸入流中讀取最多b.lenth長度的字符,并將其存放在字節數組b中,返回讀取的字節數。 int read(char[] cbuf) //從輸入流中讀取最多len長度的字符,存放在字節數組b中(在off位置開始存放),返回實際讀取的字節數 int read(char[] cbuf,int off,int len)不管是字節流還是字符流,上面的方法都是可以重復使用的。每次調用后,輸入流的指針都會向后移動讀取的字節/字符個數的位。當read方法放回-1時,表示該輸入流已經被讀完了。
package com.test2;import java.io.FileInputStream; import java.io.IOException;public class FileInputStreamTest {public static void main(String[] args){FileInputStream fis = null;byte[] buf = new byte[64];System.out.println("開始讀取數據");try {//使用絕對路徑來定位指定文件,由于\代表是轉義字符,故需要\\作為目錄分隔符fis = new FileInputStream("G:\\03 code\\Java\\15\\src\\com\\test2\\FileInputStreamTest.java");//fis = new FileInputStream("FileInputStreamTest.java");int hasRead = 0;while ((hasRead=fis.read(buf)) > 0){System.out.println("輸入流讀取的數據是:");//使用平臺默認的字符集,將字節數組buf的第0位,長度hasRead的子數組解碼成一個新的String對象System.out.printf(new String(buf,0,hasRead));}fis.close();}catch (IOException e){e.printStackTrace();}} }輸入流移動指針的方法
void mark(int readAheadLimit):在指針當前位置記錄一個標記 boolean markSupported(): 判斷此輸入流是否支持mark操作 void reset(): 將指針重新定位到上一級標記處 long skip(long n): 指針向前移動n個字節/字符RandomAccessFile
與普通的輸入輸出流不同。
InputStream 2 String(將字節輸入流中的數據存到字符串中)
總結
- 上一篇: 项目部署到服务器
- 下一篇: GitHub基本使用