文章目錄
一、簡介
你要把一個視頻,拷貝到你的電腦硬盤裏,這個可以看做是一種數據的流動,按照流動的方向,以內存爲基準,分爲 輸入input 和 輸出 output ,即流向內存是輸入流,流出內存的輸出流。
Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。
1、IO的分類
根據數據的流向分爲:輸入流和輸出流。
輸入流 : 把數據從 其他設備 上讀取到 內存 中的流。
輸出流 : 把數據從 內存 中寫出到 其他設備 上的流。
格局數據的類型分爲:字節流和字符流。
字節流 : 以字節爲單位,讀寫數據的流。
字符流 : 以字符爲單位,讀寫數據的流。
2、頂級父類
輸入流 | 輸出流 | |
---|---|---|
字節流 | 字節輸入流 InputStream | 字節輸出流 OutputStream |
字符流 | 字符輸入流 Reader | 字符輸出流 Writer |
二、讀入文件
1、FileInputStream類方法
常用的方法:
public void close() :關閉此輸入流並釋放與此流相關聯的任何系統資源。
public abstract int read() : 從輸入流讀取數據的下一個字節。
public int read(byte[] b) : 從輸入流中讀取一些字節數,並將它們存儲到字節數組 b中 。
讀取單個字節:
FileInputStream fis = new FileInputStream("fos.txt");
int b;
while ((b=fis.read())!=-1){
System.out.println((char)b);
}
fis.close();
讀取到數組中:
FileInputStream fis = new FileInputStream("fos.txt");
int len;
byte[] bytes = new byte[4];
while ((len = fis.read(bytes)) != -1) {
System.out.println(new String(bytes));
}
fis.close();
2、FileReader類方法
常用的方法
public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
public int read() : 從輸入流讀取一個字符。
public int read(char[] cbuf) : 從輸入流中讀取一些字符,並將它們存儲到字符數組 cbuf中
讀取單個字符
FileReader fileReader = new FileReader("fos.txt");
int b;
while ((b=fileReader.read())!=-1){
System.out.println((char)b);
}
fileReader.close();
}
讀取到數組中:
FileReader fileReader = new FileReader("fos.txt");
int len;
char[] chars = new char[3];
while ((len=fileReader.read(chars))!=-1){
System.out.println(new String(chars));
}
fileReader.close();
讀取到數組中(按位讀取)
FileReader fileReader = new FileReader("fos.txt");
int len;
char[] chars = new char[3];
while ((len=fileReader.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fileReader.close();
}
3、讀一行文件:(字符緩衝流)
常用方法:
BufferedReader: public String readLine() : 讀一行文字。
代碼:
BufferedReader br = new BufferedReader(new FileReader("fos.txt"));
// 讀取一行文件內容
String line = br.readLine();
// 循環所讀文件的所有內容
String end;
while ((end=br.readLine())!=null){
System.out.println(line);
}
三、寫出文件
1、FileOutputStream類方法
使用IO輸出文件的方式:
FileOutputStream fos=null;
try {
//方法一:
fos = new FileOutputStream("D://fos.txt");
fos.write(97);
//方法二:
byte[] bytes = "你好嗎".getBytes();
fos.write(bytes);
//方法三:
byte[] b = "abcde".getBytes();
// 寫出從索引2開始,2個字節。索引2是c,兩個字節,也就是cd。
fos.write(b,2,2);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
每次程序運行,創建輸出流對象,都會清空目標文件中的數據。如果想要在每次是增量的輸出的話,就得使用下面的兩個構造方法;
public FileOutputStream(File file, boolean append) :
創建文件輸出流以寫入由指定的 File對象表示的文件。
public FileOutputStream(String name, boolean append) :
創建文件輸出流以指定的名稱寫入文件。
這兩個構造方法,參數中都需要傳入一個boolean類型的值, true 表示追加數據, false 表示清空原有數據。
這樣創建的輸出流對象,就可以指定是否追加續寫了;
FileOutputStream fos = new FileOutputStream("fos.txt",true);
系統中的換行符:
Windows系統裏,每行結尾是 回車+換行 ,即 \r\n ;
Unix系統裏,每行結尾只有 換行 ,即 \n ;
Mac系統裏,每行結尾是 回車 ,即 \r 。從 Mac OS X開始與Linux統一。
2、FileWriter類方法
public abstract void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
public abstract void flush() :刷新此輸出流並強制任何緩衝的輸出字符被寫出。
public void write(int c) :寫出一個字符。
public void write(char[] cbuf) :將 b.length字符從指定的字符數組寫出此輸出流。
public abstract void write(char[] b, int off, int len) :從指定的字符數組寫出 len字符,從偏移量 off開始輸出到此輸出流。
public void write(String str) :寫出一個字符串
flush會把之前的內容收寫出到文件中,每次的flush都會刷新寫出到文件中,最後close關閉資源的時候,也會寫出一次數據; 實時刷新數據到文件中
FileWriter fw = new FileWriter("ddd.txt");
fw.write(97);
fw.flush();
fw.write('f');
fw.flush();
fw.write('9');
fw.flush();
fw.close();
寫出內容到文件
FileWriter fw = new FileWriter("test.txt");
// 寫出char類型內容
fw.write(48);
fw.flush();
// 寫出字符串
fw.write("好的");
fw.flush();
// 寫出char型數組
char[] chars = {'1','2', '3','4','5'};
fw.flush();
// 寫出字符串指定內容
fw.write(chars);
fw.write("qwert",2,3);
fw.flush();
// 寫出char型數組指定內容
fw.write(chars,2,2);
fw.flush();
fw.close();
四、複製文件
1、字節流方式
// 1.創建讀入的對象
FileInputStream fis = new FileInputStream("D:\\test.jpg");
//1.2 創建寫出的對象
FileOutputStream fos = new FileOutputStream("test_copy.jpg");
// 2.讀寫數據
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b))!=-1) {
fos.write(b, 0 , len);
}
// 3.關閉資源
fos.close();
fis.close();
2、緩衝流方式
BufferedInputStream fis = new BufferedInputStream(new FileInputStream("fos.txt"));
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("copy.txt"));
int len;
while ((len=fis.read())!=-1){
fos.write(len);
}
fis.close();
fos.close();