摘要:我們?cè)谇懊嬉呀?jīng)提到的幾種流就有它們的使用情境和和主要用于解決不限于純文本的二進(jìn)制文件的輸入輸出情境。同時(shí),如果使用帶有緩沖區(qū)的緩沖輸入輸出流的話會(huì)使得讀寫(xiě)的效率更高,有助于更快地完成不限于純文本的二進(jìn)制文件的讀寫(xiě)。
不同情境的流:
流的種類(lèi)很多,針對(duì)不同的IO數(shù)據(jù)交換情景我們可以選擇不同的流來(lái)完成任務(wù)。
我們?cè)谇懊嬉呀?jīng)提到的幾種流就有它們的使用情境:
1. FileInputStream和FileOutputStreamFileInputStream和FileOutputStream主要用于解決不限于純文本的二進(jìn)制文件的輸入輸出情境。同時(shí),如果使用帶有緩沖區(qū)的緩沖輸入輸出流的話會(huì)使得讀寫(xiě)IO的效率更高,有助于更快地完成不限于純文本的二進(jìn)制文件的讀寫(xiě)。
public class FilesTest { public static void main(String[] args) throws IOException { FileInputStream fileInputStream = new FileInputStream(new File("1.png")); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); FileOutputStream fileOutputStream = new FileOutputStream(new File("2.png")); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); byte[] buffer = new byte[1024]; while(bufferedInputStream.read(buffer)!=-1){ bufferedOutputStream.write(buffer); } bufferedInputStream.close(); bufferedOutputStream.close(); fileInputStream.close(); fileOutputStream.close(); } }2. FileReader和FileWriter
FileReader和FileWriter主要用于解決字符文本文件的讀寫(xiě),因?yàn)樵谶@些流提供了很多有利于處理字符的方法來(lái)對(duì)字符進(jìn)行豐富的處理。同樣的,如果使用帶有緩沖區(qū)的輸入輸出流同樣可以提高IO讀寫(xiě)效率。
public class FilesTest { public static void main(String[] args) throws IOException { FileReader fileReader = new FileReader(new File("1.txt")); FileWriter fileWriter = new FileWriter(new File("2.txt")); BufferedReader bufferedReader = new BufferedReader(fileReader); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); String haveRead; while((haveRead=bufferedReader.readLine())!=null){ bufferedWriter.write(haveRead); } bufferedReader.close(); bufferedWriter.close(); fileWriter.close(); fileReader.close(); } }3. ByteArrayInputStream和ByteArrayOutputStream
內(nèi)存流的輸入輸出端不是IO文件而是內(nèi)存中的對(duì)象,使用方法和IO流一樣,一般使用內(nèi)存流直接向流中注入數(shù)據(jù)再傳到其他的IO文件中去或者把從IO文件中讀取的數(shù)據(jù)注入到內(nèi)存對(duì)象中去。
//創(chuàng)建與內(nèi)存對(duì)象相關(guān)聯(lián)的流,將內(nèi)存對(duì)象中的數(shù)據(jù)寫(xiě)入到IO文件中去: public class FilesTest { public static void main(String[] args) throws IOException { String temp = "abcd"; byte[] buffer = temp.getBytes(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer); FileOutputStream fileOutputStream = new FileOutputStream(new File("test.txt")); byte[] swap = new byte[1024]; while(byteArrayInputStream.read(swap)!=-1){ fileOutputStream.write(swap); } byteArrayInputStream.close(); fileOutputStream.close(); } } //創(chuàng)建與內(nèi)存對(duì)象相關(guān)聯(lián)的流,將IO對(duì)象中的數(shù)據(jù)寫(xiě)入到內(nèi)存對(duì)象中去: public class FilesTest { public static void main(String[] args) throws IOException { byte[] des = new byte[1024]; FileInputStream fileInputStream = new FileInputStream(new File("test.txt")); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; while(fileInputStream.read(buffer)!=-1){ byteArrayOutputStream.write(buffer); } des = byteArrayOutputStream.toByteArray(); fileInputStream.close(); byteArrayOutputStream.close(); System.out.println(new String(des)); } }4. System.in和System.out
作為非常重要的IO對(duì)象,標(biāo)準(zhǔn)輸入輸出System.in和System.out這一對(duì)對(duì)象同樣可以建立起關(guān)聯(lián)它們的流,這些流把標(biāo)準(zhǔn)輸入輸出設(shè)備中的數(shù)據(jù)作為源或目標(biāo),將這些數(shù)據(jù)和內(nèi)存中的程序交互。(可以把標(biāo)準(zhǔn)輸入輸出想成一般的文件,標(biāo)準(zhǔn)輸入就像是一個(gè)數(shù)據(jù)是即時(shí)寫(xiě)入的文件,而標(biāo)準(zhǔn)輸出就像是一個(gè)數(shù)據(jù)是即時(shí)寫(xiě)出的文件)
public class FilesTest { public static void main(String[] args) throws IOException { byte[] des = new byte[1024]; DataInputStream dataInputStream = new DataInputStream(System.in); dataInputStream.read(des); DataOutputStream dataOutputStream = new DataOutputStream(System.out); dataOutputStream.write(des); dataInputStream.close(); dataOutputStream.close(); } }流的轉(zhuǎn)換
對(duì)于字節(jié)流和字符流也可以通過(guò)轉(zhuǎn)換的方法來(lái)靈活使用,也就是構(gòu)造字節(jié)流和字符流在同一個(gè)流對(duì)象鏈上就可以了,相當(dāng)于字節(jié)流在直接和程序交互之前先將數(shù)據(jù)流到字符流里做一下處理。這個(gè)過(guò)程也可以使用專(zhuān)有的InputStreamReader和OutputStreamWriter來(lái)實(shí)現(xiàn):這個(gè)過(guò)程將FileInputStream流里的數(shù)據(jù)按一種編碼方式讀入InputStreamReader,然后按另一種編碼方式從OutputStreamWriter寫(xiě)入到FileOutputStream中這個(gè)過(guò)程實(shí)現(xiàn)了對(duì)字符編碼的修改,是字符流的特征。
public class FilesTest { public static void main(String[] args) throws IOException { FileInputStream fileInputStream = new FileInputStream(new File("1.txt")); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1"); FileOutputStream fileOutputStream = new FileOutputStream(new File("2.txt")); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8"); char[] buffer = new char[1024]; while(inputStreamReader.read(buffer)!=-1){ outputStreamWriter.write(buffer); } inputStreamReader.close(); outputStreamWriter.close(); fileInputStream.close(); fileOutputStream.close(); } }
這個(gè)例子是對(duì)BufferReader進(jìn)一步轉(zhuǎn)換的工具類(lèi)Scanner的使用,在底層使用BufferReader的Scanner可以在緩沖區(qū)對(duì)數(shù)據(jù)進(jìn)行暫存并進(jìn)一步進(jìn)行處理,比如按符號(hào)劃分:
public class FilesTest { public static void main(String[] args) { try (Scanner scanner = new Scanner(new BufferedReader(new FileReader("test.txt")));) { scanner.useDelimiter("[,|^]"); while (scanner.hasNext()) { System.out.println(scanner.next()); } System.out.println("Done!"); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64646.html
摘要:下面我們使用字節(jié)輸入輸出流來(lái)說(shuō)明這個(gè)問(wèn)題輸入流一般是由對(duì)象如建立的,當(dāng)新建一個(gè)時(shí),對(duì)象建立了一個(gè)包含有數(shù)據(jù)的管道其實(shí)就是我們所說(shuō)的這個(gè)流并將對(duì)象存儲(chǔ)的數(shù)據(jù)輸入到管道中,因此管道里的數(shù)據(jù)流就是對(duì)象內(nèi)的數(shù)據(jù)。 流的原理: showImg(/img/bVqa89); 一連串有順序的數(shù)據(jù)系列可以看成是一個(gè)流。 輸入輸出流: 數(shù)據(jù)從IO輸入到程序的流是輸入流,數(shù)據(jù)從程序輸出到IO的流是輸出流。 ...
摘要:知識(shí)點(diǎn)總結(jié)異常知識(shí)點(diǎn)總結(jié)異常為什么需要異常機(jī)制不是所有的問(wèn)題都能在編譯時(shí)被發(fā)現(xiàn),有些問(wèn)題在程序運(yùn)行時(shí)才會(huì)暴露出來(lái)異常機(jī)制是面向?qū)ο蟮奶幚沓绦蛟谶\(yùn)行時(shí)發(fā)生的狀況的手段使用異常機(jī)制不會(huì)打亂原有業(yè)務(wù)邏輯的用塊把可能出異常的代碼保護(hù)起來(lái)用一個(gè) Java知識(shí)點(diǎn)總結(jié)(JavaIO-異常) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java異常] [toc] 為什么需要異常機(jī)制 不是所有的問(wèn)題都能在編譯...
摘要:知識(shí)點(diǎn)總結(jié)類(lèi)知識(shí)點(diǎn)總結(jié)類(lèi)類(lèi)可以進(jìn)行創(chuàng)建和刪除文件等操作。使用一個(gè)類(lèi),則必須向類(lèi)的構(gòu)造方法中傳遞一個(gè)文件路徑。 Java知識(shí)點(diǎn)總結(jié)(JavaIO-File類(lèi)) @(Java知識(shí)點(diǎn)總結(jié))[Java, JavaIO] [toc] File類(lèi) File類(lèi)可以進(jìn)行創(chuàng)建和刪除文件等操作。使用一個(gè)File類(lèi),則必須向File類(lèi)的構(gòu)造方法中傳遞一個(gè)文件路徑。 showImg(https://segme...
摘要:知識(shí)點(diǎn)總結(jié)內(nèi)存操作流知識(shí)點(diǎn)總結(jié)前面所講的程序中輸入輸出都是從文件中來(lái),當(dāng)然也可以將輸出的位置設(shè)置在內(nèi)存上。將內(nèi)容寫(xiě)入到內(nèi)存中。 Java知識(shí)點(diǎn)總結(jié)(JavaIO-內(nèi)存操作流) @(Java知識(shí)點(diǎn)總結(jié))[Java, JavaIO] [toc] showImg(https://segmentfault.com/img/bV82tm?w=753&h=275); 前面所講的程序中輸入、輸出都是...
摘要:知識(shí)點(diǎn)總結(jié)類(lèi)知識(shí)點(diǎn)總結(jié)類(lèi)用于從緩沖區(qū)中讀取內(nèi)容,所有的輸入字節(jié)數(shù)據(jù)都將放在緩沖區(qū)中中定義的構(gòu)造方法只能接收字符輸入流的實(shí)例,所以必須使用字符輸入流和字節(jié)輸入流的轉(zhuǎn)換類(lèi)將字節(jié)輸入流轉(zhuǎn)變?yōu)樽址鳌? Java知識(shí)點(diǎn)總結(jié)(JavaIO- BufferedReader類(lèi)) @(Java知識(shí)點(diǎn)總結(jié))[Java, JavaIO] [toc] showImg(https://segmentfault....
閱讀 2176·2023-04-26 01:56
閱讀 3175·2021-11-18 10:02
閱讀 3154·2021-09-09 11:35
閱讀 1413·2021-09-03 10:28
閱讀 3486·2019-08-29 18:36
閱讀 2916·2019-08-29 17:14
閱讀 890·2019-08-29 16:10
閱讀 1668·2019-08-26 13:45