乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      java基礎(chǔ)學(xué)習(xí)總結(jié)-流

       橋橋doc 2016-06-15

      一、JAVA流式輸入/輸出原理

        

        流是用來讀寫數(shù)據(jù)的,java有一個(gè)類叫File,它封裝的是文件的文件名,只是內(nèi)存里面的一個(gè)對(duì)象,真正的文件是在硬盤上的一塊空間,在這個(gè)文件里面存放著各種各樣的數(shù)據(jù),我們想讀文件里面的數(shù)據(jù)怎么辦呢?是通過一個(gè)流的方式來讀,咱們要想從程序讀數(shù)據(jù),對(duì)于計(jì)算機(jī)來說,無論讀什么類型的數(shù)據(jù)都是以010101101010這樣的形式讀取的。怎么把文件里面的數(shù)據(jù)讀出來呢?你可以把文件想象成一個(gè)小桶,文件就是一個(gè)桶,文件里面的數(shù)據(jù)就相當(dāng)于是這個(gè)桶里面的水,那么我們怎么從這個(gè)桶里面取水呢,也就是怎么從這個(gè)文件讀取數(shù)據(jù)呢。

        常見的取水的辦法是我們用一根管道插到桶上面,然后在管道的另一邊打開水龍頭,桶里面的水就開始嘩啦嘩啦地從水龍頭里流出來了,桶里面的水是通過這根管道流出來的,因此這根管道就叫流,JAVA里面的流式輸入/輸出跟水流的原理一模一樣,當(dāng)你要從文件讀取數(shù)據(jù)的時(shí)候,一根管道插到文件里面去,然后文件里面的數(shù)據(jù)就順著管道流出來,這時(shí)你在管道的另一頭就可以讀取到從文件流出來的各種各樣的數(shù)據(jù)了。當(dāng)你要往文件寫入數(shù)據(jù)時(shí),也是通過一根管道,讓要寫入的數(shù)據(jù)通過這根管道嘩啦嘩啦地流進(jìn)文件里面去。除了從文件去取數(shù)據(jù)以外,還可以通過網(wǎng)絡(luò),比如用一根管道把我和你的機(jī)子連接起來,我說一句話,通過這個(gè)管道流進(jìn)你的機(jī)子里面,你馬上就可以看得到,而你說一句話,通過這根管道流到我的機(jī)子里面,我也馬上就可以看到。有的時(shí)候,一根管道不夠用,比方說這根管道流過來的水有一些雜質(zhì),我們就可以在這個(gè)根管道的外面再包一層管道,把雜質(zhì)給過濾掉。從程序的角度來講,從計(jì)算機(jī)讀取到的原始數(shù)據(jù)肯定都是010101這種形式的,一個(gè)字節(jié)一個(gè)字節(jié)地往外讀,當(dāng)你這樣讀的時(shí)候你覺得這樣的方法不合適,沒關(guān)系,你再在這根管道的外面再包一層比較強(qiáng)大的管道,這個(gè)管道可以把010101幫你轉(zhuǎn)換成字符串。這樣你使用程序讀取數(shù)據(jù)時(shí)讀到的就不再是010101這種形式的數(shù)據(jù)了,而是一些可以看得懂的字符串了。

       二、輸入輸出流分類

        io包里面定義了所有的流,所以一說流指的就是io包里面的

        什么叫輸入流?什么叫輸出流?用一根管道一端插進(jìn)文件里程序里面,然后開始讀數(shù)據(jù),那么這是輸入還是輸出呢?如果站在文件的角度上,這叫輸出,如果站在程序的角度上,這叫輸入。

        記住,以后說輸入流和輸出流都是站在程序的角度上來說。

      三、節(jié)點(diǎn)流和處理流

        

         你要是對(duì)原始的流不滿意,你可以在這根管道外面再套其它的管道,套在其它管道之上的流叫處理流。為什么需要處理流呢?這就跟水流里面有雜質(zhì),你要過濾它,你可以再套一層管道過濾這些雜質(zhì)一樣。

       3.1.節(jié)點(diǎn)流類型

        

        節(jié)點(diǎn)流就是一根管道直接插到數(shù)據(jù)源上面,直接讀數(shù)據(jù)源里面的數(shù)據(jù),或者是直接往數(shù)據(jù)源里面寫入數(shù)據(jù)。典型的節(jié)點(diǎn)流是文件流:文件的字節(jié)輸入流(FileInputStream),文件的字節(jié)輸出流(FileOutputStream),文件的字符輸入流(FileReader),文件的字符輸出流(FileWriter)。

      3.2.處理流類型

        

        處理流是包在別的流上面的流,相當(dāng)于是包到別的管道上面的管道。

       四、InputStream(輸入流)

        

        我們看到的具體的某一些管道,凡是以InputStream結(jié)尾的管道,都是以字節(jié)的形式向我們的程序輸入數(shù)據(jù)。

      4.1.InputStream的基本方法

        

         read()方法是一個(gè)字節(jié)一個(gè)字節(jié)地往外讀,每讀取一個(gè)字節(jié),就處理一個(gè)字節(jié)。read(byte[] buffer)方法讀取數(shù)據(jù)時(shí),先把讀取到的數(shù)據(jù)填滿這個(gè)byte[]類型的數(shù)組buffer(buffer是內(nèi)存里面的一塊緩沖區(qū)),然后再處理數(shù)組里面的數(shù)據(jù)。這就跟我們?nèi)∷粯?,先用一個(gè)桶去接,等桶接滿水后再處理桶里面的水。如果是每讀取一個(gè)字節(jié)就處理一個(gè)字節(jié),這樣子讀取也太累了。

       五、OutputStream(輸出流)

        

      5.1.OutputStream的基本方法

        

      六、Reader流

        

      6.1.Reader的基本方法

        

      七、Writer流

        

      7.1.Writer的基本方法

        

       八、節(jié)點(diǎn)流講解

        以File(文件)這個(gè)類型作為講解節(jié)點(diǎn)流的典型代表

        

       范例:使用FileInputStream流來讀取FileInputStream.java文件的內(nèi)容

      復(fù)制代碼
       1 package cn.galc.test;
       2 
       3 import java.io.*;
       4 
       5 public class TestFileInputStream {
       6     public static void main(String args[]) {
       7         int b = 0;// 使用變量b來裝調(diào)用read()方法時(shí)返回的整數(shù)
       8         FileInputStream in = null;
       9         // 使用FileInputStream流來讀取有中文的內(nèi)容時(shí),讀出來的是亂碼,因?yàn)槭褂肐nputStream流里面的read()方法讀取內(nèi)容時(shí)是一個(gè)字節(jié)一個(gè)字節(jié)地讀取的,而一個(gè)漢字是占用兩個(gè)字節(jié)的,所以讀取出來的漢字無法正確顯示。
      10         // FileReader in = null;//使用FileReader流來讀取內(nèi)容時(shí),中英文都可以正確顯示,因?yàn)镽eader流里面的read()方法是一個(gè)字符一個(gè)字符地讀取的,這樣每次讀取出來的都是一個(gè)完整的漢字,這樣就可以正確顯示了。
      11         try {
      12             in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\FileInputStream.java");
      13             // in = new FileReader("D:/java/io/TestFileInputStream.java");
      14         } catch (FileNotFoundException e) {
      15             System.out.println("系統(tǒng)找不到指定文件!");
      16             System.exit(-1);// 系統(tǒng)非正常退出
      17         }
      18         long num = 0;// 使用變量num來記錄讀取到的字符數(shù)
      19         try {// 調(diào)用read()方法時(shí)會(huì)拋異常,所以需要捕獲異常
      20             while ((b = in.read()) != -1) {
      21                 // 調(diào)用int read() throws Exception方法時(shí),返回的是一個(gè)int類型的整數(shù)
      22                 // 循環(huán)結(jié)束的條件就是返回一個(gè)值-1,表示此時(shí)已經(jīng)讀取到文件的末尾了。
      23                 // System.out.print(b+"\t");//如果沒有使用“(char)b”進(jìn)行轉(zhuǎn)換,那么直接打印出來的b就是數(shù)字,而不是英文和中文了
      24                 System.out.print((char) b);
      25                 // “char(b)”把使用數(shù)字表示的漢字和英文字母轉(zhuǎn)換成字符輸入
      26                 num++;
      27             }
      28             in.close();// 關(guān)閉輸入流
      29             System.out.println();
      30             System.out.println("總共讀取了" + num + "個(gè)字節(jié)的文件");
      31         } catch (IOException e1) {
      32             System.out.println("文件讀取錯(cuò)誤!");
      33         }
      34     }
      35 }
      復(fù)制代碼

      范例:使用FileOutputStream流往一個(gè)文件里面寫入數(shù)據(jù)

      復(fù)制代碼
       1 package cn.galc.test;
       2 
       3 import java.io.*;
       4 
       5 public class TestFileOutputStream {
       6     public static void main(String args[]) {
       7         int b = 0;
       8         FileInputStream in = null;
       9         FileOutputStream out = null;
      10         try {
      11             in = new FileInputStream("D:\\Java\\MyEclipse 10\\Workspaces\\AnnotationTest\\src\\cn\\galc\\test\\MyMouseAdapter.java");
      12             out = new FileOutputStream("D:/java/TestFileOutputStream1.java");
      13             // 指明要寫入數(shù)據(jù)的文件,如果指定的路徑中不存在TestFileOutputStream1.java這樣的文件,則系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)
      14             while ((b = in.read()) != -1) {
      15                 out.write(b);
      16                 // 調(diào)用write(int c)方法把讀取到的字符全部寫入到指定文件中去
      17             }
      18             in.close();
      19             out.close();
      20         } catch (FileNotFoundException e) {
      21             System.out.println("文件讀取失敗");
      22             System.exit(-1);// 非正常退出
      23         } catch (IOException e1) {
      24             System.out.println("文件復(fù)制失敗!");
      25             System.exit(-1);
      26         }
      27         System.out
      28                 .println("TestFileInputStream.java文件里面的內(nèi)容已經(jīng)成功復(fù)制到文件TestFileOutStream1.java里面");
      29     }
      30 }
      復(fù)制代碼

        FileInputStream和FileOutputStream這兩個(gè)流都是字節(jié)流,都是以一個(gè)字節(jié)為單位進(jìn)行輸入和輸出的。所以對(duì)于占用2個(gè)字節(jié)存儲(chǔ)空間的字符來說讀取出來時(shí)就會(huì)顯示成亂碼。

       范例:使用FileWriter(字符流)向指定文件中寫入數(shù)據(jù)

      復(fù)制代碼
       1 package cn.galc.test;
       2 
       3 /*使用FileWriter(字符流)向指定文件中寫入數(shù)據(jù)
       4 寫入數(shù)據(jù)時(shí)以1個(gè)字符為單位進(jìn)行寫入*/
       5 import java.io.*;
       6 public class TestFileWriter{
       7     public static void main(String args[]){
       8         /*使用FileWriter輸出流從程序把數(shù)據(jù)寫入到Uicode.dat文件中
       9         使用FileWriter流向文件寫入數(shù)據(jù)時(shí)是一個(gè)字符一個(gè)字符寫入的*/
      10         FileWriter fw = null;
      11         try{
      12                 fw = new FileWriter("D:/java/Uicode.dat");
      13                 //字符的本質(zhì)是一個(gè)無符號(hào)的16位整數(shù)
      14                 //字符在計(jì)算機(jī)內(nèi)部占用2個(gè)字節(jié)
      15                 //這里使用for循環(huán)把0~60000里面的所有整數(shù)都輸出
      16                 //這里相當(dāng)于是把全世界各個(gè)國家的文字都0~60000內(nèi)的整數(shù)的形式來表示
      17                 for(int c=0;c<=60000;c++){
      18                     fw.write(c);
      19                     //使用write(int c)把0~60000內(nèi)的整數(shù)寫入到指定文件內(nèi)
      20                     //調(diào)用write()方法時(shí),我認(rèn)為在執(zhí)行的過程中應(yīng)該使用了“(char)c”進(jìn)行強(qiáng)制轉(zhuǎn)換,即把整數(shù)轉(zhuǎn)換成字符來顯示
      21                     //因?yàn)榇蜷_寫入數(shù)據(jù)的文件可以看到,里面顯示的數(shù)據(jù)并不是0~60000內(nèi)的整數(shù),而是不同國家的文字的表示方式
      22             }
      23             /*使用FileReader(字符流)讀取指定文件里面的內(nèi)容
      24             讀取內(nèi)容時(shí)是以一個(gè)字符為單位進(jìn)行讀取的*/
      25                 int b = 0;
      26                 long num = 0;
      27                 FileReader fr = null;
      28                 fr = new FileReader("D:/java/Uicode.dat");
      29                 while((b = fr.read())!= -1){
      30                     System.out.print((char)b + "\t");
      31                     num++;
      32                 }
      33                 System.out.println();
      34                 System.out.println("總共讀取了"+num+"個(gè)字符");
      35         }catch(Exception e){
      36             e.printStackTrace();
      37         }
      38     }
      39 }
      復(fù)制代碼

        FileReaderFileWriter這兩個(gè)流都是字符流,都是以一個(gè)字符為單位進(jìn)行輸入和輸出的。所以讀取和寫入占用2個(gè)字節(jié)的字符時(shí)都可以正常地顯示出來,以上是以File(文件)這個(gè)類型為例對(duì)節(jié)點(diǎn)流進(jìn)行了講解,所謂的節(jié)點(diǎn)流指定就是直接把輸入流或輸出插入到數(shù)據(jù)源上,直接往數(shù)據(jù)源里面寫入數(shù)據(jù)或讀取數(shù)據(jù)。

      九、處理流講解

      9.1.第一種處理流——緩沖流(Buffering)

         

        帶有緩沖區(qū)的,緩沖區(qū)(Buffer)就是內(nèi)存里面的一小塊區(qū)域,讀寫數(shù)據(jù)時(shí)都是先把數(shù)據(jù)放到這塊緩沖區(qū)域里面,減少io對(duì)硬盤的訪問次數(shù),保護(hù)我們的硬盤。可以把緩沖區(qū)想象成一個(gè)小桶,把要讀寫的數(shù)據(jù)想象成水,每次讀取數(shù)據(jù)或者是寫入數(shù)據(jù)之前,都是先把數(shù)據(jù)裝到這個(gè)桶里面,裝滿了以后再做處理。這就是所謂的緩沖。先把數(shù)據(jù)放置到緩沖區(qū)上,等到緩沖區(qū)滿了以后,再一次把緩沖區(qū)里面的數(shù)據(jù)寫入到硬盤上或者讀取出來,這樣可以有效地減少對(duì)硬盤的訪問次數(shù),有利于保護(hù)我們的硬盤。

      緩沖流測試代碼:

      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 
       5 public class TestBufferStream {
       6     public static void main(String args[]) {
       7         FileInputStream fis = null;
       8         try {
       9             fis = new FileInputStream("D:/java/TestFileInputStream.java");
      10             // 在FileInputStream節(jié)點(diǎn)流的外面套接一層處理流BufferedInputStream
      11             BufferedInputStream bis = new BufferedInputStream(fis);
      12             int c = 0;
      13             System.out.println((char) bis.read());
      14             System.out.println((char) bis.read());
      15             bis.mark(100);// 在第100個(gè)字符處做一個(gè)標(biāo)記
      16             for (int i = 0; i <= 10 && (c = bis.read()) != -1; i++) {
      17                 System.out.print((char) c);
      18             }
      19             System.out.println();
      20             bis.reset();// 重新回到原來標(biāo)記的地方
      21             for (int i = 0; i <= 10 && (c = bis.read()) != -1; i++) {
      22                 System.out.print((char) c);
      23             }
      24             bis.close();
      25         } catch (FileNotFoundException e) {
      26             e.printStackTrace();
      27         } catch (Exception e1) {
      28             e1.printStackTrace();
      29         }
      30     }
      31 }
      復(fù)制代碼
      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 public class TestBufferStream1{
       5     public static void main(String args[]){
       6         try{
       7         BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\dat.txt"));
       8             //在節(jié)點(diǎn)流FileWriter的外面再套一層處理流BufferedWriter
       9             String s = null;
      10             for(int i=0;i<100;i++){
      11                 s = String.valueOf(Math.random());//“Math.random()”將會(huì)生成一系列介于0~1之間的隨機(jī)數(shù)。
      12                 // static String valueOf(double d)這個(gè)valueOf()方法的作用就是把一個(gè)double類型的數(shù)轉(zhuǎn)換成字符串
      13                 //valueOf()是一個(gè)靜態(tài)方法,所以可以使用“類型.靜態(tài)方法名”的形式來調(diào)用 
      14                 bw.write(s);//把隨機(jī)數(shù)字符串寫入到指定文件中
      15                 bw.newLine();//調(diào)用newLine()方法使得每寫入一個(gè)隨機(jī)數(shù)就換行顯示
      16             }
      17             bw.flush();//調(diào)用flush()方法清空緩沖區(qū)
      18             
      19         BufferedReader br = new BufferedReader(new FileReader("D:/java/dat.txt"));
      20                 //在節(jié)點(diǎn)流FileReader的外面再套一層處理流BufferedReader
      21             while((s = br.readLine())!=null){
      22                 //使用BufferedReader處理流里面提供String readLine()方法讀取文件中的數(shù)據(jù)時(shí)是一行一行讀取的
      23                 //循環(huán)結(jié)束的條件就是使用readLine()方法讀取數(shù)據(jù)返回的字符串為空值后則表示已經(jīng)讀取到文件的末尾了。
      24                 System.out.println(s);
      25                 
      26             }
      27         bw.close();
      28         br.close();
      29         }catch(Exception e){
      30             e.printStackTrace();
      31         }
      32     }
      33 }
      復(fù)制代碼

        

        程序的輸入指的是把從文件讀取到的內(nèi)容存儲(chǔ)到為程序分配的內(nèi)存區(qū)域里面去。流,什么是流,流無非就是兩根管道,一根向里,一根向外,向里向外都是對(duì)于我們自己寫的程序來說,流分為各種各樣的類型,不同的分類方式又可以分為不同的類型,根據(jù)方向來分,分為輸入流和輸出流,根據(jù)讀取數(shù)據(jù)的單位的不同,又可以分為字符流和字節(jié)流,除此之外,還可以分為節(jié)點(diǎn)流和處理流,節(jié)點(diǎn)流就是直接和數(shù)據(jù)源連接的流,處理流就是包在其它流上面的流,處理流不是直接和數(shù)據(jù)源連接,而是從數(shù)據(jù)源讀取到數(shù)據(jù)以后再通過處理流處理一遍。緩沖流也包含了四個(gè)類:BufferedInputStream、BufferedOutputStream、BufferedReaderBufferedWriter。流都是成對(duì)的,沒有流是是不成對(duì)的,肯定是一個(gè)in,一個(gè)out。

      9.2.第二種處理流——轉(zhuǎn)換流

        

        轉(zhuǎn)換流非常的有用,它可以把一個(gè)字節(jié)流轉(zhuǎn)換成一個(gè)字符流,轉(zhuǎn)換流有兩種,一種叫InputStreamReader,另一種叫OutputStreamWriter。InputStream是字節(jié)流,Reader是字符流,InputStreamReader就是把InputStream轉(zhuǎn)換成ReaderOutputStream是字節(jié)流,Writer是字符流,OutputStreamWriter就是把OutputStream轉(zhuǎn)換成Writer。把OutputStream轉(zhuǎn)換成Writer之后就可以一個(gè)字符一個(gè)字符地通過管道寫入數(shù)據(jù)了,而且還可以寫入字符串。我們?nèi)绻靡粋€(gè)FileOutputStream流往文件里面寫東西,得要一個(gè)字節(jié)一個(gè)字節(jié)地寫進(jìn)去,但是如果我們在FileOutputStream流上面套上一個(gè)字符轉(zhuǎn)換流,那我們就可以一個(gè)字符串一個(gè)字符串地寫進(jìn)去。

      轉(zhuǎn)換流測試代碼:

      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 
       5 public class TestTransform1 {
       6     public static void main(String args[]) {
       7         try {
       8             OutputStreamWriter osw = new OutputStreamWriter(
       9                     new FileOutputStream("D:/java/char.txt"));
      10             osw.write("MircosoftsunIBMOracleApplet");// 把字符串寫入到指定的文件中去
      11             System.out.println(osw.getEncoding());// 使用getEncoding()方法取得當(dāng)前系統(tǒng)的默認(rèn)字符編碼
      12             osw.close();
      13             osw = new OutputStreamWriter(new FileOutputStream(
      14                     "D:\\java\\char.txt", true), "ISO8859_1");
      15             // 如果在調(diào)用FileOutputStream的構(gòu)造方法時(shí)沒有加入true,那么新加入的字符串就會(huì)替換掉原來寫入的字符串,在調(diào)用構(gòu)造方法時(shí)指定了字符的編碼
      16             osw.write("MircosoftsunIBMOracleApplet");// 再次向指定的文件寫入字符串,新寫入的字符串加入到原來字符串的后面
      17             System.out.println(osw.getEncoding());
      18             osw.close();
      19 
      20         } catch (Exception e) {
      21             e.printStackTrace();
      22         }
      23     }
      24 }
      復(fù)制代碼
      復(fù)制代碼
      
      
      復(fù)制代碼
      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 public class TestTransform2{
       5     public static void main(String args[]){
       6         try{
       7             InputStreamReader isr = new InputStreamReader(System.in);
       8             //System.in這里的in是一個(gè)標(biāo)準(zhǔn)的輸入流,用來接收從鍵盤輸入的數(shù)據(jù)
       9             BufferedReader br = new BufferedReader(isr);
      10             String s = null;
      11             s = br.readLine();//使用readLine()方法把讀取到的一行字符串保存到字符串變量s中去
      12             while(s != null){
      13                 System.out.println(s.toUpperCase());//把保存在內(nèi)存s中的字符串打印出來
      14                 s = br.readLine();//在循環(huán)體內(nèi)繼續(xù)接收從鍵盤的輸入
      15                 if(s.equalsIgnoreCase("exit")){
      16                     //只要輸入exit循環(huán)就結(jié)束,就會(huì)退出
      17                     break;
      18                 }
      19             }
      20         }catch(Exception e){
      21             e.printStackTrace();
      22         }
      23     }
      24 }
      復(fù)制代碼

      9.3.第三種處理流——數(shù)據(jù)流

        

      數(shù)據(jù)流測試代碼:

      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 public class TestDataStream{
       5     public static void main(String args[]){
       6         ByteArrayOutputStream baos = new ByteArrayOutputStream();
       7         //在調(diào)用構(gòu)造方法時(shí),首先會(huì)在內(nèi)存里面創(chuàng)建一個(gè)ByteArray字節(jié)數(shù)組
       8         DataOutputStream dos = new DataOutputStream(baos);
       9         //在輸出流的外面套上一層數(shù)據(jù)流,用來處理int,double類型的數(shù)
      10         try{
      11             dos.writeDouble(Math.random());//把產(chǎn)生的隨機(jī)數(shù)直接寫入到字節(jié)數(shù)組ByteArray中
      12             dos.writeBoolean(true);//布爾類型的數(shù)據(jù)在內(nèi)存中就只占一個(gè)字節(jié)
      13         ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
      14             System.out.println(bais.available());
      15             DataInputStream dis = new DataInputStream(bais);
      16             System.out.println(dis.readDouble());//先寫進(jìn)去的就先讀出來,調(diào)用readDouble()方法讀取出寫入的隨機(jī)數(shù)
      17             System.out.println(dis.readBoolean());//后寫進(jìn)去的就后讀出來,這里面的讀取順序不能更改位置,否則會(huì)打印出不正確的結(jié)果
      18             dos.close();
      19             bais.close();
      20         }catch(Exception e){
      21                 e.printStackTrace();
      22             }
      23     }
      24 }
      復(fù)制代碼

        通過bais這個(gè)流往外讀取數(shù)據(jù)的時(shí)候,是一個(gè)字節(jié)一個(gè)字節(jié)地往外讀取的,因此讀出來的數(shù)據(jù)無法判斷是字符串還是bool類型的值,因此要在它的外面再套一個(gè)流,通過dataInputStream把讀出來的數(shù)據(jù)轉(zhuǎn)換就可以判斷了。注意了:讀取數(shù)據(jù)的時(shí)候是先寫進(jìn)去的就先讀出來,因此讀ByteArray字節(jié)數(shù)組數(shù)據(jù)的順序應(yīng)該是先把占8個(gè)字節(jié)的double類型的數(shù)讀出來,然后再讀那個(gè)只占一個(gè)字節(jié)的boolean類型的數(shù),因?yàn)?/span>double類型的數(shù)是先寫進(jìn)數(shù)組里面的,讀的時(shí)候也要先讀它。這就是所謂的先寫的要先讀。如果先讀Boolean類型的那個(gè)數(shù),那么讀出來的情況可能就是把double類型數(shù)的8個(gè)字節(jié)里面的一個(gè)字節(jié)讀了出來。 

      9.4.打印流——Print

        

      測試代碼:

      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 /*這個(gè)小程序是重新設(shè)置打印輸出的窗口,
       4  * 把默認(rèn)在命令行窗口輸出打印內(nèi)容設(shè)置成其他指定的打印顯示窗口
       5  */
       6 import java.io.*;
       7 public class TestPrintStream{
       8     public static void main(String args[]){
       9         PrintStream ps = null;
      10         try{
      11                 FileOutputStream fos = new FileOutputStream("D:/java/log.txt");
      12                 ps = new PrintStream(fos);//在輸出流的外面套接一層打印流,用來控制打印輸出
      13                 if(ps != null){
      14                     System.setOut(ps);//這里調(diào)用setOut()方法改變了輸出窗口,以前寫System.out.print()默認(rèn)的輸出窗口就是命令行窗口.
      15                     //但現(xiàn)在使用System.setOut(ps)將打印輸出窗口改成了由ps指定的文件里面,通過這樣設(shè)置以后,打印輸出時(shí)都會(huì)在指定的文件內(nèi)打印輸出
      16                     //在這里將打印輸出窗口設(shè)置到了log.txt這個(gè)文件里面,所以打印出來的內(nèi)容會(huì)在log.txt這個(gè)文件里面看到
      17                 }
      18             for(char c=0;c<=60000;c++){
      19                     System.out.print(c+"\t");//把世界各國的文字打印到log.txt這個(gè)文件中去
      20                 }
      21         }catch(Exception e){
      22             e.printStackTrace();
      23         }
      24     }
      25 }
      復(fù)制代碼

        

      9.5. 對(duì)象流——Object

        

      測試代碼:

      復(fù)制代碼
       1 package cn.gacl.test;
       2 
       3 import java.io.*;
       4 
       5 public class TestObjectIo {
       6     public static void main(String args[]) {
       7         T t = new T();
       8         t.k = 8;// 把k的值修改為8
       9         try {
      10             FileOutputStream fos = new FileOutputStream(
      11                     "D:/java/TestObjectIo.txt");
      12             ObjectOutputStream oos = new ObjectOutputStream(fos);
      13             // ObjectOutputStream流專門用來處理Object的,在fos流的外面套接ObjectOutputStream流就可以直接把一個(gè)Object寫進(jìn)去
      14             oos.writeObject(t);// 直接把一個(gè)t對(duì)象寫入到指定的文件里面
      15             oos.flush();
      16             oos.close();
      17             FileInputStream fis = new FileInputStream(
      18                     "D:/java/TestObjectIo.txt");
      19             ObjectInputStream ois = new ObjectInputStream(fis);
      20             // ObjectInputStream專門用來讀一個(gè)Object的
      21             T tRead = (T) ois.readObject();
      22             // 直接把文件里面的內(nèi)容全部讀取出來然后分解成一個(gè)Object對(duì)象,并使用強(qiáng)制轉(zhuǎn)換成指定類型T
      23             System.out.print(tRead.i + "\t" + tRead.j + "\t" + tRead.d + "\t"
      24                     + tRead.k);
      25             ois.close();
      26         } catch (Exception e) {
      27             e.printStackTrace();
      28         }
      29     }
      30 }
      31 
      32 /*
      33  * 凡是要將一個(gè)類的對(duì)象序列化成一個(gè)字節(jié)流就必須實(shí)現(xiàn)Serializable接口
      34  * Serializable接口中沒有定義方法,Serializable接口是一個(gè)標(biāo)記性接口,用來給類作標(biāo)記,只是起到一個(gè)標(biāo)記作用。
      35  * 這個(gè)標(biāo)記是給編譯器看的,編譯器看到這個(gè)標(biāo)記之后就可以知道這個(gè)類可以被序列化 如果想把某個(gè)類的對(duì)象序列化,就必須得實(shí)現(xiàn)Serializable接口
      36  */
      37 class T implements Serializable {
      38     // Serializable的意思是可以被序列化的
      39     int i = 10;
      40     int j = 9;
      41     double d = 2.3;
      42     int k = 15;
      43     // transient int k = 15;
      44     // 在聲明變量時(shí)如果加上transient關(guān)鍵字,那么這個(gè)變量就會(huì)被當(dāng)作是透明的,即不存在。
      45 }
      復(fù)制代碼

        直接實(shí)現(xiàn)Serializable接口的類是JDK自動(dòng)把這個(gè)類的對(duì)象序列化,而如果實(shí)現(xiàn)public interface Externalizable extends Serializable的類則可以自己控制對(duì)象的序列化,建議能讓JDK自己控制序列化的就不要讓自己去控制。

      十、IO流總結(jié)

        

      原文鏈接:http://www.cnblogs.com/xdp-gacl/tag/java%E5%9F%BA%E7%A1%80%E6%80%BB%E7%BB%93/default.html?page=1

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多