1、流概述
流是一組有序的數據序列,可分爲輸入流和輸出流兩種。I/O流提供了一條通道程序,可以使用這條通道把源中的字節序列送到目的地。不僅可以使用在文件上,也可以用於鍵盤、鼠標、顯示器等。
輸入流
文件--->數據流--->目的地
輸出流
源-->數據流--->文件
2、流概述
Java定義了許多類專門複雜各種方式的輸入/輸出。這些類都放在java.io包中。其中,輸入流類都是抽象類InputStream(字節輸入流)或抽象類Reader(字符輸入流)的子類;而所有輸出流都是OutputStream(字節輸出流)或抽象類Writer(字符輸出流)的子類。
2.1 輸入流
InputStream類是字節輸入流的抽象類,是所有字節輸入流的父類。InputStream類的具體層次結構。
- InputStream
- AudioInputStream
- ByteArrayInputStream
- StringBufferInputStream
- FileInputStream
- FilterInputStream
- BufferedInputStream
- DataInputStream
- PushbackInputStream
- InputStream
- ObjectInputStream
- SequenceInputStream
- PipedInputStream
該類中所有方法遇到錯誤時都會觸發IOException異常。
- [x] read()方法:從輸入流中讀取數據的下一個字節。返回0~255範圍內的int字節值。如果流已經到達末尾,而沒有可用字節,則返回-1
- [x] read(byte[] b):從輸入流中讀入一定長度的字節,並以整數的形式返回字節數。
- [x] close():關閉此輸入流並釋放與該流關聯的所有系統資源。
Java中的字符時Unicode編碼,是雙字節的。InputStream是用來處理字節的,並不適合處理字符文本。Java爲字符文本的輸入提供了一套單獨的類Reader。
- Reader
- CharArrayReader
- BufferedReader
- LineNumberReader
- FilterReader
- PushBackReader
- InputStreamReader
- FileReader
- PipedReader
- StringReader
2.2 輸出流
OutputStream類是字節輸出流的抽象類。
- OutputStream
- ByteArrayOutputStream
- FileOutputStream
- FilterOutputStream
- BufferedOutputStream
- DataOutputStream
- PushbackOutputStream
- OutputStream
- ObjectOutputStream
- SequenceOutputStream
- PipedOutputStream
OutputStream類中的所有方法均返回void,遇到錯誤時都會觸發IOException異常。
- [x] write(int b) 將指定的字節寫入此輸出流
- [x] write(byte[] b):將b個字節從指定的byte數組寫入此輸出流
- [x] write(byte[] b,int off,int len):將指定byte數組中從偏移量off開始的len個字節寫入此輸出流
- [x] flush():徹底完成輸出並清空緩存區
- [x] close():關閉輸出流
Writer類是字符輸出流的抽象類,所有字符輸出類的實現都是它的子類。
- Writer
- CharArrayWriter
- BufferedWriter
- LineNumberWriter
- FilterWriter
- PushBackWriter
- OutputStreamWriter
- FileWriter
- PipedWriter
- PrintWriter
- StringWriter
3、File類
File類是java.io包中唯一代表磁盤文件本身的對象。File類定義了一些與平臺物館的方法來操作文件,可以實現創建、刪除、重命名文件等操作。File類的對象主要用來獲取文件本身的一些信息,如所在目錄,文件的長度,以及文件讀寫權限等。
3.1 文件的創建與刪除
使用File類創建一個文件對象,通常使用以下3種構造方法來創建文件對象。
// 1.File(String pathName)
New File(String pathName)
File file = new File("D:\\a.txt");
// 2.File(String parent, String child)
// 該構造方法根據定義的父路徑和子路徑字符串創建一個新的File對象。
new File(String parent, String child);
String parent = "D:/doc";
String child = "letter.txt";
// 3.File(File f,String child)
// 該構造方法根據parent抽象路徑名和子路徑字符串創建一個新的File實例
String f = "D:/doc/";
String child = "letter.txt";
public static class {
public static void main(String[] args) {
File file = new File("test.txt");
if(file.exits()) {
file.delete();
}else{
try{
file.createNewFile();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
4、 文件輸出/輸出流
4.1 FileInputStream與FileOutputStream類
兩個類都是用來操作磁盤文件的,該類繼承自InputStream,提供了基本的文件寫入能力。
FileInputStream類常用構造方法
- FileInputStream(String name);
- FileInputStream(File file); 該方法允許把文件連接輸入流之前對文件做進一步操作。
public static class {
public static void main(String[] args) {
File file = new File("test.txt");
try{
// 創建FileOutputStream對象
FileOutputStream out = new FileOutputStream(File);
byte byt[] = "兩個類都是用來操作磁盤文件的,該類繼承自InputStream,提供了基本的文件寫入能力。".getBytes();
out.write(byt);
out.close();
}catch(Exception e){
e.printStackTrace();
}
try{
FileInputStream in = new FileInputStream(file);
byte byt[] = new byte[1024];
int len = in.read(byt);
// 將文件信息輸出,但是這個輸出new String有問題
System.out.println(new String(byt,0,len));
in.close()
}catch(Exception e){
e.printStackTrace();
}
}
}
4.2 FileReader和FileWriter類
漢字採取上面的字節流讀入會產生亂碼的問題,所以使用字符流的FileReader和FileWriter類,即可避免該現象。
5.帶緩存的輸入/輸出流
緩存是I/O的一種性能優化,緩存流爲I/O流增加了內存緩衝區,有了緩存,使得在流上執行skip(),mark(),和reset()方法成爲可能。
5.1 BufferedInputStream和BufferedOutputStream類
BufferedInputStream構造方法
- [x] BufferedInputStream(InputStream in)
- [x] BufferedInputStream(InputStream in, int size)
第一種形式的構造方法創建了一個帶有32字節的緩存流;第二個按照指定的大小來創建最優的緩存區大小。
BufferedOutputStream構造方法
- [x] BufferedOutputStream(OutputStream out)
- [x] BufferedOutputStream(OutputStream out,int size)
5.2 BufferedReader和BufferedWriter
以上分別繼承了Reader和Writer類
BufferedReader類的常用方法
方法 | 描述 |
---|---|
read() | 讀取單個字符 |
readLine() | 讀取一個文本行,並將其返回爲一個字符串。若無數據,則返回null。 |
BufferedWriter常用方法
方法 | 描述 |
---|---|
write(String s,int off,int len) | 寫入字符串的某一部分 |
flush() | 刷新該流的緩存 |
newLine() | 寫入一個行分割符 |
在使用BufferedWriter類的Write()方法時,數據並沒有立刻被寫入值輸出流,而是首先進入緩存去中。如果想立刻將緩存區中的數據寫入輸出流,一定要調用flush()方法。
字符數據--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件
package simple.java;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import sun.net.www.content.text.plain;
public class FileTest {
public static void main(String[] args) throws IOException {
String[] array = {"取等","學家儘快","斷努力"};
File f = new File("C:\\pox.txt");
try{
FileWriter fileWriter = new FileWriter(f);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (int i=0;i<array.length;i++){
bufferedWriter.write(array[i]);
bufferedWriter.newLine();
}
bufferedWriter.close();
fileWriter.close();
}catch(Exception e){
e.printStackTrace();
}
try{
FileReader fileReader = new FileReader(f);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String s = null;
int i = 0;
// s=bufferedReader.readLine()很重要,否則會顯示不全,還不知道爲啥。
while((s=bufferedReader.readLine())!= null) {
i++;
System.out.println("第"+i+"行:"+s);
}
bufferedReader.close();
fileReader.close();
}