Re: [问题] PipedInputStream 相关疑问

楼主: popcorny (毕业了..@@")   2014-04-24 09:14:52
※ 引述《willy69wu31 (小小吴)》之铭言:
: 标题: [问题] PipedInputStream 相关疑问
: 时间: Wed Apr 23 21:14:51 2014
: 初次发文在本板,请多指教
: ====以下前情提要====
: 先前我有一支 Java 程式可读类似 csv 格式的文字档,
: 以 FileInputStream 将读到的资料填入物件属性内,按规则统计后输出资料到另一档案。
: 接着因为资料提供者给的格式有变动,变成 Excel 格式,没办法直接读,
: 遂找 Apache POI API 来让 Java 可以读 Excel 档。
: 不过原本读文字档的方法不能直接套到 Excel 档上。
: 文字档是 InputStream 读好交给 Scanner,
: 再按字段格式决定用 nextInt()、next() 或 nextDouble(),
: 但是 Apache POI 的 API 长的跟 Scanner 根本不一样。
:
: 为了方便相容原本读 csv 的程式,就把 Excel 读来的资料转成 csv 格式,
: 这样就可以直接喂给原版的程式吃,
: 所以就用 PipedInputStream 和 PipedOutputStream,
: Excel 的资料 print 给 PipedOutputStream,
: 而文字档本来就是用 InputStream 读,用 PipedInputStream 接起来也很刚好。
:
: ====接下来是我的问题====
:
: 1. 这类管线型的输出入类别看起来很好用,可是我发现大多数 Java 专案好像没在用,
: 请问有人知道原因吗? 是因为知名度太低吗?
: 我写 Java 好多年了,看过设计模式的书,
: 曾经想像过应该要有个 OutputStream 可以转换成 InputStream 来用的方式,
: 但也是最近 Google 了才发现这些管线型类别。
:
pipe的概念在linux的shell上面大量的被使用
process1 | process2 | process3
实作上就是用system call pipe() 并且fork到前后的process
而因为java大部份都是单一process
所以通常的应用是把thread1的output当作thread2的input
pipe是拿来当做类似queue的方式使用..
或是说producer/consumer的方式使用
只是以inputstream/outputstraem
那为什么很少看到java去使用?
因为同个process
所以我们应该可以使用更high level的class去传递
例如BlockingQueue
同样也可以有同样的效果
: 2. 我 Google 一些范例,发现全都用 Thread 来处理这两个相连的管线物件,
: Oracle 的说明也说如果在同一个执行绪同时操作两个相连的管线物件,
: 可能导致死结,那...为什么会死结? 如果 PipedOutputStream 写一个字节,
: PipedInputStream 读一个字节,轮流下来的话理论上可以在同一个执行绪跑完吧?
:
因为pipe有buffer size(pipe size)
producer如果写到满的时候会block
consumer如果拉倒空的时候也会block
若是同一个人去读或写
那就会卡死没人叫醒
: 3. 用 PipedInputStream 和 PipedOutputStream 会不会造成效能问题?
: 或任何其他的问题? 有人有相关的经验吗?
:
不会.. pipe是很好的东西。因为他的资料都在memeory,所以应该很快..
还有你的应用我会选择用temp file
因为档案一大,用pipe就gg了..

Links booklink

Contact Us: admin [ a t ] ucptt.com