黑马程序员技术交流社区

标题: InputStream read( )的疑惑。 [打印本页]

作者: skill20    时间: 2014-5-12 19:14
标题: InputStream read( )的疑惑。
InputStream ips = System.in;当键盘录入数字6,这个是怎么读的?6是4个字节么?
int len = ips.read();
System.out.println(len);




作者: 张鹏宇    时间: 2014-5-12 19:58
当然是4个字节
作者: skill20    时间: 2014-5-12 20:04
张鹏宇 发表于 2014-5-12 19:58
当然是4个字节

是4个字节的话,我读一个字节是不是 8个0啊。疑惑~~
作者: Jero    时间: 2014-5-12 20:18
你打印出来的len是8个字节么?还是什么呢?
作者: 小周务商    时间: 2014-5-12 20:26
只读取一个字节。
作者: skill20    时间: 2014-5-12 20:31
Jero 发表于 2014-5-12 20:18
你打印出来的len是8个字节么?还是什么呢?

键盘输入 6 的话,打印出来的是54.这个是咋取的?
作者: skill20    时间: 2014-5-12 20:33
小周务商 发表于 2014-5-12 20:26
只读取一个字节。

键盘输入 6 的话,打印出来的是54.这个是咋取的?
作者: Jero    时间: 2014-5-12 20:34
你这个方法略奇怪啊 System.in 能用流接收么?
作者: skill20    时间: 2014-5-12 21:10
Jero 发表于 2014-5-12 20:34
你这个方法略奇怪啊 System.in 能用流接收么?

可以的,输入流嘛,我现在知道问题在哪了,键盘录入的是字符串。
作者: Jero    时间: 2014-5-13 01:25
skill20 发表于 2014-5-12 21:10
可以的,输入流嘛,我现在知道问题在哪了,键盘录入的是字符串。

- -  解决了就好了哦。
作者: 张鹏宇    时间: 2014-5-16 15:42
skill20 发表于 2014-5-12 20:04
是4个字节的话,我读一个字节是不是 8个0啊。疑惑~~

放在低位呗
作者: 墨香    时间: 2014-5-17 23:13
本帖最后由 墨香 于 2014-5-17 23:16 编辑

其实可以这样来分析:  InputStream 此抽象类是表示字节输入流的所有类的超类。         
我们从输入流中读取数据最常用的方法基本上就是如下 3 个 read() 方法了:      
  1 、 read () 方法,这个方法 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1 。         
2 、 read (byte[] b,int off,int len) 方法, 将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。        
3 、 read (byte[] b) 方法, 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。         第一个方法典型的确定就是处理效率低,不是某些特殊情况,很少使用它,下面说说第 2 个方法跟第 3 个方法,第 3 个方法的本本质其实就是第 2 个方法的特殊情况, 效果等同于:         
read(b, 0, b.length)所以这里把他们放着一起讨论。         从第 2 个方法的 API 文档说明来看:“ 将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。”,最多读取 len 个字节,这究竟是何意? API 文档并没有详细说明。是不是就意味着有可能(注意这里是有可能而不是一定,)读取不到 len 个字节呢?答案是“是的”。虽然造成这种情况的原因是什么个人并不知道,但是我们可以通过例子来发现这种情况,下面是源代码(由于只是简单的示例,所以代码也就随便写了):

  1. package myspider;

  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. public class MyServerSocket {

  9.     public static void main(String[] args) throws IOException {
  10.         ServerSocket ss = new ServerSocket(8888);
  11.         System.out.println("runing");
  12.         while (true) {
  13.             byte[] b = new byte[22480];
  14.             int readBytes = 0;
  15.             Socket s = ss.accept();
  16.             InputStream is = s.getInputStream();
  17.             while (readBytes < 22480) {
  18.                 int read = is.read(b, readBytes, 22480 - readBytes);
  19.                 System.out.println(read);
  20.                 if (read == -1) {
  21.                     break;
  22.                 }
  23.                 readBytes += read;
  24.             }
  25.             File f = new File("F:\\project\\bocln_nacec\\xml\\ey.xml");
  26.             if (!f.exists()) {
  27.                 f.createNewFile();
  28.                 System.out.println("creat " + f.toString());
  29.             }
  30.             FileOutputStream fos = new FileOutputStream(f);
  31.             fos.write(b, 0, readBytes);
  32.             fos.flush();
  33.             fos.close();
  34.             System.out.println("complete");
  35.             is.close();
  36.             s.close();
  37.         }
  38.     }
  39. }
复制代码
  1. package myspider;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;

  9. /**
  10. *
  11. * @author mark
  12. */
  13. public class MySocket {

  14.     public static void main(String[] args) throws UnknownHostException, IOException {
  15.         Socket s = new Socket("127.0.0.1", 8888);
  16.         OutputStream os = s.getOutputStream();
  17.         File f = new File("F:\\project\\bocln_nacec\\xml\\ye.xml");
  18.         InputStream is = new FileInputStream(f);
  19.         byte[] b = new byte[22480];
  20.         int i = is.read(b);
  21.         is.close();
  22.         os.write(b, 0, i);
  23.         os.flush();
  24.         os.close();
  25.         s.close();
  26.     }
  27. }
复制代码
希望能帮到你!!!







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2