摘要:我們在前面已經提到的幾種流就有它們的使用情境和和主要用于解決不限于純文本的二進制文件的輸入輸出情境。同時,如果使用帶有緩沖區的緩沖輸入輸出流的話會使得讀寫的效率更高,有助于更快地完成不限于純文本的二進制文件的讀寫。
不同情境的流:
流的種類很多,針對不同的IO數據交換情景我們可以選擇不同的流來完成任務。
我們在前面已經提到的幾種流就有它們的使用情境:
1. FileInputStream和FileOutputStreamFileInputStream和FileOutputStream主要用于解決不限于純文本的二進制文件的輸入輸出情境。同時,如果使用帶有緩沖區的緩沖輸入輸出流的話會使得讀寫IO的效率更高,有助于更快地完成不限于純文本的二進制文件的讀寫。
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主要用于解決字符文本文件的讀寫,因為在這些流提供了很多有利于處理字符的方法來對字符進行豐富的處理。同樣的,如果使用帶有緩沖區的輸入輸出流同樣可以提高IO讀寫效率。
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
內存流的輸入輸出端不是IO文件而是內存中的對象,使用方法和IO流一樣,一般使用內存流直接向流中注入數據再傳到其他的IO文件中去或者把從IO文件中讀取的數據注入到內存對象中去。
//創建與內存對象相關聯的流,將內存對象中的數據寫入到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(); } } //創建與內存對象相關聯的流,將IO對象中的數據寫入到內存對象中去: 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對象,標準輸入輸出System.in和System.out這一對對象同樣可以建立起關聯它們的流,這些流把標準輸入輸出設備中的數據作為源或目標,將這些數據和內存中的程序交互。(可以把標準輸入輸出想成一般的文件,標準輸入就像是一個數據是即時寫入的文件,而標準輸出就像是一個數據是即時寫出的文件)
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(); } }流的轉換
對于字節流和字符流也可以通過轉換的方法來靈活使用,也就是構造字節流和字符流在同一個流對象鏈上就可以了,相當于字節流在直接和程序交互之前先將數據流到字符流里做一下處理。這個過程也可以使用專有的InputStreamReader和OutputStreamWriter來實現:這個過程將FileInputStream流里的數據按一種編碼方式讀入InputStreamReader,然后按另一種編碼方式從OutputStreamWriter寫入到FileOutputStream中這個過程實現了對字符編碼的修改,是字符流的特征。
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(); } }
這個例子是對BufferReader進一步轉換的工具類Scanner的使用,在底層使用BufferReader的Scanner可以在緩沖區對數據進行暫存并進一步進行處理,比如按符號劃分:
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(); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64646.html
摘要:下面我們使用字節輸入輸出流來說明這個問題輸入流一般是由對象如建立的,當新建一個時,對象建立了一個包含有數據的管道其實就是我們所說的這個流并將對象存儲的數據輸入到管道中,因此管道里的數據流就是對象內的數據。 流的原理: showImg(/img/bVqa89); 一連串有順序的數據系列可以看成是一個流。 輸入輸出流: 數據從IO輸入到程序的流是輸入流,數據從程序輸出到IO的流是輸出流。 ...
摘要:知識點總結異常知識點總結異常為什么需要異常機制不是所有的問題都能在編譯時被發現,有些問題在程序運行時才會暴露出來異常機制是面向對象的處理程序在運行時發生的狀況的手段使用異常機制不會打亂原有業務邏輯的用塊把可能出異常的代碼保護起來用一個 Java知識點總結(JavaIO-異常) @(Java知識點總結)[Java, Java異常] [toc] 為什么需要異常機制 不是所有的問題都能在編譯...
摘要:知識點總結類知識點總結類類可以進行創建和刪除文件等操作。使用一個類,則必須向類的構造方法中傳遞一個文件路徑。 Java知識點總結(JavaIO-File類) @(Java知識點總結)[Java, JavaIO] [toc] File類 File類可以進行創建和刪除文件等操作。使用一個File類,則必須向File類的構造方法中傳遞一個文件路徑。 showImg(https://segme...
摘要:知識點總結內存操作流知識點總結前面所講的程序中輸入輸出都是從文件中來,當然也可以將輸出的位置設置在內存上。將內容寫入到內存中。 Java知識點總結(JavaIO-內存操作流) @(Java知識點總結)[Java, JavaIO] [toc] showImg(https://segmentfault.com/img/bV82tm?w=753&h=275); 前面所講的程序中輸入、輸出都是...
摘要:知識點總結類知識點總結類用于從緩沖區中讀取內容,所有的輸入字節數據都將放在緩沖區中中定義的構造方法只能接收字符輸入流的實例,所以必須使用字符輸入流和字節輸入流的轉換類將字節輸入流轉變為字符流。 Java知識點總結(JavaIO- BufferedReader類) @(Java知識點總結)[Java, JavaIO] [toc] showImg(https://segmentfault....
閱讀 1915·2023-04-26 01:56
閱讀 3112·2021-11-18 10:02
閱讀 3049·2021-09-09 11:35
閱讀 1284·2021-09-03 10:28
閱讀 3408·2019-08-29 18:36
閱讀 2846·2019-08-29 17:14
閱讀 833·2019-08-29 16:10
閱讀 1616·2019-08-26 13:45