zoukankan      html  css  js  c++  java
  • System.in.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() 实际上是在遍历该流中的每一个字节数据。最常见的流是键盘输入流。我们可以在键盘中输入一个字符串(其中按下回车键代表了两个字符 , 的 ASCII码值是10, 是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<5;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对象将其缓冲,提高输入操作的效率。

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/wzyxidian/p/5533226.html
Copyright © 2011-2022 走看看