流的概念
流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱爲流,流的本質是數據傳輸,根據數據傳輸特性將流抽象爲各種類,方便更直觀的進行數據操作。該怎麼理解這個流呢?這裏我們完全可以類比這水流去理解,只不過我們這裏的流指的則是數據了,結合兩個概念“流”和“數據”也就得到我們的重點數據流,就如同我們的水流一樣,對於水流,那流入流出的都是水,而我們的數據流流入流出的自然就是數據了。
那麼IO又是什麼呢?I可理解爲input,O可理解爲output,其實所謂的IO,我認爲就是輸入輸出,對於IO我們可以如下分類:
根據處理數據類型的不同分爲:字符流和字節流
根據數據流向不同分爲:輸入流和輸出流
輸入(Input):可以讓程序從外部系統獲得數據(核心含義是“讀”,讀取外部數據)。
輸出(Output):程序輸出數據給外部系統從而可以操作外部系統(核心含義是“寫”,將數據寫出到外部系統)
字符流與字節流的區別:
1)字節流可用於任何類型的對象,包括二進制對象,音頻、圖片等,而字符流只能處理字符或者字符串;
2)字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以
Java流類圖結構:
字節流
FileInputStream
構造方法:
1)FileInputStream(File file):
通過打開與實際文件的連接創建一個 FileInputStream
,該文件由文件系統中的 File
對象 file
命名。
2)FileInputStream(FileDescriptor fdObj):
創建 FileInputStream
通過使用文件描述符 fdObj
,其表示在文件系統中的現有連接到一個實際的文件。
3)FileInputStream(String name):
通過打開與實際文件的連接來創建一個 FileInputStream
,該文件由文件系統中的路徑名 name
命名。
FileInputStream讀取文本
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("E:\\test\\test.txt");
//爲什麼要定義這麼一個數組,我們看這個byte數組其實就是1kb大小,我們之前是一個字節一個字節讀取,我們現在是1kb1kb的去讀
byte[] bytes = new byte[1024]; //1kb
FileInputStream fileInputStream = new FileInputStream(file);
//現在傳入一個byte數組意味着按照byte數組大小讀取,然後讀取到的文本內容存放在這個byte數組中再返回一共讀取的字節數
int read = fileInputStream.read(bytes);
//需要對這個讀取到的byte數組進行轉換
String s = new String(bytes);
System.out.println(s);//打印讀取到的內容
System.out.println(read);//13
}
}
FileOutputStrem
構造方法:
1)FileOutputStream(File file):
創建文件輸出流以寫入由指定的 File
對象表示的文件
2)FileOutputStream(File file, boolean append):
創建文件輸出流以寫入由指定的 File
對象表示的文件。
3)FileOutputStream(FileDescriptor fdObj):
創建文件輸出流以寫入指定的文件描述符,表示與文件系統中實際文件的現有連接。
4)FileOutputStream(String name):
創建文件輸出流以指定的名稱寫入文件。
5)FileOutputStream(String name, boolean append):
創建文件輸出流以指定的名稱寫入文件。
FileOutputStrem寫入文本
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("E:\\test\\test.txt");
byte[] bytes = new byte[1024]; //1kb
FileInputStream fileInputStream = new FileInputStream(file);
int read = fileInputStream.read(bytes);
FileOutputStream fileOutputStream = new FileOutputStream(file,true);
//這裏增加了一個true,什麼意思呢?這裏如果你不寫的話默認就是false,那麼你寫入文本的時候就會覆蓋之前的內容,但是如果你加上true的話就代表在原有文本之後追加
fileOutputStream.write(bytes);
}
}
字符流
InputStremReader讀取文本
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class FileStreamTest {
public static void main(String[] args) throws IOException {
File file = new File("E:\\test\\words.txt");
char[] c = new char[64];
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"gbk");
int read = inputStreamReader.read(c);
System.out.println( new String(c));//晴天,陰天,多雲,小雨,大風,中雨,小雪,雷陣雨
FileReader filereader = new FileReader(file);
int readfilereader = filereader.read(c);
System.out.println( new String(c));//晴天,陰天,多雲,小雨,大風,中雨,小雪,雷陣雨
}
}
如上:FileReader它不需要像InputStremReader一樣傳入一個字節流,同樣也不能直接傳入編碼格式,至於其他的操作幾乎就是一樣的,而BufferedReader緩衝流的優點是可以直接調取readLine方法進行整行讀取,因爲是整行讀取可以保持格式不亂