A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-8-1 19:59  /  1863 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩伟 于 2012-8-1 20:02 编辑

我在做管道输入练习时发现一个这样的问题,请大家来指点一下:
  1. import java.io.*;

  2. class PipedOutputStreamDemo
  3. {
  4.         public static void main(String []args) throws IOException
  5.         {
  6.                 PipedInputStream in = new PipedInputStream();
  7.                 PipedOutputStream out = new PipedOutputStream();
  8.                 in.connect(out);
  9.                 Read r = new Read(in);
  10.                 Write w = new Write(out);
  11.                 Thread p1 = new Thread(r);
  12.                 Thread p2 = new Thread(w);
  13.                 p1.start();
  14.                 p2.start();
  15.         }
  16. }

  17. class Read implements Runnable
  18. {
  19.         private PipedInputStream in = new PipedInputStream();
  20.         
  21.         public void run()
  22.         {
  23.                 try
  24.                 {
  25.                         byte [] buf = new byte[1024];                             <font color="red"> //这里如果是Byte [] buf = new Byte[1024]时,
  26.                                                                                                  // String s = new String(buf,0,len);这句话就回出错,
  27.                                                                                                  //这是为什么呢,难道他们不一样吗?</font>
  28.           int len = in.read(buf);                              <font color="red"> //还有一点儿就是好像并不存在read(byte[]b)这个方法,
  29.                                                                          //又没有说明<strong>read</strong>(byte[] b, int off,  int len)
  30.                                                                          //方法的后面两个参数可以缺省,为什么可以这样用呢?</font>
  31.           String s = new String(buf,0,len);
  32.                         System.out.println(s);
  33.                         in.close();
  34.                 }
  35.                 catch(IOException e)
  36.                 {
  37.                         throw new RuntimeException("Read Error!");
  38.                 }
  39.         }
  40.         
  41.          Read(PipedInputStream in)
  42.         {
  43.                 this.in = in;
  44.         }
  45. }

  46. class Write implements Runnable
  47. {
  48.         private PipedOutputStream out = new PipedOutputStream();
  49.         
  50.         Write(PipedOutputStream out)
  51.         {
  52.                 this.out = out;
  53.         }
  54.         public void run()
  55.         {
  56.                 try
  57.                 {
  58.                         out.write("piped come on!".getBytes());
  59.                         out.close();
  60.                 }
  61.                 catch(IOException e)
  62.                 {
  63.                         throw new RuntimeException ("Write Error!");
  64.                 }
  65.         }
  66. }
复制代码

4 个回复

倒序浏览
为什么我提问的那两句话没有变红呢?
回复 使用道具 举报
Byte [] buf = new Byte[1024],没有这样的的
byte [] buf = new byte[1024];       

一个字符包装类,一个是基本数据类型

第二个问题是,如果没指定偏移量,默认是数组全部、
回复 使用道具 举报
一个一个回答
这里如果是Byte [] buf = new Byte[1024]时, String s = new String(buf,0,len);这句话就回出错,
Byte是byte的包装类型。相当于Integer与int的区别,看过有人这样创建int数组吗  Integer[] ins= new Integer[3];
String类有String(byte[] bytes, int offset, int length)这个构造方法,没有String(Byte[] bytes, int offset, int length)这样这样的构造方法
还有一点儿就是好像并不存在read(byte[]b)这个方法。
PipedInputStream从其父类InputStream中继承了read(byte[]b)这个方法。返回的实际读取的字节数。比如读了1024个字节数,则返回去1024。没读满只读了70个字节数的话就返回70.
还有没有变红是因为代码错误。。。
回复 使用道具 举报
明白了,谢谢{:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马