System.in.read()的用法

2023-05-16

 

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对象将其缓冲,提高输入操作的效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.in.read()的用法 的相关文章

  • 为什么我的系统库和框架在 macOS Monterey 中不可见?

    我在刚刚构建的 dylib 上使用 otool L 检查了一些依赖关系 并得到了以下系统依赖关系 System Library Frameworks Accelerate framework Versions A Accelerate co
  • Java Manifest.mf 类路径问题

    我一直在尝试运行一个 jar 文件 我们称之为 test jar 它在 Unix 系统上使用 Sybase jconn3 jar 我创建了一个 MANIFEST MF 文件 其中包含以下内容 Class Path SYBASE jConne
  • 在哪里可以找到 iPhone 系统按钮和图标图形?

    我正在尝试找到一种在网站中使用原始 Apple 系统按钮和图标的方法 有没有办法把这些原始图形变成png格式 当然 获得它们的方法并不太好 我想到的有两个 将他们从这个链接 然后转换为png 在 iPhone 上截取屏幕截图 然后从保存的图
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • Unix系统文件表

    我对 Unix 系统文件表感到困惑 当两个或多个进程打开一个文件进行读取时 系统文件表是为每个进程创建单独的条目还是单个条目 如果为打开同一文件的多个进程创建单个条目 它们的文件偏移量也会相同吗 If process 1 opens fil
  • Java 有没有办法找出安装了多少个 CPU(或核心)?

    我想对多线程程序进行一些调整 如果我知道有多少线程可以真正并行工作 我可以使程序更加有效 Java 有没有办法获取这些信息 您可以使用 Runtime getRuntime availableProcessors 但它更多的是一个最佳猜测
  • 带系统函数的 C 程序中的大括号扩展

    我尝试了命令 cat tmp file 1 3 gt newFile 并且工作完美 但是当我编译并执行以下c程序时 include
  • Android 中如何检查应用程序是否为非系统应用程序?

    我收到一份清单ApplicationInfo对象与packageManager getInstalledApplications 0 http developer android com reference android content
  • 在 PHP 中执行 exec() 或 system() 且不等待输出

    我想从 PHP 脚本中触发 eider exec 或 system 中的 shell 命令 但这是一项需要一段时间才能完成的任务 有没有办法触发它并继续运行 PHP 页面加载而不延迟 编辑 我使用的是 CentOS 6 PHP 5 3 取决
  • 如何从网站执行vbscript

    我有一个 VBScript 文件 当它在计算机上时 它工作正常 我想将它放在一个 php 站点上 以便通过单击按钮来执行它 但我还没有成功 它实际上获取计算机信息 希望它能在用户的机器上运行 任何想法将不胜感激 如果或者如果有人知道如何用
  • 在 Java 中在屏幕上绘图

    我想用 Java 创建一个帮助应用程序 其行为如下 每当通过全局快捷方式调用时 它都可以在屏幕上绘制一些文本 不是在其自己的应用程序窗口上 而是在屏幕顶部 类似的帖子是here https stackoverflow com questio
  • 使用以 SYSTEM 身份运行的 vb.net 应用程序,如何为每个登录用户启动一个分离的进程?

    经过几周对这个主题的研究 我终于决定开始自己的主题 希望有经验的人可以提供帮助 我在互联网上进行了搜索 试图了解各种编码示例 但在尝试将可行的解决方案组合在一起时却遇到了困难 让我从一些背景开始 背景 我有一个 vb net 应用程序 正在
  • 使用 system() 命令运行多个 R 脚本

    我在 Windows 7 中运行 RStudio 我编写了一个主脚本 该脚本生成 57 个新的 R 脚本 每个脚本都包含根据两个参数运行函数的命令 vector1 lt c 1 19 vector2 lt c 1 3 首先 主脚本使用两个
  • 在 Perl 中启动非等待后台进程

    我有一个 Perl 脚本 需要在后台启动另一个进程并退出 而不等待其他脚本完成 StackOverflow 上有很多线程介绍如何在 Perl 中等待或如何不等待其他编程语言 但我似乎找不到 Perl 的正确答案 我已经阅读了相当多的内容 并
  • 数据对齐:限制内存地址为数据类型大小的倍数的原因

    我理解数据对齐的一般概念 但我不理解的是对内存地址值的限制 强制为基础数据类型大小的倍数 这个答案 https stackoverflow com a 672482 11205473很好地解释了数据对齐 Quote 我们看一下内存映射 00
  • 如何在 Qt 中获取输出 system() 命令?

    我在 Qt 中使用 system 命令 我想获得输出并将其显示给用户 我的命令是 system echo rootPass toAscii su root c yum y install packageName toAscii 当我在 QP
  • 如何在perl系统函数中同时使用管道并防止shell扩展?

    如果将多个参数传递给 perl 的系统函数 则 shell 扩展将不起作用 COMMAND perl e my s system echo s RESULT 如果该命令作为一个参数传递 则扩展将起作用 COMMAND perl e my s
  • 使用数据库(MySql)的生产者/消费者系统,这可行吗?

    我需要使用某物协调我的系统与多个消费者 生产者 每个消费者 生产者在具有不同操作系统的不同机器上运行 我一直在研究使用 MySql 来做到这一点 但这似乎非常困难 我的要求很简单 我希望能够随时添加或删除消费者 生产者 因此他们根本不应该相
  • 如何检测系统日期回滚?

    如何检测用户何时回滚系统日期 使用情况是为了防止规避许可 程序需要检测在未运行时发生的回滚 好吧 您可以在程序中使用嵌入式数据库 其中每隔一段时间就会插 入一个加密的系统日期 如果您发现 较新 的日期早于之前的某个日期 则可以看出有人更改了
  • popen vs system:popen 和 system 一样邪恶吗?

    popen 缓冲输出 而系统则不缓冲 这是唯一的区别吗 据我所知 popen 和 system 都通过 shell 运行命令 然而 popen 是evil http www cplusplus com forum articles 1115

随机推荐