文章目錄
System.in.read()的用法
2007-10-25 22:00:24| 分類:
預設分類 | 標籤:
|字型大小大中小 訂閱
用讀取鍵盤輸入必須構建
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() throws IOException
-
從輸入資料流中讀取資料的下一個位元組。返回
0 到
255 範圍內的
int 位元組值。如果因為已經到達流末尾而沒有可用的位元組,則傳回值
-1。在輸入資料可用、檢測到流末尾或者拋出異常前,此方法一直阻塞。
子類必須提供此方法的一個實現。
-
-
-
返回:
-
下一個資料位元組;如果到達流的末尾,則返回
-1。
-
拋出:
-
IOException - 如果發生 I/O 錯誤。
read
public int read(byte[] b) throws IOException
-
從輸入資料流中讀取一定數量的位元組,並將其儲存在緩衝區數組
b 中。以整數形式返回實際讀取的位元組數。在輸入資料可用、檢測到檔案末尾或者拋出異常前,此方法一直阻塞。
如果 b 的長度為 0,則不讀取任何位元組並返回 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。
-
拋出:
-
IOException - 如果不是因為流位於檔案末尾而無法讀取第一個位元組;如果輸入資料流已關閉;如果發生其他 I/O 錯誤。
-
NullPointerException - 如果
b 為
null。
-
另請參見:
-
read(byte[], int, int)
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。
-
拋出:
-
IOException - 如果不是因為位於檔案末尾而無法讀取第一個位元組;如果輸入資料流已關閉;如果發生其他 I/O 錯誤。
-
NullPointerException - 如果
b 為
null。
-
IndexOutOfBoundsException - 如果
off 為負,
len 為負,或者
len 大於
b.length - off
-
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對象將其緩衝,提高輸入操作的效率。