Java流操作有關的類或接口:
Java流類圖結構:
FilInputStream文件輸入流(字節輸入流)
FilterInputStream過濾輸入流(封裝其他輸入流)
BufferInputStream緩衝輸入流
ObjectInputStream 對象輸入流
ByteArrayInputStream字節數組輸入流
PrintStream字節打印流
InputStreamReader轉換流(字節到字符的轉換)
OutStreamWrite轉換流(字符到字節的轉換)
StringWriter 字符輸出流
IO流的分類
根據處理數據類型的不同分爲:字符流和字節流
根據數據流向不同分爲:輸入流和輸出流
字符流和字節流
字節流:以字節爲單位讀取的流
字符流:以字符爲單位讀取的流
字節流和字符流的區別:
讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。
處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
結論:只要是處理純文本數據,就優先考慮使用字符流。 除此之外都使用字節流。
1.1 FileOutputStream類
(1)基本概念
java.io.FileOutputStream類主要用於將字節流數據寫入到輸出流中。
(2)常用的方法
FileOutputStream(String name) - 按照參數指定的路徑構造對象。
FileOutputStream(String name, boolean append) - 按照追加的方式構造對象與指定的路徑關聯。
void write(int b) - 寫入單個字節。
void write(byte[] b, int off, int len) - 寫入數組中的一部分字節數據。 > void write(byte[] b) - 寫入整個數組的字節數據。
void flush() - 刷新輸出流並強制寫入緩衝數據。
void close() - 關閉輸出流並釋放資源。
1.2 FileInputStream類
(1)基本概念
java.io.FileInputStream類用於讀取諸如圖像之類的原始字節流。
(2)常用的方法
FileInputStream(String name) - 根據參數指定的文件進行關聯並創建對象。
int read() - 用於讀取一個字節數據,返回-1表示讀到文件末尾,否則返回數據。
int read(byte[] b) - 用於讀滿整個字節數組。
- 若讀到文件尾就返回-1,否則返回實際讀取的字節數。
int read(byte[] b, int off, int len) - 用於讀滿字節數組的一部分空間。
void close() - 關閉流並釋放資源。
1.3 DataOutputStream類
(1)基本概念java.io.DataOutputStream類用於將java中的基本數據類型寫入輸出流中。
(2)常用的方法
DataOutputStream(OutputStream out) - 根據參數指定的引用構造對象。
void writeInt(int v) - 用於將參數指定的整數寫入輸出流中。
void flush() - 刷新輸出流 void close() - 關閉輸出流
1.4 DataInputStream類
(1)基本概念
java.io.DataInputStream類用於讀取java中的基本數據類型。
(2)常用的方法
DataInputStream(InputStream in) - 根據參數指定的引用構造對象。
- 引用是一個抽象類,實參需要傳遞子類的對象。
void close() - 關閉輸入流。
1.5 BufferedReader類
(1)基本概念
java.io.BufferedReader類用於讀取單個字符、字符數組、一行字符的數據。
(2)常用的方法
BufferedReader(Reader in) - 根據參數指定的引用構造對象。
- Reader是個抽象類,實參傳遞子類的對(InputStreamReader)。
String readLine() - 用於讀取一行文本。
void close() - 關閉流對象並釋放資源
1.6 PrintStream類
(1)基本概念 java.io.PrintStream類用於打印各種數據內容。
(2)常用的方法 PrintStream(OutputStream out) - 根據參數指定的引用構造對象。
- OutputStream類是個抽象類,實參需要傳遞子類的對象。 >void print(String s) - 打印參數指定的字符串。 void println(String x) - 打印字符串並換行。 void close() -
關閉流。 void flush() - 刷新流對象。
1.7 ObjectOutputStream類
(1)基本概念
java.io.ObjectOutputStream類用於將一個對象整體寫入到輸出流中。
只能將支持 java.io.Serializable 接口的對象寫入流中。
類通過實現 java.io.Serializable 接口以啓用其序列化(將整個對象的所有信息轉換爲字節流信息的過程)功能。
(2)常用的方法
ObjectOutputStream(OutputStream out) - 根據參數指定的引用構造對象。
- OutputStream類是抽象類,實參傳遞該類的子類對象。
void writeObject(Object obj) - 將參數指定的對象整體寫入到流中。
void flush() - 刷新流對象。
void close() - 關閉流對象。
1.8 ObjectInputStream類
(1)基本概念
java.io.ObjectInputStream類用於將文件的對象整體讀取出來。
(2)常用的方法
ObjectInputStream(InputStream in) - 根據參數指定的引用構造對象。
- InputStream類是個抽象類,實參需要傳遞子類的對象。
Object readObject() - 用於讀取輸入流中的一個對象並返回。
- 無法根據返回值來判斷是否讀取到文件的末尾。
void close() - 關閉流對象。
經驗:
當需要向文件中寫入多個對象時,通常的做法是先將所有被寫入的對象放入一個集合中,然後將該集合整體看做一個對象寫入文件中,此時讀取文件中的內容時,只需要調用一次readObject()方法就可以全部讀出。
7.字符流與字節流轉換
轉換流的特點:
1.其是字符流和字節流之間的橋樑
2.可對讀取到的字節數據經過指定編碼轉換成字符
3.可對讀取到的字符數據經過指定編碼轉換成字節 何時使用轉換流?
1.當字節和字符之間有轉換動作時;
2.流操作的數據需要編碼或解碼時。
具體的對象體現:
1.InputStreamReader:字節到字符的橋樑
2.OutputStreamWriter:字符到字節的橋樑 這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。
8.File類
File類是對文件系統中文件以及文件夾進行封裝的對象,可以通過對象的思想來操作文件和文件夾。
File類保存文件或目錄的各種元數據信息,包括文件名、文件長度、最後修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、獲得當前目錄中的文件列表,創建、刪除文件和目錄等方法。
9.RandomAccessFile類
該對象並不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩衝區(字符數組),通過內部的指針來操作字符數組中的數據。 該對象特點:
1.該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。
2.該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)
代碼:
鍵入
public static void main(String[] args) {
//1.創建BufferedReader類型的對象與鍵盤輸入(System.in)進行關聯
BufferReader br=new BufferReader(new InputStreamReader(System.in));
PrintStream ps=new Println(new FileOutputStream("c:/a.txt"));
//3.不斷地提示用戶輸入並讀取一行本文,並且寫入到c:/a.txt中
int flage=1;
while(true){
System.out.println();
String str=br.readLine();
if("byte".equals(str))break;
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh24:mm:ss");
ps.println(sdf.format(d)+(flage%2==0? "張三說:":"李四說:")+str);
flage++;
}
ps.flush();
ps.close();
br.close();
讀取數據
public static void main(String[] args){
//1.創建DataInputStream類的對象與參數指定的文件關聯
DataInputStream dis=new DataInputStream(new FileInputStream("c:/a.txt"));
//2.讀取文件中的一個int類型數據並打印出來
int res=dis.readInt();
System.out.println("res="+res);
dis.close();
}
public static void main(String[] args) {
//1.創建DataOutputStream的對象與參數指定的文件進行關聯
DataOutputStream dos = new DataOutputStream(
new FileOutputStream("c:/a.txt"));
//2.將整數數據66寫入文件
dos.writeInt(88);
//3.關閉輸出流對象
dos.close();
}
目錄文件打印
public class TestDirPrint {
//打印指定目錄中的內容,要求子目錄中的內容也要打印出來
public static void dirPrint(File f){
//1.若f關聯的是普通文件,則直接打印文件名即可
if(f.isFile()){
System.out.println(f.getName());
}
//2.若f關聯的是目錄文件,則打印目錄名的同時使用[]括起來
if(f.isDirectory()){
System.out.println("[" + f.getName() + "]");
//3.獲取該目錄中的所有內容,分別進行打印
File[] ff = f.listFiles();
for(File ft : ff){
dirPrint(ft);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestDirPrint.dirPrint(new File("D:/java09/day16"));
System.out.println(10/0);
}
}
**複製文件**
public class TestFileCopy {
public static void main(String[] args) {
try{
//1.建立FileInputStream類的對象與源文件建立關聯
FileInputStream fis
= new FileInputStream("D:/java09/day16/javaseday16-IO流常用的類-06.wmv");
//2.建立FileOutputStream類的對象與目標文件建立關聯
FileOutputStream fos = new FileOutputStream("c:/javaseday16-IO流常用的類-06.wmv");
//3.不斷地讀取源文件中的內容並寫入到目標文件中
/* 可以實現文件的拷貝,但是文件比較大時效率很低
int res = 0;
while((res = fis.read()) != -1){
fos.write(res);
}
*/
//第二種方案,根據源文件的大小準備對應的緩衝區(數組),可能導致內存溢出
//第三種方案,無論文件的大小是多少,每次都準備一個1024整數倍的數組
byte[] data = new byte[1024 * 8];
int res = 0;
while((res = fis.read(data)) != -1){
fos.write(data, 0, res);
}
System.out.println("拷貝文件結束!");
//4.關閉文件輸入流對象
fis.close();
//5.關閉文件輸出流對象
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public class TestFileInputStream {
public static void main(String[] args) {
try{
//1.創建FileInputStream類的對象與指定的文件關聯
FileInputStream fis = new FileInputStream("c:/a.txt");
//2.讀取文件中的內容並打印
/*
int res = fis.read();
System.out.println("讀取到的一個字節是:" + res); //h
System.out.println("\'h\'的ASCII值是:" + (int)'h');
res = fis.read();
System.out.println("讀取到的一個字節是:" + res); //e
System.out.println("\'h\'的ASCII值是:" + (int)'e');
*/
/*
int res = 0;
while((res = fis.read()) != -1){
System.out.println("讀取到的一個字節是:" + (char)res); //
}*/
byte[] data = new byte[10];
int res = fis.read(data);
System.out.println("實際讀取到的數據大小是:"
+ res + ",讀取到的文件內容是:" + new String(data, 0, res)
+ "!");
//3.關閉流對象並釋放資源
fis.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
創建文件寫入數據
public class TestFileOutputStream {
public static void main(String[] args) {
try{
//1.創建FileOutputStream類的對象,與指定的文件關聯
//若文件不存在,則自動創建新的空文件
//FileOutputStream fos = new FileOutputStream("c:/a.txt", true);
fos.write("hello".getBytes());
System.out.println("寫入數據成功!");
//3.刷新緩衝區並關閉流對象
fos.flush();
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
讀取對象object
public class TestObjectInputStream {
public static void main(String[] args) {
try{
//1.創建ObjectInputStream類型的對象與指定的文件關聯
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("c:/user.dat"));
//2.讀取文件中的一個對象並打印出來
Object obj = ois.readObject();
if(obj instanceof User){
User user = (User)obj;
System.out.println(user);
}
//3.關閉流對象
ois.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
public class TestObjectOutputStream {
public static void main(String[] args) {
try{
//1.創建ObjectOutputStream類的對象與指定的文件關聯
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("c:/user.dat"));
//2.準備User類型的對象並進行初始化
User user = new User("Mark", "123456", "[email protected]");
//3.將User類型的對象整體寫入到文件中
oos.writeObject(user);
System.out.println("寫入對象成功!");
//4.關閉輸出流對象
oos.flush();
oos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}