摘要:文件的讀寫是流常用的也是最基礎(chǔ)的操作,然而字節(jié)流,字符流,,,等等,各種各樣的流操作類傻傻分不清楚,今天我們就對(duì)常用的流操作做簡(jiǎn)單的總結(jié)。
文件的讀寫是java i/o流常用的也是最基礎(chǔ)的操作,然而字節(jié)流,字符流,InputStream,OutpurStream,Reader,Writer等等,各種各樣的流操作類傻傻分不清楚,今天我們就對(duì)常用的流操作做簡(jiǎn)單的總結(jié)。本文力求簡(jiǎn)潔,不至于看到大量的代碼覺(jué)得困倦。
字節(jié)流/字符流表分類 | 字節(jié)輸入流 | 字節(jié)輸出流 | 字符輸入流 | 字符輸出流 | |
---|---|---|---|---|---|
抽象基類 | InputStream | OutputStream | Reader | Writer | |
訪問(wèn)文件 | FileInputStream | FileOutputStream | FileReader | FileWriter | |
訪問(wèn)數(shù)組 | ByteArrayInputStream | BiteArrayOutputStream | CharArrayReader | CharArrayWriter | |
訪問(wèn)管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter | |
訪問(wèn)字符串 | StringReader | StringWriter | |||
緩沖流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter | |
轉(zhuǎn)換流 | InputStreamReader | OutputStreamWriter | |||
對(duì)象流 | ObjectInputStream | ObjectOutputStream | |||
抽象基類 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回輸入流 | PushbackInputStream | PushbackReader | |||
特殊流 | DataInputStream | DataOutputStream |
其中基類都是抽象類,不同的子類對(duì)應(yīng)不同的用途
首先我們看一下字節(jié)流與字符流的不同之處
字節(jié)流是由字節(jié)組成的,字符流是由字符組成的. Java里字符由兩個(gè)字節(jié)組成.字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來(lái)處理的但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來(lái)處理,也就是要進(jìn)行字符集的轉(zhuǎn)化。
通俗的來(lái)講,字節(jié)流就是二進(jìn)制流,通常的圖片,視頻,音頻文件都可以通過(guò)字節(jié)流來(lái)讀寫,字符流就是字符串,中文字符,等unicode字符編碼后的字符集。字節(jié)流可以通過(guò)轉(zhuǎn)換流(即InputStreamReader,InputStreamWriter)轉(zhuǎn)換為字符流(轉(zhuǎn)化的過(guò)程就是編碼的過(guò)程),緩沖流是為了提高讀寫效率提供的類,可以開辟出一個(gè)緩沖區(qū)用于高速存取數(shù)據(jù)流(分別對(duì)應(yīng)字節(jié)流和字符流)。
字節(jié)流讀寫文件的實(shí)例public class FileCopy { public void fileCopy(String sourceFile,String targetFile) throws IOException{ FileInputStream in=new FileInputStream(sourceFile); FileOutputStream out=new FileOutputStream(targetFile); byte[] buffer=new byte[2048];//創(chuàng)建2048個(gè)字節(jié)大小的緩沖區(qū)(可根據(jù)拷貝文件大小自行定義) int value; while((value=in.read(buffer))!=-1){//循環(huán)讀寫 out.write(buffer, 0, value); } if(in!=null)in.close();//關(guān)閉i/o流 if(out!=null)out.close(); } public static void main(String[] args) throws IOException { String in="readFile.txt"; String out="outFile.txt"; FileCopy f=new FileCopy(); f.fileCopy(in, out); } }
文件拷貝不推薦用這種方法,此方法僅作為字節(jié)流轉(zhuǎn)字符流的實(shí)例,因?yàn)樵谖募opy中字節(jié)流轉(zhuǎn)化為字符流讀寫的意義不大,而且會(huì)降低運(yùn)行效率
public class FileCopy { public void fileCopy(String sourceFile,String targetFile) throws IOException{ FileInputStream in=new FileInputStream(sourceFile); FileOutputStream out=new FileOutputStream(targetFile); BufferedReader reader=new BufferedReader(new InputStreamReader(in)); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out)); String line=""; StringBuffer result=new StringBuffer(); while((line=reader.readLine())!=null){ writer.write(line);//此處的write是將數(shù)據(jù)寫入緩沖區(qū),并沒(méi)有寫入文件 writer.flush();//將緩沖區(qū)數(shù)據(jù)寫入文件 } if(writer!=null)writer.close(); if(reader!=null)reader.close(); } public static void main(String[] args) throws IOException { String in="readFile.txt"; String out="outFile.txt"; FileCopy f=new FileCopy(); f.fileCopy(in, out); System.out.println("hell java"); } }
關(guān)鍵在于這兩行
BufferedReader reader=new BufferedReader(new InputStreamReader(in)); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));
將FileInputStream作為參數(shù)傳入InputStreamReader中然后作為參數(shù)傳給BufferedReader,其中InputStreamReader作為Reader的子類傳入
我的文章列表
Email:[email protected]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66956.html
摘要:一面試題及剖析今日面試題今天壹哥帶各位復(fù)習(xí)一塊可能會(huì)令初學(xué)者比較頭疼的內(nèi)容,起碼當(dāng)時(shí)讓我很有些頭疼的內(nèi)容,那就是流。在這里壹哥會(huì)從兩部分展開介紹流,即與流。除此之外盡量使用字節(jié)流。關(guān)閉此輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復(fù)習(xí)一塊可...
摘要:為了講清復(fù)用的是什么,首先得先說(shuō)明一下邏輯流的概念。理解了這個(gè),那么所謂的復(fù)用,指的就是在一個(gè)邏輯流里處理多個(gè)事件如何做到利用多路復(fù)用器,輪詢監(jiān)聽(tīng)各路,如果一旦有事件發(fā)生,那么就去處理,否則程序阻塞。 java nio提供了一套稱為I/O多路復(fù)用的編程范式,那么什么叫做I/O多路復(fù)用呢?所謂的I/O多路復(fù)用,從字面意思上來(lái)理解,就是:有多個(gè)I/O操作(或是寫,或是讀,或是請(qǐng)求),這多個(gè)...
字符流 Java平臺(tái)使用Unicode約定存儲(chǔ)字符值,字符流I/O自動(dòng)將此內(nèi)部格式與本地字符集進(jìn)行轉(zhuǎn)換,在Western語(yǔ)言環(huán)境中,本地字符集通常是ASCII的8位超集。 對(duì)于大多數(shù)應(yīng)用程序,具有字符流的I/O并不比具有字節(jié)流的I/O復(fù)雜,使用流類完成的輸入和輸出會(huì)自動(dòng)轉(zhuǎn)換為本地字符集和從本地字符集轉(zhuǎn)換,使用字符流代替字節(jié)流的程序會(huì)自動(dòng)適應(yīng)本地字符集并為國(guó)際化做了準(zhǔn)備 — 所有這些都無(wú)需程序員的額...
摘要:如果不指定字符集,則使用系統(tǒng)默認(rèn)字符編碼,系統(tǒng)的默認(rèn)字符編碼一般是。所以更準(zhǔn)確的說(shuō),是將一個(gè)字節(jié)輸入流按照給定的字符編碼來(lái)解碼,從而得到一個(gè)字符輸入流。當(dāng)然,缺點(diǎn)就是不能選擇使用的字符編碼。 相對(duì)于Python和 C來(lái)說(shuō),Java的I/O操作API比較復(fù)雜,因此本文打算做個(gè)簡(jiǎn)單的介紹。 1. I/O分類 總的來(lái)說(shuō)Java的I/O按照處理數(shù)據(jù)的粒度和方向來(lái)劃分,一共可以分為4類: 基...
I/O流 I/O流表示輸入源或輸出目標(biāo),流可以表示許多不同類型的源和目標(biāo),包括磁盤文件、設(shè)備、其他程序和內(nèi)存數(shù)組。 流支持許多不同類型的數(shù)據(jù),包括簡(jiǎn)單字節(jié)、原始數(shù)據(jù)類型、本地化字符和對(duì)象,有些流只是傳遞數(shù)據(jù),其他人以有用的方式操縱和轉(zhuǎn)換數(shù)據(jù)。 無(wú)論它們?nèi)绾卧趦?nèi)部工作,所有流都為使用它們的程序提供相同的簡(jiǎn)單模型:流是一系列數(shù)據(jù),程序使用輸入流從源讀取數(shù)據(jù),一次一個(gè)條目: showImg(https:...
閱讀 3108·2021-11-19 09:40
閱讀 1569·2021-11-15 11:39
閱讀 686·2021-10-08 10:05
閱讀 2281·2021-09-03 10:29
閱讀 3414·2021-08-12 13:22
閱讀 2180·2019-08-30 15:54
閱讀 3721·2019-08-30 14:03
閱讀 2663·2019-08-30 13:45