Re: [問題] PipedInputStream 相關疑問

看板java作者 (畢業了..@@")時間10年前 (2014/04/24 09:14), 10年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/7 (看更多)
※ 引述《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了.. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.46.230 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1398302095.A.074.html ※ 編輯: popcorny (118.163.46.230), 04/24/2014 09:22:24
文章代碼(AID): #1JM6MF1q (java)
討論串 (同標題文章)
文章代碼(AID): #1JM6MF1q (java)