java 基礎(chǔ)知識學(xué)習(xí)(五)


title: java 基礎(chǔ)知識學(xué)習(xí)(五)
date: 2019-04-30 22:02:40
tags: java
categories: java


java 基礎(chǔ)知識學(xué)習(xí)(五)

1.java流輸入輸出原理

image

2.輸入和輸出流分類

  • java.io包中定義了多個流類型來實現(xiàn)輸入和輸出功能
    • 按數(shù)據(jù)流的方向不同可以分為輸入流和輸chuliu
    • 按處理數(shù)據(jù)單位的不同可以分為字節(jié)流和字符流
    • 按照功能不同可以分為節(jié)點流和處理流
  • java sdk所提供的所有流的類型位于java.io包,分別繼承自以下四種抽象流
    • 字節(jié)流 InputStream OutputStream
    • 字符流 Reader Writer

3.節(jié)點流和處理流

image
  • 節(jié)點流類型
image
import java.util.*;
import java.io.*;

public class Test{

    public static void main(String args[]) {
        int b = 0;// 使用變量b來裝調(diào)用read()方法時返回的整數(shù)
        FileInputStream in = null;
        // 使用FileInputStream流來讀取有中文的內(nèi)容時,讀出來的是亂碼,因為使用InputStream流里面的read()方法讀取內(nèi)容時是一個字節(jié)一個字節(jié)地讀取的,而一個漢字是占用兩個字節(jié)的,所以讀取出來的漢字無法正確顯示。
        // FileReader in = null;//使用FileReader流來讀取內(nèi)容時,中英文都可以正確顯示,因為Reader流里面的read()方法是一個字符一個字符地讀取的,這樣每次讀取出來的都是一個完整的漢字,這樣就可以正確顯示了。
        try {
            in = new FileInputStream("C:\\Users\\Administrator\\Desktop\\img\\day5\\Test.java");
            // in = new FileReader("D:/java/io/TestFileInputStream.java");
        } catch (FileNotFoundException e) {
            System.out.println("系統(tǒng)找不到指定文件!");
            System.exit(-1);// 系統(tǒng)非正常退出
        }
        long num = 0;// 使用變量num來記錄讀取到的字符數(shù)
        try {// 調(diào)用read()方法時會拋異常,所以需要捕獲異常
            while ((b = in.read()) != -1) {
                // 調(diào)用int read() throws Exception方法時,返回的是一個int類型的整數(shù)
                // 循環(huán)結(jié)束的條件就是返回一個值-1,表示此時已經(jīng)讀取到文件的末尾了。
                // System.out.print(b+"\t");//如果沒有使用“(char)b”進行轉(zhuǎn)換,那么直接打印出來的b就是數(shù)字,而不是英文和中文了
                System.out.print((char) b);
                // “char(b)”把使用數(shù)字表示的漢字和英文字母轉(zhuǎn)換成字符輸入
                num++;
            }
            in.close();// 關(guān)閉輸入流
            System.out.println();
            System.out.println("總共讀取了" + num + "個字節(jié)的文件");
        } catch (IOException e1) {
            System.out.println("文件讀取錯誤!");
        }
    }
}

4.InputStream

  • 繼承自InputStream的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)(8bit);

  • 基本方法

image

5.OutputSream

  • 繼承自O(shè)utputSteam的流是用于程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字節(jié)。

  • 基本方法

image

6.Reader

  • 繼承自Reader的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字符(16bit)
  • 基本方法
image

7.Writer

  • 繼承自Writer的流都是用于程序的輸出數(shù)據(jù),且數(shù)據(jù)單位為字符(16bit)
  • 基本方法
image
import java.util.*;
import java.io.*;

public class Test{

    public static void main(String args[]){
        /*使用FileWriter輸出流從程序把數(shù)據(jù)寫入到Uicode.dat文件中
        使用FileWriter流向文件寫入數(shù)據(jù)時是一個字符一個字符寫入的*/
        FileWriter fw = null;
        try{
                fw = new FileWriter("D:/java/Uicode.dat");
                //字符的本質(zhì)是一個無符號的16位整數(shù)
                //字符在計算機內(nèi)部占用2個字節(jié)
                //這里使用for循環(huán)把0~60000里面的所有整數(shù)都輸出
                //這里相當(dāng)于是把全世界各個國家的文字都0~60000內(nèi)的整數(shù)的形式來表示
                for(int c=0;c<=60000;c++){
                    fw.write(c);
                    //使用write(int c)把0~60000內(nèi)的整數(shù)寫入到指定文件內(nèi)
                    //調(diào)用write()方法時,我認為在執(zhí)行的過程中應(yīng)該使用了“(char)c”進行強制轉(zhuǎn)換,即把整數(shù)轉(zhuǎn)換成字符來顯示
                    //因為打開寫入數(shù)據(jù)的文件可以看到,里面顯示的數(shù)據(jù)并不是0~60000內(nèi)的整數(shù),而是不同國家的文字的表示方式
            }
            /*使用FileReader(字符流)讀取指定文件里面的內(nèi)容
            讀取內(nèi)容時是以一個字符為單位進行讀取的*/
                int b = 0;
                long num = 0;
                FileReader fr = null;
                fr = new FileReader("D:/java/Uicode.dat");
                while((b = fr.read())!= -1){
                    System.out.print((char)b + "\t");
                    num++;
                }
                System.out.println();
                System.out.println("總共讀取了"+num+"個字符");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

8.緩存流


import java.io.*;

public class TestBufferStream {
    public static void main(String args[]) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("D:/java/TestFileInputStream.java");
            // 在FileInputStream節(jié)點流的外面套接一層處理流BufferedInputStream
            BufferedInputStream bis = new BufferedInputStream(fis);
            int c = 0;
            System.out.println((char) bis.read());
            System.out.println((char) bis.read());
            bis.mark(100);// 在第100個字符處做一個標(biāo)記
            for (int i = 0; i <= 10 && (c = bis.read()) != -1; i++) {
                System.out.print((char) c);
            }
            System.out.println();
            bis.reset();// 重新回到原來標(biāo)記的地方
            for (int i = 0; i <= 10 && (c = bis.read()) != -1; i++) {
                System.out.print((char) c);
            }
            bis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

9.轉(zhuǎn)換流

image

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

轉(zhuǎn)換流代碼:

import java.io.*;

public class TestTransform1 {
    public static void main(String args[]) {
        try {
            OutputStreamWriter osw = new OutputStreamWriter(
                    new FileOutputStream("D:/java/char.txt"));
            osw.write("MircosoftsunIBMOracleApplet");
            System.out.println(osw.getEncoding());
            osw.close();
            osw = new OutputStreamWriter(new FileOutputStream(
                    "D:\\java\\char.txt", true), "ISO8859_1");
            
            osw.write("MircosoftsunIBMOracleApplet");
            System.out.println(osw.getEncoding());
            osw.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結(jié)果:

image

10.數(shù)據(jù)流

image
import java.util.*;
import java.io.*;

public class Test{

    public static void main(String args[]) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //在調(diào)用構(gòu)造方法時,首先會在內(nèi)存里面創(chuàng)建一個ByteArray字節(jié)數(shù)組
        DataOutputStream dos = new DataOutputStream(baos);
        //在輸出流的外面套上一層數(shù)據(jù)流,用來處理int,double類型的數(shù)
        try{
            dos.writeDouble(Math.random());//把產(chǎn)生的隨機數(shù)直接寫入到字節(jié)數(shù)組ByteArray中
            dos.writeBoolean(true);//布爾類型的數(shù)據(jù)在內(nèi)存中就只占一個字節(jié)
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            System.out.println(bais.available());
            DataInputStream dis = new DataInputStream(bais);
            System.out.println(dis.readDouble());//先寫進去的就先讀出來,調(diào)用readDouble()方法讀取出寫入的隨機數(shù)
            System.out.println(dis.readBoolean());//后寫進去的就后讀出來,這里面的讀取順序不能更改位置,否則會打印出不正確的結(jié)果
            dos.close();
            bais.close();
        }catch(Exception e){
                e.printStackTrace();
            }
    }

}

運行結(jié)果:

image

11.Print流

image
import java.util.*;
import java.io.*;

public class Test{

    public static void main(String args[]) {
        PrintStream ps = null;
        try{
                FileOutputStream fos = new FileOutputStream("D:/java/log.txt");
                ps = new PrintStream(fos);//在輸出流的外面套接一層打印流,用來控制打印輸出
                if(ps != null){
                    System.setOut(ps);//這里調(diào)用setOut()方法改變了輸出窗口,以前寫System.out.print()默認的輸出窗口就是命令行窗口.
                    //但現(xiàn)在使用System.setOut(ps)將打印輸出窗口改成了由ps指定的文件里面,通過這樣設(shè)置以后,打印輸出時都會在指定的文件內(nèi)打印輸出
                    //在這里將打印輸出窗口設(shè)置到了log.txt這個文件里面,所以打印出來的內(nèi)容會在log.txt這個文件里面看到
                }
            for(char c=0;c<=60000;c++){
                    System.out.print(c+"\t");//把世界各國的文字打印到log.txt這個文件中去
                }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

運行結(jié)果:

image

12.Object流

image
import java.io.*;

public class Test{
    public static void main(String args[]) {
        T t = new T();
        t.k = 8;// 把k的值修改為8
        try {
            FileOutputStream fos = new FileOutputStream(
                    "D:/java/TestObjectIo.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            // ObjectOutputStream流專門用來處理Object的,在fos流的外面套接ObjectOutputStream流就可以直接把一個Object寫進去
            oos.writeObject(t);// 直接把一個t對象寫入到指定的文件里面
            oos.flush();
            oos.close();
            FileInputStream fis = new FileInputStream(
                    "D:/java/TestObjectIo.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            // ObjectInputStream專門用來讀一個Object的
            T tRead = (T) ois.readObject();
            // 直接把文件里面的內(nèi)容全部讀取出來然后分解成一個Object對象,并使用強制轉(zhuǎn)換成指定類型T
            System.out.print(tRead.i + "\t" + tRead.j + "\t" + tRead.d + "\t"
                    + tRead.k);
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/*
 * 凡是要將一個類的對象序列化成一個字節(jié)流就必須實現(xiàn)Serializable接口
 * Serializable接口中沒有定義方法,Serializable接口是一個標(biāo)記性接口,用來給類作標(biāo)記,只是起到一個標(biāo)記作用。
 * 這個標(biāo)記是給編譯器看的,編譯器看到這個標(biāo)記之后就可以知道這個類可以被序列化 如果想把某個類的對象序列化,就必須得實現(xiàn)Serializable接口
 */
class T implements Serializable {
    // Serializable的意思是可以被序列化的
    int i = 10;
    int j = 9;
    double d = 2.3;
    //int k = 15;
     transient int k = 15;
    // 在聲明變量時如果加上transient關(guān)鍵字,那么這個變量就會被當(dāng)作是透明的,即不存在。
}

運行結(jié)果:

image

總結(jié)


1556540449795.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基礎(chǔ)知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,560評論 0 4
  • 五、IO流 1、IO流概述 (1)用來處理設(shè)備(硬盤,控制臺,內(nèi)存)間的數(shù)據(jù)。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 585評論 0 0
  • 前提 參考資料: 《Java I/O》 -- 這本書沒有翻譯版,需要自己啃一下。 《Java I/O》這本書主要介...
    zhrowable閱讀 1,276評論 0 1
  • 現(xiàn)在,四海八荒,十里桃花,都在迷戀烘焙,我是其中之一。其中的滋味,四個字來概括,樂不思蜀。額喜歡其中的原料,喜...
    孫曉慶閱讀 430評論 0 2
  • 人至“踐”,則無敵,只要你想到、做室,或者想到了不會,去學(xué),然后做到。大多數(shù)人都是想到了,說到了,知道了,學(xué)到了,...
    ronnieliu閱讀 527評論 0 50

友情鏈接更多精彩內(nèi)容