2013-02-06 111 views
6

我最近開始使用Java,希望瞭解大型應用程序的Java模塊。我遇到了這樣的java代碼行:Java中的BufferedReader和InputStreamReader

String line = (new BufferedReader(new InputStreamReader(System.in))).readLine(); 

這是什麼java代碼做的。是否有這樣的C/C++等價物?

+4

爲什麼標記爲C++和C? –

+0

包裝和包裝。閱讀['InputStreamReader'](http://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html)和['BufferedReader'](http://docs.oracle.com)的javadoc .com/javase/7/docs/api/java/io/BufferedReader.html)。 –

+2

C++等價物大概是'std :: string line; std :: getline(std :: cin,line);' – jrok

回答

9

System.in是標準輸入。

InputStreamReader允許您關聯從指定輸入(在本例中爲標準輸入)讀取的流,因此現在我們有一個流。

BufferedReader是一個「抽象」,可以幫助您處理流。例如,它實現了readLine,而不是逐字讀字符,直到找到'\ n'來獲取整行。它只是在這個過程之後返回一個字符串。

所以這條線的意思是:「從標準輸入中讀取一行並將其存儲在line變量中」。

1

代碼所做的只是簡單地從輸入流中讀取一行。從模式的角度來看,這是一個裝飾者。至於使用BufferedReader是爲了提高IO性能。

+2

使用BufferedReader用於'readLine()'方法,該方法在InputstreamReader中不存在。 – davmac

4

您的片段使用BufferedReader(鏈接到InputStreamReader)從標準輸入控制檯讀取aline並將其存儲到String行。

的BufferedReader

從字符輸入流讀取文本,緩衝字符,從而提供字符,數組和行的高效讀取。 可以指定緩衝區大小,或者可以使用默認大小。默認值對於大多數目的而言足夠大。 通常,由Reader構成的每個讀取請求都會導致相應的讀取請求由底層字符或字節流組成。因此,建議將BufferedReader包裝在read()操作可能代價高昂的Reader中,如FileReaders和InputStreamReaders。

的BufferedReader的readLine#()

讀取文本行的。換行符被換行符('\ n'),回車符('\ r')或回車符後面的換行符中的任何一個結束。

InputStreamReader的

InputStreamReader是字節流以字符流的橋樑:它讀取字節並將其解碼成使用指定的charset字符。它使用的字符集可以用名字指定,也可以明確給出,或者可以接受平臺的默認字符集。每個對InputStreamReader的read()方法之一的調用都可能導致從底層字節輸入流中讀取一個或多個字節。爲了能夠有效地將字節轉換爲字符,可以從基礎流中讀取比滿足當前讀取操作所需的字節更多的字節。

系統

System類包含一些有用的類字段和方法。它不能被實例化。

System類提供的功能包括標準輸入,標準輸出和錯誤輸出流;訪問外部定義的「屬性」;加載文件和庫的手段;以及用於快速複製數組的一部分的實用方法。

System.in

「標準」 輸入流。該流已經打開並準備好提供輸入數據。通常,此流對應於由主機環境或用戶指定的鍵盤輸入或其他輸入源。

7

> What does this java code do

String line是你string object

new BufferedReader().readLine()BufferedReader的讀取從字符輸入流中的文本的實例;而readline()是一個它實現讀取直到換行符的方法。

new InputStreamReader()爲您提供了一個InputStreamReader的實例,它是字節流中的標準和BufferedReader想要的字符流之間的「橋樑」。

System.in是標準輸入(字節流)


> Is there a C/C++ equivalent of this
嗯...有沒有所謂的C/C++語言...;)
所以我假設你想要的答案爲他們每個人。

在C,有沒有「串」你必須使用一個字符數組,但你可以在一個字符數組stdin的東西,如讀取數據:

char input[100]; 
... 
scanf("%99[^\n]", input); 

fgets (input, 100 , stdin) 

在C++中,你會使用:

using namespace std; 

string line; 
getline(cin, line); 
1

InputStreamReader是從字節流到字符流的橋樑:它使用指定的字符集讀取字節並將其解碼爲字符。它使用的字符集可以用名字指定,也可以明確給出,或者可以接受平臺的默認字符集。

對InputStreamReader的read()方法之一的每次調用都可能導致從底層字節輸入流中讀取一個或多個字節。爲了能夠有效地將字節轉換爲字符,可以從基礎流中讀取比滿足當前讀取操作所需的字節更多的字節。

爲了達到最高效率,我們考慮在BufferedReader中包裝一個InputStreamReader。例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

相關問題