一、流類
Java的流式輸入/輸出建立在四個抽象類的基礎上:InputStream,OutputStream,Reader和Writer。它們用來創建具體流式子類。儘管程序通過具體子類執行輸入/輸入,但是頂層的類定義了所有流類的基本通用功能。
InputStream和OutputStream設計成字節流類。Reader和Writer爲字符流設計。字節流和字符流類形成分離的層次結構。一般,處理字符和字符串時應使用字符流類,處理字節或二進制對象時應用字節流類。
在操作文件流時,按以下方式進行:
1.使用File類找到一個文件
2.通過File類的對象去實例化字節流或字符流的子類
3.進行字節或字符的讀、寫操作
4.關閉文件流
二、字節流
FileInputStream類:能從文件讀取字節,常用的兩個構造方法:
//參數爲文件的絕對路徑
FileInputStream(String filepath)
//參數爲文件File的對象
FileInputStream(File fileObj)
FileOutputStream類:能向文件寫入字節,常用的兩個構造方法:
//參數爲文件的絕對路徑
FileOutputStream(String filePath)
//參數爲文件File的對象
FileOutputStream(File fileObj)
//如果append爲true,文件則以設置搜索路徑模式打開
FileOutputStream(String filePath,boolean append)
示例:
import java.io.*;
public class StreamDemo{
public static void main(String args[]){
File f = new File("c:\\temp.txt") ;
OutputStream out = null ;
try{
out = new FileOutputStream(f) ;
}catch (FileNotFoundException e){
e.printStackTrace();
}
// 將字符串轉成字節數組
byte b[] = "Hello World!!!".getBytes() ;
try{
// 將 byte 數組寫入到文件之中
out.write(b) ;
}catch (IOException e1){
e1.printStackTrace();
}
try{
out.close() ;
}catch (IOException e2){
e2.printStackTrace();
}
// 以下爲讀文件操作
InputStream in = null ;
try{
in = new FileInputStream(f) ;
}catch (FileNotFoundException e3){
e3.printStackTrace();
}
// 開闢一個空間用於接收文件讀進來的數據
byte b1[] = new byte[1024] ;
int i = 0 ;
try{
// 將 b1 的引用傳遞到 read()方法之中,同時此方法返回讀入數據的個數
i = in.read(b1) ;
}catch (IOException e4){
e4.printStackTrace();
}
try{
in.close() ;
}catch (IOException e5){
e5.printStackTrace();
}
//將 byte 數組轉換爲字符串輸出
System.out.println(new String(b1,0,i)) ;
}
}
執行結果:
三、字符流
FileReader類:可以讀取文件內容,常用的構造方法同FileInputStream
FileWriter類:可以寫文件,常用的構造方法同FileOutputStream
示例:
import java.io.*;
public class CharDemo{
public static void main(String args[]){
File f = new File("c:\\temp.txt") ;
Writer out = null ;
try{
out = new FileWriter(f) ;
}catch (IOException e){
e.printStackTrace();
}
// 聲明一個 String 類型對象
String str = "Hello World!!!" ;
try{
// 將 str 內容寫入到文件之中
out.write(str) ;
}catch (IOException e1){
e1.printStackTrace();
}
try{
out.close() ;
}catch (IOException e2){
e2.printStackTrace();
}
// 以下爲讀文件操作
Reader in = null ;
try{
in = new FileReader(f) ;
}catch (FileNotFoundException e3){
e3.printStackTrace();
}
// 開闢一個空間用於接收文件讀進來的數據
char c1[] = new char[1024] ;
int i = 0 ;
try{
// 將 c1 的引用傳遞到 read()方法之中,同時此方法返回讀入數據的個數
i = in.read(c1) ;
}catch (IOException e4){
e4.printStackTrace();
}
try{
in.close() ;
}catch (IOException e5){
e5.printStackTrace();
}
//將字符數組轉換爲字符串輸出
System.out.println(new String(c1,0,i)) ;
}
}
輸出結果:
三、字節流與字符流的轉換
字節流和字符流之間轉換的類:
InputStreamReader類:將一個字節流中的字節解碼成字符。主要的構造函數:
// 用默認字符集創建一個 InputStreamReader 對象
InputStreamReader(InputStream in)
// 接受已指定字符集名的字符串,並用該字符集創建對象
InputStreamReader(InputStream in,String CharsetName)
OuputStreamWriter類:將寫入的字符編碼成字節後寫入一個字節流。主要的構造函數:
// 用默認字符集創建一個 OutputStreamWriter 對象
OutputStreamWriter(OutputStream in)
// 接受已指定字符集名的字符串,並用該字符集創建 OutputStreamWriter 對象
OutputStreamWriter(OutputStream in,String CharsetNarme)
爲了達到最高的效率,避免頻繁地進行字符與字節間的相互轉換,最好不要直接使用這兩個類來進行讀寫,應儘量使用 BufferedWriter類包裝 OutputStreamWriter類,用 BufferedReader類包裝 InputStreamReader類。
例如:
BufferedWriter out=new BufferedWriter(newOutputStreamWriter(System.out));
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
示例:
import java.io.*;
public class BufferDemo{
public static void main(String args[]){
BufferedReader buf = null;
//System.in是inputStream類型
//先講字節流轉換成字符流,再將字符流放入到了BufferedReader中
buf = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while (true){
System.out.print("請輸入數字:");
try{
//等待鍵盤輸入數據
str = buf.readLine();
} catch (IOException e){
e.printStackTrace();
}
int i = -1;
try{
//將輸入的字符串轉換成基本數據類型中的整型
i = Integer.parseInt(str);
i++;
//將數據+1後輸出
System.out.println("輸入的數字修改後爲:" + i);
break;
}catch (Exception e){
System.out.println("輸入的內容不正確,請重新輸入!");
}
}
}
}
執行結果: