成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java IO (二),常見的輸入/輸出流

lidashuang / 2664人閱讀

摘要:字節(jié)流和字符流和和兩個抽象類是所有輸入流的基類本身并不能創(chuàng)建實例來執(zhí)行輸入但它們將成為所有輸入流的模板他們的方法是所有輸入流都可用的方法中包含如下三個方法從輸入流中讀取單個字節(jié)返回所讀取的字節(jié)數(shù)據(jù)字節(jié)數(shù)據(jù)可直接轉(zhuǎn)換為類型從輸入流中讀取最多個

字節(jié)流和字符流 InputStream和Reader

InputStream和Reader兩個抽象類是所有輸入流的基類,本身并不能創(chuàng)建實例來執(zhí)行輸入,但它們將成為所有輸入流的模板.他們的方法是所有輸入流都可用的方法.

InputStream中包含如下三個方法

int read() 從輸入流中讀取單個字節(jié),返回所讀取的字節(jié)數(shù)據(jù)(字節(jié)數(shù)據(jù)可直接轉(zhuǎn) 換為int類型).

int read(byte[] b) 從輸入流中讀取最多b.lenght個字節(jié)數(shù)據(jù),并將其存貯在數(shù)組b中,返回實際讀取的字節(jié)數(shù).

int read(byte[] b,int off,int len) 從輸入流中讀取最多的len個字符的數(shù)據(jù),并存在數(shù)組b中,放入數(shù)組b中時,從off的位置開始,返回實際讀取的字節(jié)數(shù).

Reader中包含如下三個方法

int read() 從輸入流中讀取單個字符,返回所讀取的字符數(shù)據(jù)(字符數(shù)可以直接轉(zhuǎn)換為int類型)

int read(char[] cbuf) 從輸入流中讀取最多的cbuf.length個字符數(shù)據(jù),并將其存儲在字符數(shù)組cbuf中,返回實際讀取的字符數(shù).

int read(char cbuf,int off,int len) 從輸入流中讀取最多l(xiāng)en個字符的數(shù)據(jù),并將其存在cbuf中,從off位置開始,返回實際的讀取的字符數(shù).

使用FileInputStream讀取自身

javapublic void readFile() throws IOException {
    //創(chuàng)建字節(jié)輸入流
    FileInputStream fis = new FileInputStram("FileInputTest.java");
    //創(chuàng)建一個長度為1024的緩沖數(shù)組
    byte[] bbuf = new byte[1024];
    //保存實際讀取的字節(jié)數(shù)
    int hasRead = 0;
    //循環(huán)讀取文件內(nèi)容
    while ((hasRead = fis.read(bbuf)) > 0) {
       System.out.println(new String(bbuf,0,hasRead));
    }
    //文件IO資源不屬于內(nèi)存資源
    //垃圾回收無法回收該資源
    //必須顯式關(guān)閉
    fis.close();
}

使用FileReader讀取文件自身

public void readFile() throws IOException {
    FileReader fr = new FileReader("FileReaderTest.java");
    char[] cbuf = new char[32];
    int hasRead = 0;
    while ((hasRead = fr.read(cbuf)) > 0) {
        System.out.println(new String(cbuf,0,hasRead));
    }
    fr.clse();
}

此外,InputStream和Reader還支持如下幾個方法來支持指針的移動
void mark(int readAheadLimit) 在記錄指針當(dāng)前位置記錄一個標(biāo)記(mark).
boolean markSupported() 判斷此輸入流是否支持mark()操作
void reset() 將此流的記錄指針重新定位到上一次記錄標(biāo)記的位置(mark).
long skip(long n) 記錄指針向前移動n個字節(jié)/字符.

OutputStream和Writer OutputStream和Writer也非常相似,兩個流都提供了如下三個方法:

void write(int c) 將指定的字節(jié)/字符輸出到輸出流中,其中c既可以代表字節(jié),也可以代表字符.

void write(byte[]/char[] buf) 將字節(jié)數(shù)組/字符數(shù)組中的數(shù)據(jù)輸出到指定輸出流中.

void write(byte[]/char[] buf,int off,int len) 將字節(jié)數(shù)組/字符數(shù)組從off位置開始,長度為len的字節(jié)/字符輸出到輸出流中.

Writer里還包含如下兩個方法:
* void write(String str) 將str字符串輸出到指定輸出流中
* void write(String str,int off,int len) 將str字符串里從off位置開始,長度為len輸出到指定輸出流中.

下面的程序使用FileInputStream來執(zhí)行輸入,通過FileOutputStream執(zhí)行輸出,實現(xiàn)復(fù)制文件的功能

javapublic void copyFile() throws IOException {
    FileInputStream fis = null;
    FileOutputStream fos = null;

    try {
        fis = new FileInputStream("outfile.txt");
        fos = new FileOutputStream("newfile.txt");

        byte[] bbuf = new byte[32];
        int hasRead = 0;
        while ((hasRead =fis.read(bbuf)) > 0) {
            fos.write(bbuf,0,hasRead);
        }
    } catch(IOException ioe) {
        ioe.printStatckTrance();
    } finally {
        if (fis != null) {
            fis.close();
        }
        if(fos != null) {
            fos.close();
        }
    }
}

如果希望直接輸出字符串內(nèi)容,使用Writer更為方便.

javapublic void out() {
    FileWriter fw = null;
    try {
        fw = new FileWrite("file.txt");
        fw.write("但我不能放歌,
");
        fw.write("悄悄是別離的笙簫;
");
        fw.write("夏蟲也為我沉默,
");
        fw.write("沉默是今晚的康橋!
");
    } catch (IOException ioe) {

    } finally {
        if(null != fw) {
            fw.close();
        }
    }
}

上面程序會在當(dāng)前目錄下輸出file.txt,文件內(nèi)容就是程序中輸出內(nèi)容.

輸入/輸出流體系
分類 字節(jié)輸入流 字節(jié)輸出流 字符輸入流 字符輸出流
抽象基類 InputStream OutputStream Reader Writer
訪問文件 FileInputStream FileOutputStream FileReader FileWriter
訪問數(shù)組 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
訪問管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
訪問字符串 StringReader StringWriter
緩沖流 BufferedInputStream BufferedOutputStream BufferedRead BufferedWriter
轉(zhuǎn)換流 InputStreamReader OutputStreamReader
對象流 ObjectInputStream ObjectOutput
抽象基類 FilterInputStream FilterOutPutStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回輸入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream

上面表中粗體字標(biāo)出類的代表節(jié)點流,必須直接與指定物理節(jié)點關(guān)聯(lián);斜體字標(biāo)出的為抽象基類,無法創(chuàng)建實例.

字節(jié)流比字符流功能強大,因為計算機中所有數(shù)據(jù)都是二進制的.字節(jié)流可以處理所有的二進制文件.如果使用字節(jié)流來處理文本文件時,需要使用合適的方式把字節(jié)轉(zhuǎn)換成字符,無形中增加了編程的復(fù)雜程度.所以通常有個規(guī)則,如果需要進行輸入/輸出的是文本內(nèi)容,應(yīng)考慮使用字符流,如果需要進行輸入/輸出的二進制內(nèi)容,應(yīng)考慮使用字節(jié)流.

使用字符串作為物理節(jié)點:

javapublic void StringNodeTest() {

    String src = "軟泥上的青荇,
"
                +"油油的在水底招搖;
"
                +"在康河的柔波里,
"
                +"我甘心做一條水草。";

    StringReader sr = new StringReader(src);
    char[] cbuf = new char[32];
    int hasRead = 0;
    try {
        while((hasRead =sr.read(cbuf)) > 0) {
            System.out.println(new String(cbuf,0,hasRead));
        }
    } catch (IOException ioe) {
        ioe.
    } finally {
        if (null != sr){
            sr.close();
        }
    }
}
轉(zhuǎn)換流

IO體系中提供了2個轉(zhuǎn)換流,用于實現(xiàn)將字節(jié)流轉(zhuǎn)換成字符流.InputStreamReader將字節(jié)輸入流轉(zhuǎn)換成字符輸入流,OutputStreamWriter將字節(jié)輸出流轉(zhuǎn)換成字符輸出流.

Java并沒有提供字符流轉(zhuǎn)換成字節(jié)流接口,看似設(shè)計遺漏.考慮下字符流和字節(jié)流的差別,字節(jié)流比字符流使用范圍更廣,但字符流操作比字節(jié)流方便,如果已經(jīng)有一個字符流,為什么還要換成字節(jié)流,既然知道字節(jié)流的內(nèi)容是文本,那么轉(zhuǎn)換成字符流更方便一些,所以Java沒有提供字符流到字節(jié)流的轉(zhuǎn)換.

下面的例子通過使用鍵盤輸入(System.in).這個標(biāo)準(zhǔn)的輸入流是InputStream實例,使用起來不太方便,鍵盤輸入的都是純文本,使用InputStreamReader將其轉(zhuǎn)換為字符輸入流,普通Reader讀起來依舊不方便,于是再轉(zhuǎn)換成BufferedReader,利用它的readLine()方法可以一次讀一行.

javapublic void convInput() {
    BufferedReader br = null;

    try {
        //System.in轉(zhuǎn)換成Reader對象
        InputStreamReader reader = new InputStreamReader(System.in);
        //將Reader包裝成BufferedReader
        br = new BufferedReader(reader);
        String buffer = null;
        While((buffer = br.readLine()) != null) {
            if("exit".equals(buffer)) {
                System.exit(1);
            }
            System.out.println("輸入內(nèi)容為:" + buffer);
        }
    } catach (IOException ioe) {

    } finally {
        try {
            if (null != br) {
                br.close();
            }
        } catach (IOException ioe) {

        }
    }
}
推回輸入流

在IO體系中,有2個特殊的流.PushbackInputStream和PushbackReader.提供如下三個方法:
* void unread(byte[]/char[] buf) 將一個字節(jié)數(shù)組內(nèi)容推回到推回緩沖區(qū)里,從而允許重復(fù)讀取剛剛的內(nèi)容.
* void unread(byte[]/char[] b,int off,int len) 將一個字節(jié)/字符數(shù)組從off開始,長度為len字節(jié)/ 字符的內(nèi)容推回到推回緩沖區(qū)里,從而允許重復(fù)讀取剛剛的內(nèi)容.
* void unread(int b) 將一個字節(jié)/字符推回到推回緩沖區(qū),從而允許重復(fù)讀取剛剛讀取的內(nèi)容.

這三個方法和InputStream和Reader里三個read方法一一對應(yīng),這兩個推回輸入流都帶有一個推回緩沖區(qū),當(dāng)程序調(diào)用這兩個推回輸入流的unread方法時,系統(tǒng)會把指定數(shù)組的內(nèi)容推回到該緩沖區(qū)里,從而允許重復(fù)讀取剛剛讀取的內(nèi)容.

java/**省略無數(shù)代碼**/

PushbackReader pr = null;

        try {
            pr = new PushbackReader(new FileReader("E:workplace1
eviewsrcioPushbackReaderTest.java"), 64);
            char[] buf = new char[32];
            //保存上次讀取的字符串內(nèi)容
            String lastContent = "";
            int hasRead = 0;
            while ((hasRead = pr.read(buf)) > 0) {
                //讀取到內(nèi)容轉(zhuǎn)換成字符串
                String content = new String(buf,0,hasRead);
                int targetIndex = 0;
                //將上一次內(nèi)容和本次內(nèi)容拼起來 檢查是否包含目標(biāo)字符串
                //如果包含目標(biāo)字符串
                if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0) {
                    //將本次內(nèi)容上次內(nèi)容一起退回到推回緩沖區(qū)
                    pr.unread((lastContent + content).toCharArray());
                    //再次讀取指定程度的內(nèi)容(目標(biāo)字符串之前的內(nèi)容)
                    pr.read(buf,0,targetIndex);
                    //打印讀取內(nèi)容
                    System.out.println(new String(buf,0,targetIndex));
                    System.exit(0);
                } else {
                    System.out.println(lastContent);
                    lastContent = content;
                }
            }

/**省略無數(shù)代碼**/
重定向標(biāo)準(zhǔn)輸入/輸出

Java的標(biāo)準(zhǔn)輸入輸出分別通過System.in和System.out來代表,默認情況下他們分別代表鍵盤和顯示器.
System類中提供三個重定向輸入/輸出標(biāo)準(zhǔn)的方法:
* static void setErr(PrintStream err) 重定向"標(biāo)準(zhǔn)"錯誤輸出流
* static void setIn(InputStream in) 重定向"標(biāo)準(zhǔn)"輸入流
* static void setOut(PrintStream out) 重定向"標(biāo)準(zhǔn)"輸出流

下面的程序通過重定向標(biāo)準(zhǔn)輸出流,將System.out的輸出重定向到到文件輸出:

java/**省略無數(shù)代碼**/
        PrintStream ps = null;

        try {
            //創(chuàng)建重定向需要的輸出流
            ps = new PrintStream(new FileOutputStream("out.txt"));
            //將標(biāo)準(zhǔn)輸出流重定向到ps輸出流
            System.setOut(ps);
            //測試輸出
            System.out.println("普通字符串");
            System.out.println(new RedirectOut());
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (null != ps) {
                ps.close();
            }
        }
/**省略無數(shù)代碼**/

下面的程序通過重定向標(biāo)準(zhǔn)輸入流,將System.in重定向到指定文件而不是鍵盤:

java/**省略無數(shù)代碼**/
        FileInputStream fis = null;

        try {
            fis = new FileInputStream("E:workplace1
eviewsrcioRedirectIn.java");
            //將標(biāo)準(zhǔn)輸入重定向到fis輸入流
            System.setIn(fis);
            //獲取標(biāo)準(zhǔn)輸入
            Scanner sc = new Scanner(System.in);
            //設(shè)置只把回車作為分隔符
            sc.useDelimiter("
");
            while (sc.hasNext()) {
                System.out.println("鍵盤輸入內(nèi)容為:" + sc.next());
            }
/**省略無數(shù)代碼**/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64415.html

相關(guān)文章

  • 樂字節(jié)Java之file、IO基礎(chǔ)知識和操作步驟

    摘要:流分類由此可見,流很龐大從不同角度進行分類數(shù)據(jù)分類按處理數(shù)據(jù)單位分為字節(jié)流和字符流。處理數(shù)據(jù)是音頻視頻文本等一切為字節(jié)流,僅能處理文本的為字符流。功能分類節(jié)點流和處理流。從向一個特定的設(shè)備磁盤網(wǎng)絡(luò)等讀寫數(shù)據(jù)的流稱為節(jié)點流,也常被稱為低級流。 嗨嘍,小樂又來了,今天要給大家送上的技術(shù)文章是Java重點知識-IO流。 先來看看IO流的思維導(dǎo)圖吧。showImg(https://segmen...

    pkhope 評論0 收藏0
  • 快速Get-JAVA-IO

    摘要:除非文件用自帶的記事本打開我們能夠讀懂,才采用字符流,否則建議使用字節(jié)流。 第四階段 IO IO流 前言: 前面的學(xué)習(xí)我們只能夠在已有的一定封閉范圍內(nèi)進行一些操作,但是這顯然是無趣的,也是不支持我們實現(xiàn)一些復(fù)雜的需求,所以Java提供IO流這樣一種概念,方便我們對數(shù)據(jù)進行操作 而使用IO流我們可以實現(xiàn)一些強大的功能,例如針對文件的移動復(fù)制等操作,又或者程序與外部文件之間的數(shù)據(jù)存儲或者讀...

    wangzy2019 評論0 收藏0
  • 關(guān)于Java IO與NIO知識都在這里

    摘要:從通道進行數(shù)據(jù)寫入創(chuàng)建一個緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評論0 收藏0
  • Java 序列化和反序列化

    摘要:把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。代表對象輸入流,它的方法從一個源輸入流中讀取字節(jié)序列,再把它們反序列化為一個對象,并將其返回。接口繼承自接口,實現(xiàn)接口的類完全由自身來控制序列化的行為,而僅實現(xiàn)接口的類可以采用默認的序列化方式。 把對象轉(zhuǎn)換為字節(jié)序列的過程稱為對象的序列化。把字節(jié)序列恢復(fù)為對象的過程稱為對象的反序列化。    對象的序列化主要有兩種用途:   1) 把...

    jcc 評論0 收藏0

發(fā)表評論

0條評論

lidashuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<