1. 程式人生 > >java 中 read 用法

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()                    throws 
IOException
從輸入流中讀取資料的下一個位元組。返回 0 到 255 範圍內的 int 位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回值 -1。在輸入資料可用、檢測到流末尾或者丟擲異常前,此方法一直阻塞。

子類必須提供此方法的一個實現。

返回:
下一個資料位元組;如果到達流的末尾,則返回 -1
丟擲:

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
丟擲:
 - 如果不是因為流位於檔案末尾而無法讀取第一個位元組;如果輸入流已關閉;如果發生其他 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物件將其緩衝,提高輸入操作的效率