JavaIO流常見(jiàn)面試題有哪些-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“Java IO流常見(jiàn)面試題有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java IO流常見(jiàn)面試題有哪些”吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比碾子山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式碾子山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋碾子山地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

IO概述

在這一小節(jié),我會(huì)試著給出Java IO(java.io)包下所有類的概述。更具體地說(shuō),我會(huì)根據(jù)類的用途對(duì)類進(jìn)行分組。這個(gè)分組將會(huì)使你在未來(lái)的工作中,進(jìn)行類的用途判定時(shí),或者是為某個(gè)特定用途選擇類時(shí)變得更加容易。

輸入和輸出

術(shù)語(yǔ)“輸入”和“輸出”有時(shí)候會(huì)有一點(diǎn)讓人疑惑。一個(gè)應(yīng)用程序的輸入往往是另外一個(gè)應(yīng)用程序的輸出
那么OutputStream流到底是一個(gè)輸出到目的地的流呢,還是一個(gè)產(chǎn)生輸出的流?InputStream流到底會(huì)不會(huì)輸出它的數(shù)據(jù)給讀取數(shù)據(jù)的程序呢?就我個(gè)人而言,在第一天學(xué)習(xí)Java IO的時(shí)候我就感覺(jué)到了一絲疑惑。
為了消除這個(gè)疑惑,我試著給輸入和輸出起一些不一樣的別名,讓它們從概念上與數(shù)據(jù)的來(lái)源和數(shù)據(jù)的流向相聯(lián)系。

Java的IO包主要關(guān)注的是從原始數(shù)據(jù)源的讀取以及輸出原始數(shù)據(jù)到目標(biāo)媒介。以下是最典型的數(shù)據(jù)源和目標(biāo)媒介:

文件
管道
網(wǎng)絡(luò)連接
內(nèi)存緩存
System.in, System.out, System.error(注:Java標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤輸出)

在Java IO中,流是一個(gè)核心的概念。流從概念上來(lái)說(shuō)是一個(gè)連續(xù)的數(shù)據(jù)流。你既可以從流中讀取數(shù)據(jù),也可以往流中寫(xiě)數(shù)據(jù)。流與數(shù)據(jù)源或者數(shù)據(jù)流向的媒介相關(guān)聯(lián)。在Java IO中流既可以是字節(jié)流(以字節(jié)為單位進(jìn)行讀寫(xiě)),也可以是字符流(以字符為單位進(jìn)行讀寫(xiě))。

類InputStream, OutputStream, Reader 和Writer
一個(gè)程序需要InputStream或者Reader從數(shù)據(jù)源讀取數(shù)據(jù),需要OutputStream或者Writer將數(shù)據(jù)寫(xiě)入到目標(biāo)媒介中。

InputStream和Reader與數(shù)據(jù)源相關(guān)聯(lián),OutputStream和writer與目標(biāo)媒介相關(guān)聯(lián)。

Java IO的用途和特征

Java IO中包含了許多InputStream、OutputStream、Reader、Writer的子類。這樣設(shè)計(jì)的原因是讓每一個(gè)類都負(fù)責(zé)不同的功能。這也就是為什么IO包中有這么多不同的類的緣故。各類用途匯總?cè)缦拢?/p>

文件訪問(wèn)
網(wǎng)絡(luò)訪問(wèn)
內(nèi)存緩存訪問(wèn)
線程內(nèi)部通信(管道)
緩沖
過(guò)濾
解析
讀寫(xiě)文本 (Readers / Writers)
讀寫(xiě)基本類型數(shù)據(jù) (long, int etc.)
讀寫(xiě)對(duì)象

當(dāng)通讀過(guò)Java IO類的源代碼之后,我們很容易就能了解這些用途。這些用途或多或少讓我們更加容易地理解,不同的類用于針對(duì)不同業(yè)務(wù)場(chǎng)景。

Java IO類概述表
已經(jīng)討論了數(shù)據(jù)源、目標(biāo)媒介、輸入、輸出和各類不同用途的Java IO類,接下來(lái)是一張通過(guò)輸入、輸出、基于字節(jié)或者字符、以及其他比如緩沖、解析之類的特定用途劃分的大部分Java IO類的表格。

什么是Java IO流

Java IO流是既可以從中讀取,也可以寫(xiě)入到其中的數(shù)據(jù)流。正如這個(gè)系列教程之前提到過(guò)的,流通常會(huì)與數(shù)據(jù)源、數(shù)據(jù)流向目的地相關(guān)聯(lián),比如文件、網(wǎng)絡(luò)等等。

流和數(shù)組不一樣,不能通過(guò)索引讀寫(xiě)數(shù)據(jù)。在流中,你也不能像數(shù)組那樣前后移動(dòng)讀取數(shù)據(jù),除非使用RandomAccessFile 處理文件。流僅僅只是一個(gè)連續(xù)的數(shù)據(jù)流。

某些類似PushbackInputStream 流的實(shí)現(xiàn)允許你將數(shù)據(jù)重新推回到流中,以便重新讀取。然而你只能把有限的數(shù)據(jù)推回流中,并且你不能像操作數(shù)組那樣隨意讀取數(shù)據(jù)。流中的數(shù)據(jù)只能夠順序訪問(wèn)。

Java IO流通常是基于字節(jié)或者基于字符的。字節(jié)流通常以“stream”命名,比如InputStream和OutputStream。除了DataInputStream 和DataOutputStream 還能夠讀寫(xiě)int, long, float和double類型的值以外,其他流在一個(gè)操作時(shí)間內(nèi)只能讀取或者寫(xiě)入一個(gè)原始字節(jié)。

字符流通常以“Reader”或者“Writer”命名。字符流能夠讀寫(xiě)字符(比如Latin1或者Unicode字符)??梢詾g覽Java Readers and Writers獲取更多關(guān)于字符流輸入輸出的信息。

InputStream

java.io.InputStream類是所有Java IO輸入流的基類。如果你正在開(kāi)發(fā)一個(gè)從流中讀取數(shù)據(jù)的組件,請(qǐng)嘗試用InputStream替代任何它的子類(比如FileInputStream)進(jìn)行開(kāi)發(fā)。這么做能夠讓你的代碼兼容任何類型而非某種確定類型的輸入流。

組合流

你可以將流整合起來(lái)以便實(shí)現(xiàn)更高級(jí)的輸入和輸出操作。比如,一次讀取一個(gè)字節(jié)是很慢的,所以可以從磁盤(pán)中一次讀取一大塊數(shù)據(jù),然后從讀到的數(shù)據(jù)塊中獲取字節(jié)。為了實(shí)現(xiàn)緩沖,可以把InputStream包裝到BufferedInputStream中。

代碼示例
   InputStream input = new BufferedInputStream(new FileInputStream(“c:\data\input-file.txt”));

緩沖同樣可以應(yīng)用到OutputStream中。你可以實(shí)現(xiàn)將大塊數(shù)據(jù)批量地寫(xiě)入到磁盤(pán)(或者相應(yīng)的流)中,這個(gè)功能由BufferedOutputStream實(shí)現(xiàn)。

緩沖只是通過(guò)流整合實(shí)現(xiàn)的其中一個(gè)效果。你可以把InputStream包裝到PushbackInputStream中,之后可以將讀取過(guò)的數(shù)據(jù)推回到流中重新讀取,在解析過(guò)程中有時(shí)候這樣做很方便。或者,你可以將兩個(gè)InputStream整合成一個(gè)SequenceInputStream。

將不同的流整合到一個(gè)鏈中,可以實(shí)現(xiàn)更多種高級(jí)操作。通過(guò)編寫(xiě)包裝了標(biāo)準(zhǔn)流的類,可以實(shí)現(xiàn)你想要的效果和過(guò)濾器。

IO文件

在Java應(yīng)用程序中,文件是一種常用的數(shù)據(jù)源或者存儲(chǔ)數(shù)據(jù)的媒介。所以這一小節(jié)將會(huì)對(duì)Java中文件的使用做一個(gè)簡(jiǎn)短的概述。這篇文章不會(huì)對(duì)每一個(gè)技術(shù)細(xì)節(jié)都做出解釋,而是會(huì)針對(duì)文件存取的方法提供給你一些必要的知識(shí)點(diǎn)。在之后的文章中,將會(huì)更加詳細(xì)地描述這些方法或者類,包括方法示例等等。

通過(guò)Java IO讀文件

如果你需要在不同端之間讀取文件,你可以根據(jù)該文件是二進(jìn)制文件還是文本文件來(lái)選擇使用FileInputStream或者FileReader。
這兩個(gè)類允許你從文件開(kāi)始到文件末尾一次讀取一個(gè)字節(jié)或者字符,或者將讀取到的字節(jié)寫(xiě)入到字節(jié)數(shù)組或者字符數(shù)組。你不必一次性讀取整個(gè)文件,相反你可以按順序地讀取文件中的字節(jié)和字符。

如果你需要跳躍式地讀取文件其中的某些部分,可以使用RandomAccessFile。

通過(guò)Java IO寫(xiě)文件

如果你需要在不同端之間進(jìn)行文件的寫(xiě)入,你可以根據(jù)你要寫(xiě)入的數(shù)據(jù)是二進(jìn)制型數(shù)據(jù)還是字符型數(shù)據(jù)選用FileOutputStream或者FileWriter。
你可以一次寫(xiě)入一個(gè)字節(jié)或者字符到文件中,也可以直接寫(xiě)入一個(gè)字節(jié)數(shù)組或者字符數(shù)據(jù)。數(shù)據(jù)按照寫(xiě)入的順序存儲(chǔ)在文件當(dāng)中。

通過(guò)Java IO隨機(jī)存取文件

正如我所提到的,你可以通過(guò)RandomAccessFile對(duì)文件進(jìn)行隨機(jī)存取。

隨機(jī)存取并不意味著你可以在真正隨機(jī)的位置進(jìn)行讀寫(xiě)操作,它只是意味著你可以跳過(guò)文件中某些部分進(jìn)行操作,并且支持同時(shí)讀寫(xiě),不要求特定的存取順序。
這使得RandomAccessFile可以覆蓋一個(gè)文件的某些部分、或者追加內(nèi)容到它的末尾、或者刪除它的某些內(nèi)容,當(dāng)然它也可以從文件的任何位置開(kāi)始讀取文件。

下面是具體例子:

@Test
    //文件流范例,打開(kāi)一個(gè)文件的輸入流,讀取到字節(jié)數(shù)組,再寫(xiě)入另一個(gè)文件的輸出流
    public void test1() {
        try {
            FileInputStream fileInputStream = new FileInputStream(new File("a.txt"));
            FileOutputStream fileOutputStream = new FileOutputStream(new File("b.txt"));
            byte []buffer = new byte[128];
            while (fileInputStream.read(buffer) != -1) {
                fileOutputStream.write(buffer);
            }
            //隨機(jī)讀寫(xiě),通過(guò)mode參數(shù)來(lái)決定讀或者寫(xiě)
            RandomAccessFile randomAccessFile = new RandomAccessFile(new File("c.txt"), "rw");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

字符流和字節(jié)流

Java IO的Reader和Writer除了基于字符之外,其他方面都與InputStream和OutputStream非常類似。他們被用于讀寫(xiě)文本。InputStream和OutputStream是基于字節(jié)的,還記得嗎?

Reader
Reader類是Java IO中所有Reader的基類。子類包括BufferedReader,PushbackReader,InputStreamReader,StringReader和其他Reader。

Writer
Writer類是Java IO中所有Writer的基類。子類包括BufferedWriter和PrintWriter等等。

這是一個(gè)簡(jiǎn)單的Java IO Reader的例子:

Reader reader = new FileReader("c:\\data\\myfile.txt");
int data = reader.read();
while(data != -1){
    char dataChar = (char) data;
    data = reader.read();
}

你通常會(huì)使用Reader的子類,而不會(huì)直接使用Reader。Reader的子類包括InputStreamReader,CharArrayReader,F(xiàn)ileReader等等??梢圆榭碕ava IO概述瀏覽完整的Reader表格。

整合Reader與InputStream

一個(gè)Reader可以和一個(gè)InputStream相結(jié)合。如果你有一個(gè)InputStream輸入流,并且想從其中讀取字符,可以把這個(gè)InputStream包裝到InputStreamReader中。把InputStream傳遞到InputStreamReader的構(gòu)造函數(shù)中:

Reader reader = new InputStreamReader(inputStream);

在構(gòu)造函數(shù)中可以指定解碼方式。

Writer

Writer類是Java IO中所有Writer的基類。子類包括BufferedWriter和PrintWriter等等。這是一個(gè)Java IO Writer的例子:

Writer writer = new FileWriter("c:\\data\\file-output.txt"); 
writer.write("Hello World Writer"); 
writer.close();

同樣,你最好使用Writer的子類,不需要直接使用Writer,因?yàn)樽宇惖膶?shí)現(xiàn)更加明確,更能表現(xiàn)你的意圖。常用子類包括OutputStreamWriter,CharArrayWriter,F(xiàn)ileWriter等。Writer的write(int c)方法,會(huì)將傳入?yún)?shù)的低16位寫(xiě)入到Writer中,忽略高16位的數(shù)據(jù)。

整合Writer和OutputStream

與Reader和InputStream類似,一個(gè)Writer可以和一個(gè)OutputStream相結(jié)合。把OutputStream包裝到OutputStreamWriter中,所有寫(xiě)入到OutputStreamWriter的字符都將會(huì)傳遞給OutputStream。這是一個(gè)OutputStreamWriter的例子:

Writer writer = new OutputStreamWriter(outputStream);

IO管道

Java IO中的管道為運(yùn)行在同一個(gè)JVM中的兩個(gè)線程提供了通信的能力。所以管道也可以作為數(shù)據(jù)源以及目標(biāo)媒介。

你不能利用管道與不同的JVM中的線程通信(不同的進(jìn)程)。在概念上,Java的管道不同于Unix/Linux系統(tǒng)中的管道。在Unix/Linux中,運(yùn)行在不同地址空間的兩個(gè)進(jìn)程可以通過(guò)管道通信。在Java中,通信的雙方應(yīng)該是運(yùn)行在同一進(jìn)程中的不同線程。

通過(guò)Java IO創(chuàng)建管道

可以通過(guò)Java IO中的PipedOutputStream和PipedInputStream創(chuàng)建管道。一個(gè)PipedInputStream流應(yīng)該和一個(gè)PipedOutputStream流相關(guān)聯(lián)。
一個(gè)線程通過(guò)PipedOutputStream寫(xiě)入的數(shù)據(jù)可以被另一個(gè)線程通過(guò)相關(guān)聯(lián)的PipedInputStream讀取出來(lái)。

Java IO管道示例
這是一個(gè)如何將PipedInputStream和PipedOutputStream關(guān)聯(lián)起來(lái)的簡(jiǎn)單例子:

//使用管道來(lái)完成兩個(gè)線程間的數(shù)據(jù)點(diǎn)對(duì)點(diǎn)傳遞
    @Test
    public void test2() throws IOException {
        PipedInputStream pipedInputStream = new PipedInputStream();
        PipedOutputStream pipedOutputStream = new PipedOutputStream(pipedInputStream);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    pipedOutputStream.write("hello input".getBytes());
                    pipedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    byte []arr = new byte[128];
                    while (pipedInputStream.read(arr) != -1) {
                        System.out.println(Arrays.toString(arr));
                    }
                    pipedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

管道和線程
請(qǐng)記得,當(dāng)使用兩個(gè)相關(guān)聯(lián)的管道流時(shí),務(wù)必將它們分配給不同的線程。read()方法和write()方法調(diào)用時(shí)會(huì)導(dǎo)致流阻塞,這意味著如果你嘗試在一個(gè)線程中同時(shí)進(jìn)行讀和寫(xiě),可能會(huì)導(dǎo)致線程死鎖。

管道的替代
除了管道之外,一個(gè)JVM中不同線程之間還有許多通信的方式。實(shí)際上,線程在大多數(shù)情況下會(huì)傳遞完整的對(duì)象信息而非原始的字節(jié)數(shù)據(jù)。但是,如果你需要在線程之間傳遞字節(jié)數(shù)據(jù),Java IO的管道是一個(gè)不錯(cuò)的選擇。

Java IO:網(wǎng)絡(luò)

Java中網(wǎng)絡(luò)的內(nèi)容或多或少的超出了Java IO的范疇。關(guān)于Java網(wǎng)絡(luò)更多的是在我的Java網(wǎng)絡(luò)教程中探討。但是既然網(wǎng)絡(luò)是一個(gè)常見(jiàn)的數(shù)據(jù)來(lái)源以及數(shù)據(jù)流目的地,并且因?yàn)槟闶褂肑ava IO的API通過(guò)網(wǎng)絡(luò)連接進(jìn)行通信,所以本文將簡(jiǎn)要的涉及網(wǎng)絡(luò)應(yīng)用。

當(dāng)兩個(gè)進(jìn)程之間建立了網(wǎng)絡(luò)連接之后,他們通信的方式如同操作文件一樣:利用InputStream讀取數(shù)據(jù),利用OutputStream寫(xiě)入數(shù)據(jù)。換句話來(lái)說(shuō),Java網(wǎng)絡(luò)API用來(lái)在不同進(jìn)程之間建立網(wǎng)絡(luò)連接,而Java IO則用來(lái)在建立了連接之后的進(jìn)程之間交換數(shù)據(jù)。

基本上意味著如果你有一份能夠?qū)ξ募M(jìn)行寫(xiě)入某些數(shù)據(jù)的代碼,那么這些數(shù)據(jù)也可以很容易地寫(xiě)入到網(wǎng)絡(luò)連接中去。你所需要做的僅僅只是在代碼中利用OutputStream替代FileOutputStream進(jìn)行數(shù)據(jù)的寫(xiě)入。因?yàn)镕ileOutputStream是OuputStream的子類,所以這么做并沒(méi)有什么問(wèn)題。

//從網(wǎng)絡(luò)中讀取字節(jié)流也可以直接使用OutputStream
public void test3() {
    //讀取網(wǎng)絡(luò)進(jìn)程的輸出流
    OutputStream outputStream = new OutputStream() {
        @Override
        public void write(int b) throws IOException {
        }
    };
}
public void process(OutputStream ouput) throws IOException {
    //處理網(wǎng)絡(luò)信息
    //do something with the OutputStream
}

字節(jié)和字符數(shù)組

從InputStream或者Reader中讀入數(shù)組

從OutputStream或者Writer中寫(xiě)數(shù)組

在java中常用字節(jié)和字符數(shù)組在應(yīng)用中臨時(shí)存儲(chǔ)數(shù)據(jù)。而這些數(shù)組又是通常的數(shù)據(jù)讀取來(lái)源或者寫(xiě)入目的地。如果你需要在程序運(yùn)行時(shí)需要大量讀取文件里的內(nèi)容,那么你也可以把一個(gè)文件加載到數(shù)組中。

前面的例子中,字符數(shù)組或字節(jié)數(shù)組是用來(lái)緩存數(shù)據(jù)的臨時(shí)存儲(chǔ)空間,不過(guò)它們同時(shí)也可以作為數(shù)據(jù)來(lái)源或者寫(xiě)入目的地。
舉個(gè)例子:

//字符數(shù)組和字節(jié)數(shù)組在io過(guò)程中的作用
    public void test4() {
        //arr和brr分別作為數(shù)據(jù)源
        char []arr = {'a','c','d'};
        CharArrayReader charArrayReader = new CharArrayReader(arr);
        byte []brr = {1,2,3,4,5};
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(brr);
    }

System.in, System.out, System.err

System.in, System.out, System.err這3個(gè)流同樣是常見(jiàn)的數(shù)據(jù)來(lái)源和數(shù)據(jù)流目的地。使用最多的可能是在控制臺(tái)程序里利用System.out將輸出打印到控制臺(tái)上。

JVM啟動(dòng)的時(shí)候通過(guò)Java運(yùn)行時(shí)初始化這3個(gè)流,所以你不需要初始化它們(盡管你可以在運(yùn)行時(shí)替換掉它們)。

System.in
System.in是一個(gè)典型的連接控制臺(tái)程序和鍵盤(pán)輸入的InputStream流。通常當(dāng)數(shù)據(jù)通過(guò)命令行參數(shù)或者配置文件傳遞給命令行Java程序的時(shí)候,System.in并不是很常用。圖形界面程序通過(guò)界面?zhèn)鬟f參數(shù)給程序,這是一塊單獨(dú)的Java IO輸入機(jī)制。
System.out
System.out是一個(gè)PrintStream流。System.out一般會(huì)把你寫(xiě)到其中的數(shù)據(jù)輸出到控制臺(tái)上。System.out通常僅用在類似命令行工具的控制臺(tái)程序上。System.out也經(jīng)常用于打印程序的調(diào)試信息(盡管它可能并不是獲取程序調(diào)試信息的最佳方式)。
System.err
System.err是一個(gè)PrintStream流。System.err與System.out的運(yùn)行方式類似,但它更多的是用于打印錯(cuò)誤文本。一些類似Eclipse的程序,為了讓錯(cuò)誤信息更加顯眼,會(huì)將錯(cuò)誤信息以紅色文本的形式通過(guò)System.err輸出到控制臺(tái)上。

System.out和System.err的簡(jiǎn)單例子:
這是一個(gè)System.out和System.err結(jié)合使用的簡(jiǎn)單示例:

 //測(cè)試System.in, System.out, System.err    
    public static void main(String[] args) {
        int in = new Scanner(System.in).nextInt();
        System.out.println(in);
        System.out.println("out");
        System.err.println("err");
        //輸入10,結(jié)果是
//        err(紅色)
//        10
//        out
    }

字符流的Buffered和Filter

BufferedReader能為字符輸入流提供緩沖區(qū),可以提高許多IO處理的速度。你可以一次讀取一大塊的數(shù)據(jù),而不需要每次從網(wǎng)絡(luò)或者磁盤(pán)中一次讀取一個(gè)字節(jié)。特別是在訪問(wèn)大量磁盤(pán)數(shù)據(jù)時(shí),緩沖通常會(huì)讓IO快上許多。

BufferedReader和BufferedInputStream的主要區(qū)別在于,BufferedReader操作字符,而B(niǎo)ufferedInputStream操作原始字節(jié)。只需要把Reader包裝到BufferedReader中,就可以為Reader添加緩沖區(qū)(譯者注:默認(rèn)緩沖區(qū)大小為8192字節(jié),即8KB)。代碼如下:

Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"));

你也可以通過(guò)傳遞構(gòu)造函數(shù)的第二個(gè)參數(shù),指定緩沖區(qū)大小,代碼如下:

Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"), 8 * 1024);

這個(gè)例子設(shè)置了8KB的緩沖區(qū)。最好把緩沖區(qū)大小設(shè)置成1024字節(jié)的整數(shù)倍,這樣能更高效地利用內(nèi)置緩沖區(qū)的磁盤(pán)。

除了能夠?yàn)檩斎肓魈峁┚彌_區(qū)以外,其余方面BufferedReader基本與Reader類似。BufferedReader還有一個(gè)額外readLine()方法,可以方便地一次性讀取一整行字符。

BufferedWriter

與BufferedReader類似,BufferedWriter可以為輸出流提供緩沖區(qū)。可以構(gòu)造一個(gè)使用默認(rèn)大小緩沖區(qū)的BufferedWriter(譯者注:默認(rèn)緩沖區(qū)大小8 * 1024B),代碼如下:

Writer writer = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"));

也可以手動(dòng)設(shè)置緩沖區(qū)大小,代碼如下:

Writer writer = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"), 8 * 1024);

為了更好地使用內(nèi)置緩沖區(qū)的磁盤(pán),同樣建議把緩沖區(qū)大小設(shè)置成1024的整數(shù)倍。除了能夠?yàn)檩敵隽魈峁┚彌_區(qū)以外,其余方面BufferedWriter基本與Writer類似。類似地,BufferedWriter也提供了writeLine()方法,能夠把一行字符寫(xiě)入到底層的字符輸出流中。

值得注意是,你需要手動(dòng)flush()方法確保寫(xiě)入到此輸出流的數(shù)據(jù)真正寫(xiě)入到磁盤(pán)或者網(wǎng)絡(luò)中。

FilterReader

與FilterInputStream類似,F(xiàn)ilterReader是實(shí)現(xiàn)自定義過(guò)濾輸入字符流的基類,基本上它僅僅只是簡(jiǎn)單覆蓋了Reader中的所有方法。

就我自己而言,我沒(méi)發(fā)現(xiàn)這個(gè)類明顯的用途。除了構(gòu)造函數(shù)取一個(gè)Reader變量作為參數(shù)之外,我沒(méi)看到FilterReader任何對(duì)Reader新增或者修改的地方。如果你選擇繼承FilterReader實(shí)現(xiàn)自定義的類,同樣也可以直接繼承自Reader從而避免額外的類層級(jí)結(jié)構(gòu)。

JavaIO流面試題

什么是IO流?

它是一種數(shù)據(jù)的流從源頭流到目的地。比如文件拷貝,輸入流和輸出流都包括了。輸入流從文件中讀取數(shù)據(jù)存儲(chǔ)到進(jìn)程(process)中,輸出流從進(jìn)程中讀取數(shù)據(jù)然后寫(xiě)入到目標(biāo)文件。

字節(jié)流和字符流的區(qū)別。

字節(jié)流在JDK1.0中就被引進(jìn)了,用于操作包含ASCII字符的文件。JAVA也支持其他的字符如Unicode,為了讀取包含Unicode字符的文件,JAVA語(yǔ)言設(shè)計(jì)者在JDK1.1中引入了字符流。ASCII作為Unicode的子集,對(duì)于英語(yǔ)字符的文件,可以可以使用字節(jié)流也可以使用字符流。

Java中流類的超類主要由那些?

java.io.InputStream
java.io.OutputStream
java.io.Reader
java.io.Writer

FileInputStream和FileOutputStream是什么?

這是在拷貝文件操作的時(shí)候,經(jīng)常用到的兩個(gè)類。在處理小文件的時(shí)候,它們性能表現(xiàn)還不錯(cuò),在大文件的時(shí)候,最好使用BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)

System.out.println()是什么?

println是PrintStream的一個(gè)方法。out是一個(gè)靜態(tài)PrintStream類型的成員變量,System是一個(gè)java.lang包中的類,用于和底層的操作系統(tǒng)進(jìn)行交互。

什么是Filter流?

Filter Stream是一種IO流主要作用是用來(lái)對(duì)存在的流增加一些額外的功能,像給目標(biāo)文件增加源文件中不存在的行數(shù),或者增加拷貝的性能。

有哪些可用的Filter流?

在java.io包中主要由4個(gè)可用的filter Stream。兩個(gè)字節(jié)filter stream,兩個(gè)字符filter stream. 分別是FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.這些類是抽象類,不能被實(shí)例化的。

在文件拷貝的時(shí)候,那一種流可用提升更多的性能?

在字節(jié)流的時(shí)候,使用BufferedInputStream和BufferedOutputStream。
在字符流的時(shí)候,使用BufferedReader 和 BufferedWriter

說(shuō)說(shuō)管道流(Piped Stream)

有四種管道流, PipedInputStream, PipedOutputStream, PipedReader 和 PipedWriter.在多個(gè)線程或進(jìn)程中傳遞數(shù)據(jù)的時(shí)候管道流非常有用。

說(shuō)說(shuō)File類

它不屬于 IO流,也不是用于文件操作的,它主要用于知道一個(gè)文件的屬性,讀寫(xiě)權(quán)限,大小等信息。

說(shuō)說(shuō)RandomAccessFile?

它在java.io包中是一個(gè)特殊的類,既不是輸入流也不是輸出流,它兩者都可以做到。他是Object的直接子類。通常來(lái)說(shuō),一個(gè)流只有一個(gè)功能,要么讀,要么寫(xiě)。但是RandomAccessFile既可以讀文件,也可以寫(xiě)文件。 DataInputStream 和 DataOutStream有的方法,在RandomAccessFile中都存在。

到此,相信大家對(duì)“Java IO流常見(jiàn)面試題有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

名稱欄目:JavaIO流常見(jiàn)面試題有哪些-創(chuàng)新互聯(lián)
新聞來(lái)源:http://www.muchs.cn/article46/peshg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站建設(shè)Google、微信小程序ChatGPT、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)