當前位置:首頁 » 編程語言 » javaio詳解

javaio詳解

發布時間: 2023-08-02 20:42:19

1. 同學們知道java中的IO是指什麼

一般指文件相關的操作。在Java中,使用文件流進行編碼時,需要引入對應的JAR包,而其中最主要的類,像File、FileInputStream、FileOutputStream等等,大多都封裝在IO這個包裡面。所以Java中,說到IO相關的操作,一般情況下都會認為是文件相關的操作。

2. java中處理中文輸入,不需要用到的類是

Java把不同類型的輸入、輸出抽象為流stream,分為輸入流和輸出流,用統一的介面來表示
Java開發環境中提供了包java.io,其中包括一系列的類來實現輸入/輸出處理
InputStream是所有位元組輸入流的祖先,而OutputStream是所有位元組輸出流的祖先
public abstract class InputStream implements Closeable
public abstract class OutputStream implements Closeable, Flushable
具體子類: ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream,
PipedInputStream, SequenceInputStream, StringBufferInputStream
InputStream
InputStream類是一個抽象類,方法包括:
int read()
int read(byte[])
int read(byte[],int,int)
void close()關閉流
int available()報告流中直接可讀的位元組數
skip(long)跳過流中指定的位元組
OutputStream
OutputStream也是一個抽象類。它的主要方法包括:
void write(int)
void write(byte[])
void write(byte[],int,int)
其中第一個方法的int型的參數對應要寫入的位元組,後兩個方法的參數與InputStream類似。
void close() 關閉輸出流
void flush() 強行將寫入緩沖區中剩餘的數據寫入
File file = new File("d:\\FileTest.java");
if (file.exists()) {
try (InputStream is = new FileInputStream(file);) {
byte[] buffer = new byte[8192];
int len = is.read(buffer);
while (len > 0) {
System.out.write(buffer, 0, len);
len = is.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
}
}
InputSream 和 OutputStream 中定義了 read() 和 write() 方法,它們被派生流類重載。位元組流是位元組序
列,它與外部設備中的位元組存在著一一對應的關系,不存在字元的轉換,被讀寫位元組的個數與外部設備中的位元組個數是相同的
基本輸入輸出方法
System類是Java語言中一個功能強大、非常有用的類,它提供了標准輸入/輸出及運行時的系統信息
System類不能創建對象,也就是說,System類的所有屬性和方法都是靜態的,引用時要以System 作為前綴
System.in與System.out是System類的兩個靜態屬性,分別對應了系統的標准輸入/輸出流 System類管理標准輸入輸出流和錯誤流
System.out:把輸出送到預設的顯示(通常是顯示器),是PrintStream的對象
System.in:從標准輸入獲取輸入(通常是鍵盤),是InputStream的對象
System.err:把錯誤信息送到預設的顯示,是PrintStream的對象
同時使用System.out和System.err輸出信息不能保證顯示順序就是執行順序,為了避免這種情況在測試代碼執行中經常使用System.err輸出

FileInputStream、FileOutputStream 順序讀取文件
PipedInputStream、PipedOutputStream 管道
ByteArrayInputStream、ByteArrayOutputStream 內存讀寫
FilterInputStream、FilterOutputStream 過濾流(有多線程同步)
DataInputStream、DataOutputStream 對數據類型讀寫,有多線程同步
BufferedInputStream、BufferedOutputStream 緩沖類型讀寫

1 、使用位元組流進行文件的單位元組復制
FileInputStream是InputStream的子類,FileInputStream屬於節點流,用於按位元組讀取文件內容
FileOutputStream是OutputStream的子類,FileOutputStream屬於節點流,用於按位元組輸出數據到文件中
//FileInputStream中read方法的定義
/**
從指定的輸入流中按位元組讀取數據,如果讀到流的末尾則返回-1,否則返回讀取到的數據。如果文件不存
在則異常FileNotFoundException【IOException的子類】
*/
public int read() throws IOException {
return read0();
}
//FileOutputStream中write方法的定義
//屬性,用於表示是否進行文件的追加操作而不是覆蓋操作
private final boolean append;
//構造器方法的定義,其中name是文件名稱,默認採用覆蓋操作
public FileOutputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null, false);
}
//按照位元組執行寫出int數據,自動會去除多餘的位元組。如果文件不存在則自動創建新文件,如果
文件已經存在則按照append的值決定採用的是追加操作還是覆蓋操作
public void write(int b) throws IOException {
write(b, append);
}
private native void write(int b, boolean append) throws IOException; //
由VM採用對等類的方式提供實現
public class Test1 {
public static void main(String[] args) throws IOException {
try (InputStream is = new FileInputStream("c:/面向對象文檔.txt");
OutputStream os = new FileOutputStream("test.txt");) {
int kk;
while ((kk = is.read()) != -1) {
os.write(kk);
}
}
}
}
2 、讀取 A.java 文件並在控制台上顯示
如何使用控制台輸出 : System.out 位元組流
分析:使用位元組流從 A.java 中一個位元組一個位元組的讀取內容,然後再使用 System.out.print 方法輸出即可
注意:讀取操作返回的 int 的取值范圍為 0-255 ,則表示這里不會有符號位,所以 is.read()==-1 不是只適合於文本文件
File ff = new File("T1.java");
if (ff.exists()) {// 如果文件存在則進行拷貝操作,否則提示文件不存在
InputStream is = new FileInputStream(ff);
OutputStream os = new FileOutputStream("t1.bak");
while (true) {
int kk = is.read();// 返回值應該是0-255,如果返回-1表示流已經結束
if (kk < 0)break;
os.write(kk);
}
is.close();
os.close();
} else
System.out.println("T1.java文件不存在");
InputStream基本輸入類
InputStream類是基本的輸入類。它定義了所有輸入流所需的方法。

public abstract int read() throws IOException讀取一個位元組並以整數的形式返回,0-255。如果 返回-1已到輸入流的末尾。
public int read(byte b[]) throws IOException讀取一系列位元組並存儲到一個數組,返回實際讀取的 位元組數。如果已經讀到輸入流的末尾則返回-1
public void close() throws IOException 關閉輸入流並釋放資源
public int read(byte b[],int offset,int length) throws IOException功能為從輸入流中讀數據。這一 方法有幾種重載形式,可以讀一個位元組或一組位元組。當遇到文件尾時,返回-1。最後一種形式中的 offset是指把結果放在b[]中從第offset個位元組開始的空間,length為長度
public long skip (long n) throws IOEnception 從輸入流跳過幾個位元組。返回值為實際跳過的位元組數
OutputStream基本輸出類
三個重載形式都是用來向輸出流寫數據的
public abstract void write(int b)向輸入流寫入一個位元組數據,該位元組為參數的低8位。
public void write(byte b[],int offset,int length)將一個位元組類型的數組中的從指定位置offset開始 的length個位元組寫入到輸出流
public void close( ) 關閉輸出流,釋放資源
public void write(byte b[])將一個位元組類型的數組中的數據寫入到輸出流
public void flush() 清除緩沖區,將緩沖區內尚未寫出的數據全部輸出
字元流
在頂層有 Reader 和 Writer 兩個抽象類。 Reader 和 Writer 中定義了 read() 和 write() 方法,它們被派生流類重載
Reader 抽象類的定義
public abstract class Reader implements Readable, Closeable {
//BIO,讀取一個有效的字元,返回值為0到65535的整數,如果到達流的末尾則返回-1
public int read() throws IOException
//BIO,讀取字元存儲到char數組中,返回讀取的字元個數,流結束則返回-1
public int read(char cbuf[]) throws IOException
//關閉流,同時釋放資源
abstract public void close() throws IOException;
Writer 抽象類的定義
public abstract class Writer implements Appendable, Closeable, Flushable {
//寫出一個字元到字元流,要寫的字元包含在給定整數值的16個低位;16個高位被忽略。
public void write(int c) throws IOException
//將字元數組中的指定部分內容壓入到字元流,從off開始共len個字元
abstract public void write(char cbuf[], int off, int len) throws
IOException;
/關閉流,同時釋放資源
abstract public void close() throws IOException;
相關的子類
InputStreamReader、OutputStreamWriter橋接流,用於自動實現位元組流和字元流的轉換
FileReader、FileWriter文件流,用於實現針對文本文件的讀寫操作
CharArrayReader、CharArrayWriter內存流,用於實現針對char數組的讀寫操作
PipedReader、PipedWriter管道流,用於線程之間的通訊
FilterReader、FilterWriter過濾流的父類
BufferedReader、BufferedWriter緩存流,用於在流中添加緩沖區
StringReader、StringWriter內存流,用於實現針對字元串的讀寫操作

使用字元流實現 txt 文件的讀取顯示【其中包含中文】
編寫一個程序,讀取文件 test.txt 的內容並在控制台輸出。如果源文件不存在,則顯示相應的錯誤信息。
字元流 Reader
int read()讀取一個字元並以整數的形式返回0-65535,如果返回-1則已到輸入流末尾
int read(char[] cbuf)讀取一系列字元並存儲到一個數組中,返回實際讀取的字元數,如果讀到輸入流末尾則返回-1
void close()關閉輸入流並釋放內存資源
int read(char[] cbuf, int off, int len) 讀取len個字元並存儲到一個數組中,從off位置開始,返回實
際讀取的字元數,如果讀取到輸入流末尾則返回-1
long skip(long n)跳過n個字元不讀,返回實際跳過的位元組數
字元流 Writer
void write(int c) 將字元(int數組的低8位)壓入到字元流中
void write(char[] cbuf, int off, int len)將字元數組中的指定部分內容壓入到字元流中,從off開始共len個字元
void write(String str) 將字元串中的內容壓入到字元流中
void close() 關閉流並釋放所佔用的資源
void write(String str, int off, int len) 將字元串中的指定部分內容壓入到字元流中,從下標off開始共len個字元
void flush()刷新緩沖區,將緩沖區中的數據全部送出到目標地,然後清空緩沖區
void write(char[] cbuf) 將字元數組中的所有數據壓入到字元流中
一般來說:一次讀寫一個字元效率太低,可以引入 char[] 數組提高執行效率
小結
在學些BIO時記憶父類的方法,區分子類的實現不同
InputStream中的方法 read(byte[]):int; Reader中方法read(char[]):int 如果到達流末尾 則-1
OutputStream中的方法 write(byte[],0,len):void;Writer中的方法 write(char[],0,len)/write(String)
一般在使用中,如果讀取數據使用位元組流,則寫出數據採用的也是位元組流;不建議混用,除非引入 橋接流
文件流
FileInputStream("file-name") FileInputStream(File) FileNotFoundException
FileReader("file-name") FileReader(File) FileNotFoundException
FileOutputStream("file-name") FileOutputStream("file-name",true) 默認文件覆蓋,如果 參數true表示追加
FileWriter("file-name") FileWriter("file-name",true)
一般不使用單位元組或者單字元的操作方法,使用數組
注意:try(){}是推薦寫法,否則應該使用try{}finally{}結構保證流的關閉
針對二進制文件不建議使用字元流,建議使用位元組流進行操作,否則有可能拷貝文件出現問題:

如果針對文本文件則建議使用字元流,因為編碼使用比較方便

文章知識點與官方知識檔案匹配
Java技能樹類和介面類和面向對象
89124 人正在系統學習中
點擊閱讀全文
打開CSDN,閱讀體驗更佳

java用於輸入輸出流的類_java輸入輸出流_lsgn的博客
java輸入輸出流 java IO綜述 在整個Java.io包中最重要的就是5個類和一個介面。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個介面指的是Serializable。 Java I/O主要包括如下幾個層次,包含三個部分: ...
java常見輸入輸出類型_3分鍾秒懂大數據的博客
輸入:每行輸入一個數,連續輸入n行,遇到0結束輸入,然後輸出結果。 importjava.util.ArrayList; importjava.util.Scanner; publicclassTest4{ publicstaticvoidmain(String[] args){ Scannersc=newScanner(System.in); ...
25、JAVA進階——輸入輸出流
一、認識Java的流 二、使用位元組流讀寫文本文件 1、使用位元組流類FileInputStream讀文本文件 2、使用位元組流類FileOutputStream寫文本文件 三、使用字元流讀寫文本文件 1、使用字元流類BufferedReader和FileReader讀文本文件 2、使用字元流類BufferedWrite和FileWrite寫文本文件 四、讀寫二進制文件 1、 使用位元組流讀二進制文件 2、 使用位元組流寫二進制文件 五、序列化和反序列化 1、認識序列化 2、序列化保存對
繼續訪問

java 輸入類_java 輸入輸出類
java中輸入輸出類如果理不清思路的話就會很混亂!一.File類提供與操作系統無關的文件操作!可以查看api文檔了解它的方法二.輸出操作:1.把信息輸出到屏幕上最簡單的操作就是使用標准輸出:System.out.println();下面討論一下流方式的輸出,與之相關的類如下OutputStreamWriter:它提供字元流到位元組流的轉換,換句話說它寫入字元數據然後按照指定字元集轉換為位元組數據Buf...
繼續訪問
JAVA的輸入輸出_努力的地球人的博客_java輸出
Java的輸入 Scanner類 為了使用scanner類,我們首先需要導入java.util.Scanner包 import java.util.Scanner; 1 創建scanner對象,從用戶獲取輸入 //創建scanner對象 Scanner str=new Scanner(System.in); //接受用戶輸入 int w=str.nextIn...
java輸入輸出_java中輸入輸出總結_weixin_39609407的博客
標准輸入studin,對象是鍵盤。 標准輸出stdout,對象是屏幕。 標准錯誤輸出stderr,對象也是屏幕。 二、java.io包中的數據流和文件類 位元組流:從InputStream和OutputStream派生出來的一系列類。這類流以位元組(byte)為基本處理單位。
Java——不同數據類型的輸入輸出方式與轉化方式
java 中不同數據類型的 輸入方法 輸出格式 與 轉化方式
繼續訪問

Java文本輸出常用類
package com.ss.extract; import java.io.*; import org.apache.log4j.Logger; /** * 結果輸出類 * @author Shu */ public class ResultOutput { private ...
繼續訪問
1.Java基礎入門 -(2)輸入輸出類_菜鳥的小蟲子的博客
一. Java Scanner 類 java.util.Scanner是 Java5 的新特徵,我們可以通過 Scanner 類來獲取用戶的輸入。 Scanner 對象的基本語法: Scanner in= new Scanner(System.in); 示例1: 輸入結果: ...
java的輸入輸出流類型_理解JAVA輸入輸出流_天接雲濤的博客
1、位元組流抽象類 InputStream輸入流 OutputStream輸出流 2、字元流抽象類 Reader 輸入字元流 Writer 輸出字元流 四、JAVA中流體系架構 有一些對流進行操作的基本的方法,我們以文件輸入輸出流進行說明: ...
java的輸出類
System.out這個類是PrintStream類,定義如下 public class PrintStream extends FilterOutputStream PrintStream都是用print的相關函數輸出到控制台上。print的實現都是用write(String s)實現。 而,PrintWriter這個輸出類,也同樣實現輸出:PrintWriter extends ...
繼續訪問
Java中的各種輸出形式
一、Java中的各種輸出形式: package cn.jl.lwj; public class Demo00 { public static void main(String[] args) { //標識符定義 區分大小寫 int a = 5; int A = 6; //區分大小寫 int Class = 6; int age = 5; //定義常量 final int AGE_MAX = 30;...
繼續訪問
java中的BIO基礎-3
java中的io基礎
繼續訪問
Java學習-IO流進階
緩沖流也稱為高效流、或者高級流。之前學習的位元組流可以稱為原始流。
繼續訪問

IO進階之高級IO
高級IO
繼續訪問
Java中的IO進階操作
Java中的IO進階操作 一、序列化和反序列化 常用於多台伺服器之間進行java對象的數據傳遞。 1.概念 序列化 是指程序中准備好的Java對象,永久的保存在磁碟中,這個過程其實是一個out的動作。 ObjectOutputStream:通過在流中使用文件可以實現對象的持久存儲。 創建對象:ObjectOutputStream(OutputStream out) 常用方法: void writeObject(Object obj):將指定的對象寫入ObjectOutputStream 反序列化 是指把
繼續訪問
Java IO最詳解,歡迎提出意見
Java IO 詳解 初學java,一直搞不懂java裡面的io關系,在網上找了很多大多都是給個結構圖草草描述也看的不是很懂。而且沒有結合到java7 的最新技術,所以自己來整理一下,有錯的話請指正,也希望大家提出寶貴意見。 首先看個圖:(如果你也是初學者,我相信你看了真個人都不好了,想想java設計者真是煞費苦心啊!) 這是java io 比較基本的一些處理流,除此之外我們還會...
繼續訪問
java輸出類型_java中各種類型的輸入輸出
import java.lang.Exception;import java.lang.String;import java.util.Scanner;public class test {public static void main(String[] args) {Scanner s = new Scanner(System.in);char ch;System.out.print("Char...
繼續訪問
java中輸入流的類_Java中的輸入/輸出流類
Java中包含的輸入/輸出流類 1.java.io包中的介面 (1)處理位元組流的有DataInput介面和DataOutput介面,RandomAccessFile同時實現了這兩個介面; (2)處理對象流的有ObjectInput介面和ObjectOutput介面,ObjectInputStream類實現了ObjectInput介面,ObjectOutputStream類實現了ObjectOutp...
繼續訪問
使用java的輸入/輸出類
1. 什麼是IO? I:input 輸入 通常做讀取操作(將不同數據源的數據讀入到內存中,也叫讀取流) O:output 輸出通常做寫入操作(將內存中的數據寫入到不同的數據源,也叫寫入流) 2. 理解流的概念。 想像一下自來水公司要把水輸到用戶家裡,應該先把自來水公司到用戶家裡的連接水管建好,再將水輸出去。管道里輸送的是水,但IO里輸送的是位元組。 u流是...
繼續訪問
Java中的輸入/輸出流類
Java中包含的輸入/輸出流類 1.java.io包中的介面 (1)處理位元組流的有DataInput介面和DataOutput介面,RandomAccessFile同時實現了這兩個介面; (2)處理對象流的有ObjectInput介面和ObjectOutput介面,ObjectInputStream類實現了ObjectInput介面,ObjectOutputStream類實現了ObjectOutp...
繼續訪問
最新發布 【Java基礎】自定義一個格式輸出類
在項目實際開發中,後端介面都按照一定的格式輸出給前端調用,在返回中包括狀態碼和介面的主要作用等注釋,再包含實際的data。
繼續訪問

IO流(進階提高)
本篇文章繼上一篇IO流(小試牛刀)繼續更新JavaIO流的知識。 常見IO流的結構圖解: 回顧一下IO的基本介面知識: ————————————————————我是不起眼的分割線———————————————————————— IO的序列化與反序列化 Java序列化是指把Java對象轉換為位元組序列的過程;Java反序列化是指把位元組序列恢復為Java對象的過...
繼續訪問
java進階8——IO流
File類 File概述 File文件和目錄路徑名的抽象表示形式。即,Java中把文件或者目錄(文件夾)都封裝成File對象。也就是說如果我們要去操作硬碟上的文件,或者文件夾只要找到File這個類即可。 File類的構造函數 File(String pathname); // 將一個字元串路徑封裝成File對象 File(String parent,String child);...
繼續訪問
Java IO流進階之常用流(一)
請多參考JDK文檔:http://www.matools.com/api/java8或https://docs.oracle.com/javase/8/docs/api/ 轉換流——OutputStreamWriter類和InputStreamReader類 位元組與字元的轉換流: OutputStreamWriter:是Writer類的子類,將輸出的字元流變為位元組流。 InputStreamRe...
繼續訪問
詳解JAVA I/O之二——java.io層次結構
<br />java I/O(Input/Output)學習——java.io層次結構文章分類:Java編程stream代表的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括兩種類型: <br />(1)位元組流 <br /><br /> 表示以位元組為單位從stream中讀取或往stream中寫入信息,即io包中的inputstream類和outputstream類的派生類。通常用來讀取二進制數據,

3. java中的import java.io.*是什麼意思 io具體又是什麼意思

import java.io.* 這個是引用包import java.io.*這個的意思而IO則是輸入輸出流的意思,也就是inputStream,和outputStream這些類的

4. java io流的典型使用方式有幾種

Java中IO流分成兩大類,

一種是輸入流,所有的輸入流都直接或間接繼承自InputStream抽象類,輸入流作為數據的來源,我們可以通過輸入流的read方法讀取位元組數據;

另一種是輸出流,所有的輸出流都直接或間接繼承自OutputStream抽象類,輸出流接收數據,可以通過write方法寫入位元組數據。


Java的IO流類中,大部分的輸入流和輸出流都是成對存在的,即如果存在XXXInputStream,那麼就存在XXXOutputStream,反之亦然。SequenceInputStream和StringBufferInputStream是特例,沒有對應的SequenceOutputStream類和StringBufferOutputStream類,許多IO操作都可能會拋出IOException異常,比如read、write、close操作。

以下是Java的IO流中常見的輸入流,由於每個輸入流都有其對應的輸出流,所以此處就不再列出輸出流的繼承結構圖。



1、ByteArrayInputStream & ByteArrayOutputStream:

ByteArrayInputStream構造函數中需要傳入一個byte數組作為數據源,當執行read操作時,就會從該數組中讀取數據,正如其名,是一種基於位元組數組實現的一種簡單輸入流,顯而易見的是,如果在構造函數中傳入了null作為位元組數據,那麼在執行read操作時就會出現NullPointerException異常,但是在構造函數初始化階段不會拋出異常;與之相對應的是ByteArrayOutputStream,其內部也有一個位元組數組用於存儲write操作時寫入的數據,在構造函數中可以傳入一個size指定其內部的byte數組的大小,如果不指定,那麼默認它會將byte數組初始化為32位元組,當持續通過write向ByteArrayOutputStream中寫入數據時,如果其內部的byte數組的剩餘空間不能夠存儲需要寫入的數據,那麼那麼它會通過調用內部的ensureCapacity
方法對其內部維護的byte數組進行擴容以存儲所有要寫入的數據,所以不必擔心其內部的byte數組太小導致的IndexOutOfBoundsException之類的異常。

2、FileInputStream & FileOutputStream

FileInputStream 能夠將文件作為數據源,讀取文件中的流,通過File對象或文件路徑等初始化,在其構造函數中,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)不存在或是一個目錄而不是文件或者由於其他原因無法打開讀取數據,都會導致在初始化階段導致拋出FileNotFoundException異常;與FileInputStream 相對應的是FileOutputStream,可以通過FileOutputStream向文件中寫入數據,也需要通過File對象或文件路徑對其初始化,如同FileInputStream ,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)是一個目錄而不是文件或者由於其他原因無法創建該文件寫入數據,都會導致在初始化階段拋出FileNotFoundException異常。

3、PipedInputStream & PipedOutputStream

PipedInputStream和PipedOutputStream一般是結合使用的,這兩個類用於在兩個線程間進行管道通信,一般在一個線程中執行PipedOutputStream 的write操作,而在另一個線程中執行PipedInputStream的read操作。可以在構造函數中傳入相關的流將PipedInputStream 和PipedOutputStream 綁定起來,也可以通過二者的connect方法將二者綁定起來,一旦二者進進行了綁定,那麼PipedInputStream的read方法就會自動讀取PipedOutputStream寫入的數據。PipedInputStream的read操作是阻塞式的,當執行PipedOutputStream的write操作時,PipedInputStream會在另一個線程中自動讀取PipedOutputStream寫入的內容,如果PipedOutputStream一直沒有執行write操作寫入數據,那麼PipedInputStream的read方法會一直阻塞PipedInputStream的read方法所運行的線程直至讀到數據。單獨使用PipedInputStream或單獨使用PipedOutputStream時沒有任何意義的,必須將二者通過connect方法(或在構造函數中傳入對應的流)進行連接綁定,如果單獨使用其中的某一個類,就會觸發IOException: Pipe Not Connected.

4、ObjectInputStream & ObjectOutputStream

ObjectOutputStream具有一系列writeXXX方法,在其構造函數中可以摻入一個OutputStream,可以方便的向指定的輸出流中寫入基本類型數據以及String,比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外,ObjectOutputStream還具有writeObject方法。writeObject方法中傳入的類型必須實現了Serializable介面,從而在執行writeObject操作時將對象進行序列化成流,並將其寫入指定的輸出流中。與ObjectOutputStream相對應的是ObjectInputStream,ObjectInputStream有與OutputStream中的writeXXX系列方法完全對應的readXXX系列方法,專門用於讀取OutputStream通過writeXXX寫入的數據。

5、SequenceInputStream

SequenceInputStream 主要是將兩個(或多個)InputStream在邏輯上合並為一個InputStream,比如在構造函數中傳入兩個InputStream,分別為in1和in2,那麼SequenceInputStream在讀取操作時會先讀取in1,如果in1讀取完畢,就會接著讀取in2。在我們理解了SequenceInputStream 的作用是將兩個輸入流合並為一個輸入流之後,我們就能理解為什麼不存在對應的SequenceOutputStream 類了,因為將一個輸出流拆分為多個輸出流是沒有意義的。

6、StringBufferInputStream

StringBufferInputStream允許通過在構造函數中傳入字元串以讀取位元組,在讀取時內部主要調用了String的charAt方法。與SequenceInputStream類似,StringBufferInputStream也沒有對應的OutputStream,即不存在StringBufferOutputStream類。Java沒有設計StringBufferOutputStream類的理由也很簡單,我們假設StringBufferOutputStream存在,那麼StringBufferOutputStream應該是內部通過執行write操作寫入數據更新其內部的String對象,比如有可能是通過StringBuilder來實現,但是這樣做毫無意義,因為一旦我們String的構造函數中可以直接傳入位元組數組構建字元串,簡單明了,所以設計StringBufferOutputStream就沒有太大的必要了。StringBufferInputStream這個類本身存在一點問題,它不能很好地將字元數組轉換為位元組數組,所以該類被Java標記為廢棄的(Deprecated),其官方推薦使用StringReader作為代替。

7、FilterInputStream & FilterOutputStream

FilterInputStream包含了其他的輸入流,說具體點就是在其構造函數中需要傳入一個InputStream並將其保存在其名為in的欄位中,FilterInputStream只是簡單的覆蓋了所有的方法,之所說是簡單覆蓋是因為在每個覆蓋函數中,它只是調用內部的保存在in欄位中的InputStream所對應的方法,比如在其覆蓋read方法時,內部只是簡單調用了in.read()方法。FilterInputStream的子類可以進一步覆蓋某些方法以保持介面不變的情況下實現某一特性(比如其子類有的可以通過使用緩存優化讀取的效率)或者提供一些其他額外的實用方法。所以在使用時FilterInputStream可以讓傳入的InputStream具有一些額外的特性,即對構造函數傳入的InputStream進行了一層包裹,使用了典型的裝飾著模式,如果只看FilterInputStream本身這一個類的話,則該類自己本身意義不大,因為其只是通過內部的欄位in簡單覆寫某些方法。但是如果將FilterInputStream 和其子類結合起來使用話,那麼就很有用了。比如FilterInputStream 有兩個子類BufferedInputStream和DataInputStream,這兩個類在下面還會詳細介紹。BufferedInputStream對read操作做了優化,每次讀操作時都讀取一大塊數據,然後將其放入內部維護的一個位元組數組緩沖區中。當外面調用BufferedInputStream的read方法時,首先去該緩沖區中讀取數據,這樣就避免了頻繁的實際的讀操作,BufferedInputStream對外沒有暴露額外的其他方法,但是其內部的read方法已經經過優化了,所以在執行讀操作的時候效率更高。DataInputStream與ObjectInputStream有點類似,可以通過一些readXXX方法讀取基本類型的數據,這是非常有用的一些方法。

8、BufferedInputStream & BufferedOutputStream

如上面所介紹的那樣,在BufferedInputStream的構造函數中需要傳入一個InputStream, BufferedInputStream內部有一個位元組數組緩沖區,每次執行read操作的時候就從這buf中讀取數據,從buf中讀取數據沒有多大的開銷。如果buf中已經沒有了要讀取的數據,那麼就去執行其內部綁定的InputStream的read方法,而且是一次性讀取很大一塊數據,以便填充滿buf緩沖區。緩沖區buf的默認大小是8192位元組,也就是8K,在構造函數中我們也可以自己傳入一個size指定緩沖區的大小。由於我們在執行BufferedInputStream的read操作的時候,很多時候都是從緩沖區中讀取的數據,這樣就大大減少了實際執行其指定的InputStream的read操作的次數,也就提高了讀取的效率。與BufferedInputStream 相對的是BufferedOutputStream。在BufferedOutputStream的構造函數中我們需要傳入一個OutputStream,這樣就將BufferedOutputStream與該OutputStream綁定在了一起。BufferedOutputStream內部有一個位元組緩沖區buf,在執行write操作時,將要寫入的數據先一起緩存在一起,將其存入位元組緩沖區buf中,buf是有限定大小的,默認的大小是8192位元組,即8KB,當然也可以在構造函數中傳入size指定buf的大小。該buf只要被指定了大小之後就不會自動擴容,所以其是有限定大小的,既然有限定大小,就會有被填充完的時刻,當buf被填充完畢的時候會調用BufferedOutputStream的flushBuffer方法,該方法會通過調用其綁定的OutputStream的write方法將buf中的數據進行實際的寫入操作並將buf的指向歸零(可以看做是將buf中的數據清空)。如果想讓緩存區buf中的數據理解真的被寫入OutputStream中,可以調用flush方法,flush方法內部會調用flushBuffer方法。由於buf的存在,會大大減少實際執行OutputStream的write操作的次數,優化了寫的效率。

5. java中的IO流是什麼啊該怎麼理解啊

關於你這個方向性的問題我一開始學的時候也覺得反了。後來搞清楚目標對象就懂了。理解Java的IO流,首先要把視角放在內存上,而不是放在文件上。
InputStream是用來寫入的沒錯,但不是寫入文件中,而是寫入內存中。所以InputStream的作用是從文件中讀取數據然後寫入內存中或者說寫入到正在運行的程序中。
而OutputStream同理,是從內存/程序中將數據推送出去,把數據保存到文件中。
以Java程序作為主視角,你就能懂了。Input讀取是為了讀給程序用,Output寫出是程序把數據輸出到硬碟上了。

熱點內容
在什麼地方查qq密碼 發布:2025-02-07 04:01:51 瀏覽:11
買二手筆記本電腦看哪些配置 發布:2025-02-07 04:01:48 瀏覽:308
我的世界裡面什麼伺服器是建造的 發布:2025-02-07 03:51:48 瀏覽:189
不能連接到資料庫 發布:2025-02-07 03:47:00 瀏覽:45
安卓手機如何設置翻屏動畫 發布:2025-02-07 03:46:18 瀏覽:594
利基型存儲器什麼意思 發布:2025-02-07 03:43:58 瀏覽:556
安卓讀寫許可權在哪裡 發布:2025-02-07 03:29:21 瀏覽:36
釘郵怎麼找回密碼 發布:2025-02-07 03:16:40 瀏覽:81
比特幣錢包源碼 發布:2025-02-07 03:16:39 瀏覽:101
飢荒如何轉移伺服器 發布:2025-02-07 03:14:42 瀏覽:4