1.IO 流引入
概述:以應用程式為參照物,讀取資料為輸入流(Input),寫資料為輸出流(Output),大量輸入輸出資料簡稱 IO 流
原理:
2.IO 流的分類
讀寫的檔案分類
- 二進位制檔案:開啟後是亂碼,或者是 16 進位制,無法生成檔案的檔案
- 文字檔案:開啟檔案內容可以直接閱讀
IO流讀取資料內容分類
- 字元流:讀取的內容最小單位是 char 型別
- 位元組流:讀取的內容最小單位是 byte 型別
3.IO 流的訪問方式分類
隨機讀寫檔案:檔案中存在一個遊標,透過移動遊標的方式,改變讀寫資料的位置
順序讀寫檔案:每次都從檔案開始的位置開始讀寫
4.IO 位元組流
輸入輸出位元組流:InputStream、OutputStream
API:
- int read():從流中讀取一個位元組,返回值為 int 型別
- void wirte(int b):把一個位元組寫入到流中(把int 型別的低八位)
- void close():關閉管道流
4.1.檔案輸出/入位元組流
檔案流:FileInputStream(檔案輸入流)、FileOutputStream(檔案輸出流)
特點:檔案流是節點流,直接可以操作磁碟的檔案
節點流概念:能夠介質(檔案、網路、控制檯)直接相連的流
API:
- FileInputStream(File file)
- FileInputStream(String name)
- FileOutputStream(String name)
- FileOutputStream(String name, boolean append)
- FileOutputStream(File file, boolean append)
- FileOutputStream(File file)
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 完成檔案的複製
*/
public class FileStreamDemo {
public static void main(String[] args) throws IOException {
// 1.建立一個檔案輸入流
FileInputStream fis = new FileInputStream("test.txt");
// 2.建立一個檔案輸出流
FileOutputStream fos = new FileOutputStream("text.txt");
// 3.建立一個陣列
byte[] data = new byte[1024];
while (true) {
// 4.讀取資料
int len = fis.read(data);
// 7.判斷讀取的長度是否為 -1
if (len == -1){
System.out.println("檔案複製成功");
break;
}
// 5.寫資料
fos.write(data, 0, len);
}
// 6.關閉管道流
fis.close();
fos.close();
}
}
4.2.ByteArray 位元組流
Byte 位元組流:ByteArrayInputStream(位元陣列輸入流)、ByteArrayOutputStream(位元陣列輸出流)
特點:包含一個緩衝區,該緩衝區儲存從流中讀取的資料
API:
- ByteArrayInputStream(byte[] buf)
- ByteArrayInputStream(byte[] buf, int offset, int length)
import java.io.*;
/**
* 檔案複製
*/
public class ByteArrayStreamDemo {
public static void main(String[] args) throws IOException {
// 1.建立一個檔案管道流
FileInputStream fis = new FileInputStream("E:\\software\\developSoftware\\Java\\JavaSE\\basic\\src\\test.txt");
// 2.建立另一個檔案輸出流
FileOutputStream fos = new FileOutputStream("E:\\software\\developSoftware\\Java\\JavaSE\\basic\\src\\123.txt");
// 3.建立陣列管道流
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
// 5.定義陣列
byte[] data = new byte[1024];
while (true) {
// 4.讀取資料
int len = fis.read(data);
// 7.跳出
if (len == -1) break;
// 6.寫資料
bos.write(data, 0, len);
}
bos.writeTo(fos);
// 8.關閉管道
fis.close();
fos.close();
bos.close();
}
}
4.3.Data 位元組流
Data 位元組流:DataInputStream(資料輸入流)、DataOutputStream(資料輸出流)
特點:讀取資料就是 Java 的資料型別,屬於處理流
import java.io.*;
public class DateStreamDemo {
public static void main(String[] args) throws IOException {
//1.建立輸入管道流
DataInputStream dis = new DataInputStream(new FileInputStream("test.txt"));
//2.建立一個輸出管道流
DataOutputStream dos = new DataOutputStream(new FileOutputStream("text.txt"));
//3.邊讀邊寫
byte[] data = new byte[1024];
while (true){
int len = dis.read(data);
if (len == -1) break;
dos.write(data, 0 ,len);
}
//4.關閉管道
dis.close();
dos.close();
}
}
4.4.緩衝位元組流
緩衝位元組流:BufferedInputStream(緩衝輸入位元組流)、BufferedOutputStream(緩衝輸出位元組流)
特點:
- 處理了,一邊和程式連線,一邊和修飾流或者節點流連線。不能直接面對外部介質(檔案、網路)
- 緩衝流中的緩衝區為了提高讀取或寫入的效率,將讀取或寫入的文字暫時儲存在緩衝區,當緩衝區滿了之後,一起將資料讀出或寫入,減少讀寫的次數
API:
- BufferedInputStream(InputStream is)
- BufferedOutputStream(InputStream is)
- int read(byte[] b):將讀取檔案內容放置在 byte[] 陣列中,然後返回讀取的位元組數。int:讀取的位元組數。如果讀到末尾,返回 -1
import java.io.*;
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//1.建立一個輸入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
//2.建立一個輸出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("text.java"));
//3.邊讀邊寫
byte[] data = new byte[1024];
while (true){
int len = bis.read();
if (len == -1) break;
bos.write(data, 0, len);
bos.flush(); //當緩衝區滿了就會自動刷出
}
//4.關閉流
bis.close();
bos.close();
}
}
5.IO 字元流
5.1.輸入輸出字元流
輸入輸出字元流:Reader(輸入字元流)、Writer(輸出字元流)
特點:
- 讀寫的內容是字元
- 是抽象類
- 是字元流的根類
- 讀取的檔案是文字檔案
PAI:
- int read():讀取文字檔案內容
- void write(int ):寫入檔案
- void close():關閉管道
5.2.檔案輸入輸出字元流
FileReader(檔案輸入字元流)、FileWriter(檔案輸出字元流)
特點:讀資料方式是字元、屬於節點流
API:
- FileReader(String fileName):根據路徑載入檔案,並且建立和程式的輸入管道
- FileWriter(String fileName):根據路徑載入檔案,並且建立和程式的輸出管道
- int reader(char[] c)
- void write(char[] c);
- void flush();
- void close();
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//獲取檔案路徑
String path = FileReaderDemo.class.getResource("").getPath();
//1.建立檔案輸入字元流
FileReader reader = new FileReader(path + "test.txt");
//2.輸出字元流
FileWriter writer = new FileWriter(path +"text.txt");
while (true){
//3.讀取檔案內容
int buf = reader.read();
if (buf == -1) break;
//將字元寫入檔案
writer.write(buf);
//情況緩衝區
writer.flush();
}
//關閉管道流
reader.close();
writer.close();
}
}