簡體   English   中英

輸入流與輸出流有何不同?

[英]How is an Input Stream different from an Output Stream?

我看到兩者都是數據的“流”。 在那種情況下,為什么認為它們不同? 真的有什么區別?

評論 - 請不要關閉此問題。 這是一種基本的東西,可以在面試中混淆人們。

更新1 - 每個人似乎都說同樣的事情 - 你從IS讀取並寫入操作系統。 所以,它們基本相同。 就像一條水流過它的管道。 當您使用該管道中的水時,您將其稱為InputStream,當您將水泵入其中時,它稱為輸出流。 它真的那么微不足道嗎?

UPDATE2 -如果差異不那么“大”,那么我們可以有一個InAndOutStream而不必為兩個類(InputStream和OutputStream)創建代碼嗎?

它們在概念上是不同的

  • 從你讀的InputStream
  • 你寫的OutputStream

流是您按順序訪問的數據。 您可以將它想象成一條從隧道入口處觀看的火車,這樣您就可以一次看到一輛汽車。 或者是一條穿過傳送帶的小部件流,要求你在每個傳送帶上擰緊一個螺絲,然后再傳遞給裝配線上的下一個人,他必須用錘子砸它,等等。 當你從橋上看時,或者從河上漂浮的枝條。

無論它們如何在內部工作,所有流都為使用它們的程序提供相同的簡單模型:流是一系列數據。 程序使用輸入流從源讀取數據,一次一個項: IO流

程序使用輸出流將數據寫入目標,一次一個項目: IO流

如果差異不那么“大”,那么我們可以有一個InAndOutStream而不必為兩個類(InputStream和OutputStream)創建代碼嗎?

除了ByteArray類之外,這是不可能的。 原因是大多數Streams都由系統提供的設備(如文件或套接字)支持。 對於文件,您編寫的文件是您讀取的文件,但在套接字的情況下,您寫入的流與您讀取的流無關。

即使試圖將它們組合起來也是一個壞主意,因為人們在文本和二進制流之間變得足夠混亂。 如果他們能夠讀取和寫入同一個流,我會懷疑會更加混亂。

通常,開發人員應該清楚地知道它們是從設備讀取還是寫入。 如果他們不清楚你肯定會遇到問題。

僅供參考:我已經編寫了一個庫,它完全按照你在內存流中建議的內容,如“管道”;)但是,我會說它只適用於專家開發人員,即便如此,我仍然保持接口盡可能不同以防止混淆。

您從InputStream 讀取 ,並寫入 OutputStream 這是他們之間的關鍵區別。

在某些情況下,您需要能夠同時讀寫。 一個這樣的例子是流套接字 Java庫處理此問題的方法是使用InputStream OutputStream

流的概念並不像你在問題中所暗示的那樣對稱。 由於這是Java,因此流的讀寫器在執行環境中占據截然不同的位置:一個實現流對象,另一個調用方法。

因此,由於語言強制模型不對稱,因此Java中的任何I / O工具的實現者需要預先確定是占用流的讀取側還是寫入側。 該設施的用戶無法做出選擇。 例如,然后; 為了實現從其用戶接收數據的I / O工具,需要實現一個OutputStream (用戶可以調用它來寫入)。

為了實現對稱設施,語言需要能夠進行協同執行。 在這種情況下,流可以真正具有可讀和可寫的一面,並且嘗試寫入的調用者將屈服於讀者,反之亦然。 但是,Java不支持這樣的設施。 (至少在多線程之外,對於大多數情況來說,這顯然太重了。)

我希望這更清楚一些。

我最好的辦法是保持它們小,當用戶只打算讀取流時,為什么要加載用於寫入流的函數? 這純粹基於我的猜測......

編輯:我對單詞文件很傻,流可以用於多個文件。

為了避免流之間的混淆,例如html注冊表單,輸入表單的數據稱為輸入數據,一旦注冊成功或失敗輸出被稱為out-data。 應用程序以相同的方式通過輸入流接收數據,應用程序通過輸出流發送數據。

以下代碼可幫助我們避免流之間的混淆:

//Standard input: 
Scanner scan = new Scanner(System.in);
String s = scan.next();

//Standard output
System.out.println("Hello World!");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM