日期:2014-05-20  浏览次数:20628 次

一段很短的代码求解释

  public InputStream getIs(){
HSSFWorkbook wb=new HSSFWorkbook();
/***
 * 这里省去如创建工作薄
 * 获取需要数据等操作
 */

ByteArrayOutputStream os=new ByteArrayOutputStream();
wb.write(os);
byte[] b=os.toByteArray();
InputStream is=new ByteArrayInputStream(b);
return is;

}



对于输入输出不是很明白,什么时候该用输出什么时候该用输入呢?我理解的是相对于内存而言
但是上面这段代码是什么意思?
我创建好的数据本来就在内存中吧,所以
ByteArrayOutputStream os=new ByteArrayOutputStream();
wb.write(os);
这个是可以理解的。就是把数据从内存输出出去。
但是后面为什么又来一个输入流,都从内存输出出去了还输入干嘛?
return is 是返回给action,用户调用action来获取这个数据。这个过程不该是输出么,为什么还是一个输入流。难道用户调用action的方法获取数据时输入操作?那网页这些东西是在内存中么?可是为什么对网页内容用的输入流?
晕了啊 求大神给个规律啊 怎么来区分啊!


内存 Java 输入输出流

------解决方案--------------------
打个比方吧,流就好比一个管道,就好像水在水管里面流动一样,是一种传输途径。
现在你拥有一个工作簿对象,但是你要对它进行传输。那么,对于工作簿对象而言,它是一种输出(从它这里把数据传送出来当然是一种输出吧),于是调用它的write方法,并且给它接根“排水管”(输出流),让它把数据输出出来。
然后我们就拿个盆子(即字节数组b)在排水管下面接着,就得到了工作簿内容的字节数组形式了。
但是,我们的这个程序调用这个函数需要从中获得数据,既然是获得,当然应该有一个“进水管”(输入流)了,现在我们新建了一个进水管,从哪里获得数据呢?当然是从字节数组b了。
于是这个程序就这样了。

我并不清楚是否可以直接以输出流为参数创建输入流,应该是可以的吧…如果确实可以的话,就可以节省一个“盆子”(字节数组b)了。

以上是我个人的理解,如有谬误还望各位前辈指教
------解决方案--------------------
这段代码你那淘的!
目测用以是在内存中建一个Excel,然后返回给Action,估计是为了下载吧!
wb.write(os);这句应该是把数据保存在内存中
而后面那个输入流是从内存中读取数据
程序读数据就是输入流
程序写数据就是输出流
------解决方案--------------------
在内存操作流中所有的输入和输出都是以内存为操作的源头
ByteArrayOutputStream 是用于从内存向程序输出的
ByteArrayInputStream 是用于从程序向内存写入的
------解决方案--------------------
站在内存的角度想就好了
------解决方案--------------------
Output的流可以往里写
Input的流可以从里面读
你的场景显然是想往里写哈
------解决方案--------------------
输出输入相对程序而言,读写相对文件而言
------解决方案--------------------
按照内存角度来思考就行了。
------解决方案--------------------