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