學習Java的同學注意了!!!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!
Java IO流(InputStream/OutputSteam)
甚么是IO流?
byte序列的讀寫,Java中的IO流是實現輸入/輸出的基礎.
1)
InputStream : 抽象類讀取數據的進程 包括讀取方法read();
in 模仿了讀取小說的進程
簡單說 : in是讀取文件的
OutputStream:抽象了寫出數據的進程 包括寫出方法write();
out模仿了寫筆記記錄的進程
簡單說 : out是寫入文件的
基本的byte流
InputStream(抽象方法read())
|--- FileInputStream(read()在文件上讀取) 節點流
|
|--- FilterInputStream 過濾器流,輸入流功能的擴大
| |--- DataInputStream(readInt()) 基本類型數據的讀取
| |--- BufferedInputStream 提供讀取緩沖區管理
| --- ObjectInputStream 過濾器流,依賴基本byte流,擴大對象的反序列化
OutputStream(抽象方法write())
|--- FileOutputStream(write()在文件上寫實現寫入) 節點流
|
|--- FilterOutputStream 過濾器流,輸出流功能的擴
| |--- DataOutputStream(writerInt()) 基本類型數據的寫出
| |--- BufferedOutputStream 提供了輸出緩沖區管理
| --- ObjectOutputStream 過濾器流,依賴基本byte流,擴大對象的序列化
注意:除節點流外都是過濾器流
字符流,可以處理字符編碼,底層依賴于byte流
Reader 讀取文本
| --- InputStreamReader 過濾去,依賴基本byte輸入流
| 實現文本編碼的解析
|
| --- BufferedReader 過濾器, 需要依賴Reader 實例
| 提供了readLine()方法, 可以在文本文件中讀取1行
| 是經常使用的文本讀取方法
Writer
| --- OutputStreamWriter 過濾器,,依賴基本byte輸出流
| 實現文本編碼
| --- PrintWriter 過濾器,依賴于Writer 流
| 提供了輸出文本常有方法println()
2) EOF = End of File = ⑴ (文件讀到末尾會返回⑴)
3) 輸入流的基本方法
InputStream in = new InputStream(file) / /file是文件名
int b = in.read(); 讀取1個byte無符號填充到int底8位,⑴是EOF
int.read(byte[] buf) 讀取數據填充到buf中
int.read(byte[] buf,int start,int size) 讀取數據填充到buf中
in.close 關閉輸入流
4)輸出流的基本方法:
OutputStream out = new OutputStream(file) / /file是文件名
out.write(int b) 寫出1個byte 到流 b 的底8位寫出
out.write(byte[] buf) 將buf的1部份寫入流中
out.write(byte[] buf, int start, int size) 將buf的1部份寫入流中
out.flush() 清算緩存
out.close
1.FileInputStream (read()在文件上讀取) 節點流
方法: read() 從輸入流中讀取數據的下1個字節
read(byte[] buf) 從輸入流中讀取1定數量的字節,并將其存儲在緩沖區數組 buf中
read(byte[] b, int off, int len) 將輸入流中最多 len 個數據字節讀入 byte 數組。
例
1 import java.io.FileInputStream; 2 import java.io.IOException; 3 import java.io.InputStream; 4 5 public class InputStreamDemo { 6 public static void main(String[] args) 7 throws IOException { 8 String file = "out.txt"; 9 InputStream in = new FileInputStream(file); 10 int b; 11 while((b=in.read())!=⑴){//read()方法 12 System.out.print(Integer.toHexString(b) + " "); 13 } 14 in.close(); 15 16 in = new FileInputStream(file); 17 //in.available() 可以讀取的數據個數,小文件1般是文件長度 18 byte[] buf = new byte[in.available()]; 19 in.read(buf);//read(byte[] buf)方法重載 20 in.close(); 21 for (byte c : buf) { 22 System.out.print(Integer.toHexString(c & 0xff) + " "); 23 // c & 0xff --->將16進制寫成0xff的格式 24 //ffffffd6---> d6 25 //11111111 11111111 11111111 11010110 &對應相乘 26 //00000000 00000000 00000000 11111111 0xff 27 //00000000 00000000 00000000 11010110 28 } 29 } 30 }
2 FileOutputStream(write()在文件上寫實現寫入) 節點流
方法 :write(int b) 將指定的字節寫入此輸出流。
write(byte[] buf) 將 b.length 個字節從指定的 byte 數組寫入此輸出流。
write(byte[] b, int off, int len) 將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此輸出流。
例子
1 import java.io.*; 2 3 public class OutputStreamDemo { 4 public static void main(String[] args) 5 throws IOException{ 6 String file = "out.txt"; 7 OutputStream out = new FileOutputStream(file); 8 out.write(65);//在文件中是以16進制存儲的,對應0x41 9 out.write(66);//0x42 10 byte[] buf = {(byte)0xd6,(byte)0xd0}; 11 out.write(buf); 12 out.flush();//刷出緩存,清算緩沖區,保證可靠寫 13 out.close(); 14 } 15 }
3.BufferedInputStream和BufferedOutputStream 的 用法
BufferedInputStream(FileInputStream in)
BufferedOutputStream(FileOutputStream out)
可以提高性能
例子
1 import java.io.BufferedInputStream; 2 import java.io.BufferedOutputStream; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8 public class BufferedStreamDemo { 9 public static void main(String[] args) throws IOException { 10 //BufferedInputStream普通寫法 11 String file = "out.txt"; 12 InputStream ins = new FileInputStream(file); 13 BufferedInputStream bufin= new BufferedInputStream(ins); 14 int b; 15 while((b=bufin.read())!=⑴){ 16 System.out.println(Integer.toHexString(b)); 17 } 18 //經常使用寫法,只要用到FileInputStream的地方都可以套1個BufferedInputStream用來提升性能 19 BufferedInputStream in = new BufferedInputStream( 20 new FileInputStream("out.txt")); 21 22 //BufferedOutputStream 23 BufferedOutputStream out = new BufferedOutputStream( 24 new FileOutputStream("out.txt")); 25 out.write(65); 26 } 27 }
4.基本類型數據的寫出和讀入
DataOutputStream 方法:readInt() readLong() readBoolean()等
寫出(寫)
1 例子 2 import java.io.*; 3 public class DataOutDemo { 4 public static void main(String[] args) 5 throws IOException{ 6 String file = "data.dat";//項目文件夾 7 OutputStream out = new FileOutputStream(file); 8 //DataOutputStream 實現基本類型數據的序列化 9 //將基本類型數據拆開為byte序列,寫入到out流中 10 DataOutputStream dos = new DataOutputStream(out); 11 dos.write(⑵); 12 dos.writeInt(⑵); 13 dos.writeLong(⑵); 14 dos.writeByte(⑵); 15 dos.writeDouble(⑵); 16 dos.writeShort(⑵); 17 dos.writeFloat(⑵); 18 dos.writeBoolean(true); 19 dos.writeChar('中'); 20 dos.close(); 21 22 } 23 }
DataInputStream 方法: writeInt() writeChar() 等8種
讀入(讀)
1 import java.io.DataInputStream; 2 import java.io.FileInputStream; 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 public class DataInDemo { 7 public static void main(String[] args) 8 throws IOException{ 9 10 String file = "data.dat"; 11 12 InputStream in = new FileInputStream(file); 13 //DataInputStream 從基本流中讀取基本類型數據,實現基本 14 //類型數據的反序列化 15 DataInputStream dis = new DataInputStream(in); 16 int b = dis.read(); 17 int i = dis.readInt(); 18 long l= dis.readLong(); 19 byte bx = dis.readByte(); 20 double d = dis.readDouble(); 21 short s = dis.readShort(); 22 float f = dis.readFloat(); 23 boolean bol = dis.readBoolean(); 24 char c = dis.readChar(); 25 dis.close(); 26 System.out.print( b +" ");//254 fe 27 System.out.print(i+" "); 28 System.out.print(l+" "); 29 System.out.print(bx+" "); 30 System.out.print(d+" "); 31 System.out.print(s+" "); 32 System.out.print(f+" "); 33 System.out.print(bol+" "); 34 System.out.print(c+" "); 35 36 } 37 }
5 字符串的序列化(文字的編碼方案)
從char序列到byte序列 的轉換,叫"編碼"
1) String 字符串本質上是Char
2)utf⑴6be 編碼-----將16位char從中間切開為2個byte
utf ⑴6be是將 unicode char[] 序列化為byte[]的編碼方案
能夠支持65535個字符編碼,英文浪費空間
如:
char[] = ['A', 'B', '中']
對應 0041,0042,4e2d
utf⑻:國際標準,是將unicode編碼為byte序列的方案,采取變長編碼 1-N方案,其中英文1個byte,中文3個byte
unicoded的" 中": 4e 2d = 01001110 00101101
utf⑻的"中":e4 b8 ad =11100100 10111000 10101101
1110xxxx 10xxxxxx 10xxxxxx
以0開頭的是英文(0⑴27)
110表示連續2字節表示1個字符
1110表示連續3字節表示1個字符
每一個數據字節以10開頭
GBK: 中國標準,支持20000+中日韓文,英文編碼1byte,中文2byte
與unicode不兼容,中文windows默許gbk
ISO8859⑴:只支持255個英文字符,不支持中文(Sun服務器默許編碼,如tomcat等)
例子
1 import java.io.FileOutputStream; 2 import java.io.IOException; 3 import java.io.OutputStream; 4 5 public class CharIODemo { 6 public static void main(String[] args) 7 throws IOException{ 8 String str = "ABCD中國"; 9 System.out.println(str); 10 //Java 的字符是16位 Unicode值,而文件是8位Byte序列 11 12 //GBK 13 System.out.println("GBK編碼方案,對字符編碼"); 14 String file = "gbk.txt"; 15 OutputStream out = new FileOutputStream(file);//默許GBK編碼方案 16 byte[] gbk = str.getBytes("GBK"); 17 out.write(gbk); 18 out.close(); 19 IOUtils.print(file); 20 //UTF⑴6BE,每一個編碼是2個字節 21 System.out.println("UTF⑴6BE編碼方案,對字符編碼"); 22 file = "utf⑴6be.txt"; 23 out = new FileOutputStream(file); 24 byte[] utf16be = str.getBytes("UTF⑴6BE"); 25 out.write(utf16be); 26 out.close(); 27 IOUtils.print(file); 28 29 //UTF⑻,英文是1個字節,中文是3個字節 30 System.out.println("UTF⑻編碼方案,對字符編碼"); 31 file = "utf⑻.txt"; 32 out = new FileOutputStream(file); 33 byte[] utf8 = str.getBytes("UTF⑻");//編碼string -> byte[] 34 out.write(utf8); 35 out.close(); 36 IOUtils.print(file); 37 38 byte[] buf = IOUtils.read("utf⑻.txt"); 39 //new String(buf,"UTF⑻"),構造器可以將 byte編碼序列 40 //解碼為 char序列(字符串) 41 String s = new String(buf,"UTF⑻");//解碼byte-> String 42 System.out.println(s); 43 } 44 }
6 字符流IO(Reader Writer)
1) 字符的處理,1次處理1個字符(unicode編碼)
2) 字符的底層依然是基本的字節流
3) 字符流的基本實現
InputStreamReader 完成byte流解析為char流,依照編碼解析
OutputStreamWriter 提供char流到byte流,依照編碼處理
4) 字符流的過濾器
是字符讀寫的功能擴大,極大的方便了文本的讀寫操作
BufferedReader : readLine() 1次讀取1行
PrintWriter : println() 1次打印1行
5)讀取1個文本文件
InputStream is = new FileInputStream("test.txt");
Reader in = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(in);
或
BufferedReader in = new BufferedReader(new FileReader(filename));
例子:
1 import java.io.BufferedInputStream; 2 import java.io.BufferedReader; 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 public class TestReaderDemo { 8 public static void main(String[] args) 9 throws IOException{ 10 //Scanner BufferedReader都是流的功能擴大,是過濾器 11 // 不能單獨使用,終究需要依賴于基本byte流(in) 12 //Scanner 提供了nextLine()方法//Java5以后 13 //BufferedReader 提供了 readLine()方法,讀取1行 14 //readLine()讀取到文件末尾返回null 15 16 //逐行讀取文本文件,顯示到系統控制臺 17 //工作中經常使用 18 String file = "in.txt"; //為當前工作區workspace/項目名/in.txt 19 BufferedReader in = new BufferedReader( 20 new InputStreamReader( 21 new BufferedInputStream( 22 new FileInputStream(file)),"gbk")); 23 String str; 24 while((str = in.readLine()) != null){ 25 System.out.println(str); 26 } 27 in.close(); 28 }
6)寫出1個文本文件
PrintWriter out = new PrintWriter(new FileWriter(new FileOutputStream(filename)));
或
PrintWriter out = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream(filename)))
例子
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 import java.util.Scanner; 4 5 public class SyncWriteDemo { 6 public static void main(String[] args) 7 throws IOException{ 8 Scanner in = new Scanner(System.in); 9 String file = "sync.txt"; 10 PrintWriter out = new PrintWriter(file,"UTF⑻"); 11 while(true){ 12 String str = in.nextLine(); 13 out.println(str); 14 if("q".equalsIgnoreCase(str)){ 15 break; 16 } 17 } 生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
![]()