[問題] PipedInputStream 相關疑問

作者: willy69wu31 (小小吳)   2014-04-23 21:14:51
初次發文在本板,請多指教
====以下前情提要====
先前我有一支 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 了才發現這些管線型類別。
2. 我 Google 一些範例,發現全都用 Thread 來處理這兩個相連的管線物件,
Oracle 的說明也說如果在同一個執行緒同時操作兩個相連的管線物件,
可能導致死結,那...為什麼會死結? 如果 PipedOutputStream 寫一個位元組,
PipedInputStream 讀一個位元組,輪流下來的話理論上可以在同一個執行緒跑完吧?
3. 用 PipedInputStream 和 PipedOutputStream 會不會造成效能問題?
或任何其他的問題? 有人有相關的經驗嗎?
第一次發問就問這麼少見的東西,希望板友協助。

Links booklink

Contact Us: admin [ a t ] ucptt.com