多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java核心類庫——IO原理和用法

Java核心類庫——IO原理和用法

來源:程序員人生   發布時間:2017-02-24 11:14:21 閱讀次數:3622次

學習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   }

 生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费国产成人高清在线观看不卡 | 性xxxxfrxxxxxx欧美 | 中文字幕色视频 | 一级毛片毛片毛片毛毛片 | 欧美激情一区二区三区在线 | 日韩中文字幕久久精品 | 亚洲一区二区三区不卡视频 | 欧美韩日国产 | 国内小情侣一二三区在线视频 | 美国毛片亚洲社区在线观看 | 第一福利在线观看 | 97久久影院| 在线观看国产小视频 | 国产欧美日韩综合精品一区二区 | 欧美高清一区二区三区欧美 | 亚洲码在线观看 | 亚洲欧美日韩天堂 | 国产不卡a | 欧美片第一页 | 精品久久久久国产免费 | 亚洲成人黄色在线观看 | 欧美日韩亚洲综合久久久 | 亚洲欧美日韩国产一区二区精品 | 2018久久久国产精品 | 中文字幕23页 | 亚洲男人影院 | 国产真实女人一级毛片 | 亚洲主播在线 | wwwwww日本| 国产久7精品视频 | 久久精品免费一区二区三区 | 美女网站免费观看视频 | 欧美成人亚洲欧美成人 | 中文字幕一区二区三区四区五区 | 欧美洲精品亚洲精品中文字幕 | 中文字幕乱偷乱码亚洲 | 成人a毛片久久免费播放 | 波多野结衣在线观看网址 | 日韩一区国产一级 | 性猛交xxxxx按摩 | 性的小视频在线观看免费 |