System.in.read()长度多2问题

本文探讨了标准输入流读取字节时出现的额外字节问题,通过实验定位到这些字节为回车和换行符,并分析其来源。

标准输入流会返回读取字节的长度,我们发现得出的数据会比实际输入的数据个数多2,但当我们输出数据的时候,多出的两个字节是不会显示的,由于我们不知道多出的两个字节的位置,这给我们直接处理输入的字节增加了难度。

我们在输出字节数组时做些手脚来看看多出的字节的位置,用System.out.println("*" +test[i]+ "*"); 这样我们可以看出那两个字节在末尾,接下来我们就要查明这两个字节的真实身份。

我们可以在输出时再做一些手脚,比如用System.out.println("*" +(int)test[i]+ "*");这里输出的是输入的字节对应的Unicode码,通过查找Unicode码表我们就可以得知多出的字节储存的内容,而无需考虑存储的内容是否是可见的或可打印的。

PS:Unicode的0~127编码方法与传统的ASCII码相同

通过上述方法我们可以看到末尾的两个字节是13 10,由于手头没有Unicode码表,我就找了一个ASCII码表,得知这两个字节是回车符和换行符。

回车符是我们在输入结束确认时输入的,而换行符应该是与回车符连带产生的,具体原因应该参考MS-DOS (WINDOWS Platform)和JVM (WINDOWS Platform)相关文档。

相关代码:

/**
 *Name:TestRead.java
 
*@author   Richard
 
*@date     29/04/2006
 
*@version  1.0.0.0
 */
 
 import java.io.*;
 
 public class TestRead{
  
     public static void main(String args[]) throws IOException{
   
         byte test[] = new byte[512];
   
         int len = System.in.read(test);
   
         System.out.println("Len: " +len);
   
         System.out.println("byte");
         for(int i=0; i<10; i++)
             System.out.print("*" +(byte)test[i]);
         System.out.println();
   
         System.out.println("char");
         for(int i=0; i<10; i++)
             System.out.print("*" +(char)test[i]);
         System.out.println();
   
         System.out.println("int");
         for(int i=0; i<10; i++)
             System.out.print("*" +(int)test[i]);
         System.out.println();
     }
 }

以下是对给定代码的详细解析: ```java import java.io.IOException; public class ReverseInput { public static void main(String[] args) throws IOException { // 获取标准输入流中可读取的字节数 int length = System.in.available(); // 检查可读取的字节数是否大于 2 if (length > 2) { // 创建一个字节数组,长度为可读取字节数减 1 byte[] bts = new byte[length - 1]; // 从标准输入流中读取字节到字节数组 bts 中,并返回实际读取的字节数 int flag = System.in.read(bts); // 检查是否成功读取到数据(flag 不等于 -1 表示成功读取) if (flag != -1) { // 创建一个新的字节数组 tmp,用于存储反转后的字节 byte[] tmp = new byte[bts.length]; // 反转字节数组 bts 中的元素,并存储到 tmp 中 for (int i = 0; i < tmp.length; i++) { tmp[i] = bts[tmp.length - i - 1]; } // 将反转后的字节数组转换为字符串并输出 System.out.println(new String(tmp)); } } } } ``` ### 代码详细解释: 1. **导入必要的包**: ```java import java.io.IOException; ``` 导入 `java.io.IOException` 包,因为在使用标准输入流 `System.in` 进行输入操作时,可能会抛出 `IOException` 异常。 2. **`main` 方法**: ```java public static void main(String[] args) throws IOException { ``` `main` 方法是 Java 程序的入口点。`throws IOException` 表示该方法可能会抛出 `IOException` 异常,将异常抛出给调用者处理。 3. **获取标准输入流中可读取的字节数**: ```java int length = System.in.available(); ``` `System.in` 是 Java 中的标准输入流,`available()` 方法返回当前输入流中可读取的字节数。 4. **检查可读取的字节数是否大于 2**: ```java if (length > 2) { ``` 如果可读取的字节数大于 2,则继续执行后续操作。 5. **创建字节数组并读取数据**: ```java byte[] bts = new byte[length - 1]; int flag = System.in.read(bts); ``` 创建一个长度为 `length - 1` 的字节数组 `bts`,并使用 `System.in.read(bts)` 方法从标准输入流中读取字节到 `bts` 数组中。`read` 方法返回实际读取的字节数,如果返回 -1 表示已经到达输入流的末尾。 6. **检查是否成功读取到数据**: ```java if (flag != -1) { ``` 如果 `flag` 不等于 -1,则表示成功读取到数据,继续执行后续操作。 7. **反转字节数组**: ```java byte[] tmp = new byte[bts.length]; for (int i = 0; i < tmp.length; i++) { tmp[i] = bts[tmp.length - i - 1]; } ``` 创建一个新的字节数组 `tmp`,并将 `bts` 数组中的元素反转后存储到 `tmp` 数组中。 8. **将反转后的字节数组转换为字符串并输出**: ```java System.out.println(new String(tmp)); ``` 使用 `new String(tmp)` 将反转后的字节数组 `tmp` 转换为字符串,并使用 `System.out.println()` 方法输出该字符串。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值