java 中 read 用法
用讀取鍵盤輸入必須構建
1。輸入流 System.in;
2。字元輸入流 InputStreamReader
3。快取輸入流 BufferedReader
4。快取輸入流方法 readLine()//中文意思:讀一行(遇上enter鍵)
程式碼:BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
System.in.read()返回一個整型位元組資料,該資料表示的是位元組因此是Unicode的第一個位元組或是字元的ASCII碼值。該方法是從一個流中一個一個的讀取資料,因此是一個迭代的過程。我們可以看出in是一個靜態的流,因此在該程式中只有一個流,重複呼叫System.in.read()實際上是在遍歷該流中的每一個位元組資料。最常見的流是鍵盤輸入流。我們可以在鍵盤中輸入一個字串(其中按下回車鍵代表了兩個字元\r\n,\r的ASCII碼值是10,\n是13)。我們可以重複呼叫System.in.read()來讀取從鍵盤輸入的字串中的字元所代表的位元組(ASCII值)。
public final class System extends Object
System
類包含一些有用的類欄位和方法。它不能被例項化。
在 System
類提供的設施中,有標準輸入、標準輸出和錯誤輸出流;對外部定義的屬性和環境變數的訪問;載入檔案和庫的方法;還有快速複製陣列的一部分的實用方法。
public static final InputStream in
“標準”輸入流。此流已開啟並準備提供輸入資料。通常,此流對應於鍵盤輸入或者由主機環境或使用者指定的另一個輸入源。
read
public abstract int read() throwsIOException
- 從輸入流中讀取資料的下一個位元組。返回
0
到255
範圍內的int
位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回值-1
。在輸入資料可用、檢測到流末尾或者丟擲異常前,此方法一直阻塞。子類必須提供此方法的一個實現。
-
- 返回:
- 下一個資料位元組;如果到達流的末尾,則返回
-1
。 - 丟擲:
read
public int read(byte[] b) throws IOException
- 從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列
b
中。以整數形式返回實際讀取的位元組數。在輸入資料可用、檢測到檔案末尾或者丟擲異常前,此方法一直阻塞。如果
b
0
;否則,嘗試讀取至少一個位元組。如果因為流位於檔案末尾而沒有可用的位元組,則返回值-1
;否則,至少讀取一個位元組並將其儲存在b
中。將讀取的第一個位元組儲存在元素
b[0]
中,下一個儲存在b[1]
中,依次類推。讀取的位元組數最多等於b
的長度。設 k 為實際讀取的位元組數;這些位元組將儲存在b[0]
到b[
k-1]
的元素中,不影響b[
k]
到b[b.length-1]
的元素。類
InputStream
的read(b)
方法的效果等同於:read(b, 0, b.length)
-
- 引數:
b
- 儲存讀入資料的緩衝區。- 返回:
- 讀入緩衝區的總位元組數;如果因為已經到達流末尾而不再有資料可用,則返回
-1
。 - 丟擲:
- - 如果不是因為流位於檔案末尾而無法讀取第一個位元組;如果輸入流已關閉;如果發生其他 I/O 錯誤。
- 另請參見:
read
public int read(byte[] b, int off, int len) throws IOException
- 將輸入流中最多
len
個數據位元組讀入 byte 陣列。嘗試讀取len
個位元組,但讀取的位元組也可能小於該值。以整數形式返回實際讀取的位元組數。在輸入資料可用、檢測到流末尾或者丟擲異常前,此方法一直阻塞。
如果
len
為 0,則不讀取任何位元組並返回0
;否則,嘗試讀取至少一個位元組。如果因為流位於檔案末尾而沒有可用的位元組,則返回值-1
;否則,至少讀取一個位元組並將其儲存在b
中。將讀取的第一個位元組儲存在元素
b[off]
中,下一個儲存在b[off+1]
中,依次類推。讀取的位元組數最多等於len
。設 k 為實際讀取的位元組數;這些位元組將儲存在b[off]
到b[off+
k-1]
的元素中,不影響b[off+
k]
到b[off+len-1]
的元素。在任何情況下,
b[0]
到b[off]
的元素以及b[off+len]
到b[b.length-1]
的元素都不會受到影響。類
InputStream
的read(b,
off,
len)
方法重複呼叫方法read()
。如果第一次這樣的呼叫導致IOException
,則從對read(b,
off,
len)
方法的呼叫中返回該異常。如果對read()
的任何後續呼叫導致IOException
,則捕獲該異常並將其視為到達檔案末尾;到達該點時讀取的位元組儲存在b
中,並返回發生異常之前讀取的位元組數。在已讀取輸入資料len
的請求數量、檢測到檔案結束標記、丟擲異常前,此方法的預設實現將一直阻塞。建議子類提供此方法更為有效的實現。 -
- 引數:
b
- 讀入資料的緩衝區。off
- 陣列b
中將寫入資料的初始偏移量。len
- 要讀取的最大位元組數。- 返回:
- 讀入緩衝區的總位元組數;如果因為已到達流末尾而不再有資料可用,則返回
-1
。 - 丟擲:
- - 如果不是因為位於檔案末尾而無法讀取第一個位元組;如果輸入流已關閉;如果發生其他 I/O 錯誤。
import java.io.*;
public class IO{
public static void main(String args[])throws IOException{
System.out.println("計算矩形面積");
System.out.println("請輸入長:");
int a,b;
a=System.in.read();
System.out.println("請輸入寬");
b=System.in.read();
System.out.println("計算矩形面積是:"+a*b);
}
}
結果:
計算矩形面積
請輸入長:
1
請輸入寬
計算矩形面積是:637
問題 沒等我輸入寬 就直接輸出了 637 ??
為什麼 ? 637 是什麼意思??
解釋一下 system.i.read()
最佳答案
System.in.read接收的是位元組0-255
你輸入個1以後,其實返回的是ASCII碼,也就是49
然後你又按了個回車,回車的ASCII碼是13
結果相當於
a=49
b=13
System.in.read()可以實現輸入字元,返回字元的Unicode碼,但是缺點是隻能輸入一個字元,如
public class exec
{
public static void main( String args[] ) throws Exception
{
int i=System.in.read();
System.out.println(i);
}
}
如果輸入1
輸出為49
如果輸入123
輸出還是49
利用System.in.read()的過載函式可以實現對多個字元的輸入,如
public class exec
{
public static void main( String args[] ) throws Exception
{
byte[] barray=new byte[5];
System.in.read(barray);
for(int i=0;i
System.out.println(barray[i]);
}
}
如果輸入1
輸出為
49
13
10
0
0
如果輸入12
輸出為
49
50
13
10
0
此時可以發現輸入的還是Unicode碼,但是會多產生很多其他字元,如回車和換行等。
如何進一步將位元組陣列資訊轉換成所需型別,需要結合流類進行處理
想輸入字元或數字要用輸入流如DataInputStream等來協助轉換,如:
import java.io.* ;
public class Vs
{
public static void main ( String args[] )
{
double x=0, y=0;
DataInputStream in = new DataInputStream(System.in);
System.out.println( "輸入x的數值:" );
try
{
x = Double.parseDouble(in.readLine());
System.out.println( "x的數值:"+ x );
}catch(Exception e)
{
System.out.println( "Wrong!!!!!!!!" );
}
System.out.println( "輸入y的數值:" );
try
{
y = Double.parseDouble(in.readLine());
System.out.println( "y的數值:"+ y );
}catch(Exception e)
{
System.out.println( "Wrong!!!!!!!!" );
}
System.out.println( Math.pow(x, y) );
}
}
或:
import java.io.*;
public class Sum{
public static void main(String args[]){
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(reader.readLine());
System.out.println(a);
}
catch(Exception e){
System.out.println(e);
}
}
}
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
其中InputStreamReader是用於象讀取字元流一樣讀取二進位制輸入流的具體類,在這裡將System.in放到InputStreamReader物件之中,然後通過使用BufferedReader物件將其緩衝,提高輸入操作的效率