System.in.read()的用法

來源:互聯網
上載者:User
文章目錄
  • read
  • read
  • read

 

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
從輸入資料流中讀取資料的下一個位元組。返回 0255 範圍內的 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] 的元素。

InputStreamread(b) 方法的效果等同於:

 read(b, 0, b.length) 

參數:
b - 儲存讀入資料的緩衝區。
返回:
讀入緩衝區的總位元組數;如果因為已經到達流末尾而不再有資料可用,則返回 -1
拋出:
IOException - 如果不是因為流位於檔案末尾而無法讀取第一個位元組;如果輸入資料流已關閉;如果發生其他 I/O 錯誤。
NullPointerException - 如果
bnull
另請參見:
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] 的元素都不會受到影響。

InputStreamread(b, off, len) 方法重複調用方法
read()。如果第一次這樣的調用導致 IOException,則從對 read(b,
off, len) 方法的調用中返回該異常。如果對 read() 的任何後續調用導致
IOException,則捕獲該異常並將其視為到達檔案末尾;到達該點時讀取的位元組儲存在 b 中,並返回傳生異常之前讀取的位元組數。在已讀取輸入資料
len 的請求數量、檢測到檔案結束標記、拋出異常前,此方法的預設實現將一直阻塞。建議子類提供此方法更為有效實現。

參數:
b - 讀入資料的緩衝區。
off - 數組 b 中將寫入資料的初始位移量。
len - 要讀取的最大位元組數。
返回:
讀入緩衝區的總位元組數;如果因為已到達流末尾而不再有資料可用,則返回 -1
拋出:
IOException - 如果不是因為位於檔案末尾而無法讀取第一個位元組;如果輸入資料流已關閉;如果發生其他 I/O 錯誤。
NullPointerException - 如果
bnull
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對象將其緩衝,提高輸入操作的效率。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.