吾嘗終日而思矣,不如須臾之所學也;吾嘗跂而望矣,不如登高之博見也;
| @Author:TTODS
什麼是輸入輸出?流又是什麼?
首先要明確的是輸入和輸出是站在程序的角度來說的,我們把數據從數據源中加載到程序中,這是輸入的過程,我們把數據從程序中發送到目的地這是輸出的過程。上面說到的數據源可以是文件,網絡等。鍵盤是Java默認的標準輸入設備,控制檯是Java默認的標準輸出設備。
那麼什麼是流呢?
Java將數據的輸入輸出(I/O)操作當作“流”來處理,“流”是一組有序的數據序列。上面是Java中流的概念。我們可以把程序想象成是一個湖泊,如果我們要從其他水源引水入湖,或者把這個湖泊的水導出到別處,我們可以修建水渠,那麼這些水渠中的水流就是我們的數據流;引入的水流叫做輸入流,導出的水流叫做輸出流。與水流不同的是我們的數據在運輸過程中必須是有序的,這樣才能保證數據在傳輸前後不發生改變。
字節流與字符流
上面說道,Java中的流按照傳輸的方向可以分成輸入流和輸出流。此外,Java中的還可以分爲字節流和字符流,對應到上面的例子,字節流可以理解爲小水渠,字符流可以理解爲大水渠
我們知道電腦中的視頻,圖片,音頻等文件都是以字節的形式存取的,所以字節流的適用範圍更廣些。字符流一般只在涉及到中文(文本)處理的時候會用到。
Java中流類的繼承層次
Java SE提供4個頂級抽象類,兩個字節流抽象類:InputStream和OutputStream;兩個字符流抽象類:Reader和Writer。
- 主要的字節輸入流
- 主要的字節輸出流
- 主要的字符輸入流(以16位的Unicode字符爲基本的處理單位)
- 主要的字符輸出流 (以16位的Unicode字符爲基本的處理單位)
文件複製程序
爲了更好的理解Java中的輸入輸出流,我們現在來看一個文件複製程序
程序代碼
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) {
//新建文件對象
File srcFile = new File("srcFile.txt");
//判斷文件是否存在
if(!srcFile.exists()) {
System.out.println("沒有找到源文件:"+srcFile.getAbsolutePath());
return;
}
//創建目標文件對象
File newFile = new File("newFile.txt");
try {
//創建目標文件
newFile.createNewFile();
//創建輸入流,源文件爲srcFile
FileInputStream fis = new FileInputStream(srcFile);
//創建輸出流,目標文件爲newFile
FileOutputStream fos = new FileOutputStream(newFile);
//創建一個緩衝數組,一次讀取一個字節數組然後處理比一次讀取一個字節然後再處理效率更高
byte[] buffer = new byte[1024];
int len = 0;
//read返回-1表示已經讀取完畢
while((len=fis.read(buffer,0,buffer.length))!=-1) {
fos.write(buffer,0,len);
}
//關閉流
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
我們在項目文件夾下先放入一個srcFile.txt
文件,文件裏面存放的是荀子的《勸學》
然後運行程序,刷新一下文件夾,可以看到創建了一個新的文件newFile.txt
打開文件,發現複製成功