每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
          最近關(guān)心的內(nèi)容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks
          key words : POI java讀取Excel? java.io.IOException Unable to read entire block

          版本:2.5.1final
          錯誤提示:
          java.io.IOException Unable to read entire block

          出這個問題具有隨機(jī)性,有時候沒問題,有時候?qū)xcel里的CellType改一下好像就沒問題,但也不總是這樣,真是莫名其妙.

          Google了一下是一個bug,重新下載src文件,將RawDataBlock.java文件的RawDataBlock(final InputStream stream)constructor覆蓋:

          public?RawDataBlock(final?InputStream?stream)?throws?IOException
          ????{
          ????????_data?
          =?new?byte[?POIFSConstants.BIG_BLOCK_SIZE?];
          ????????
          int?count?=?0;
          ????????
          int?totalBytesRead?=?0;
          ????????
          while?((totalBytesRead?<?POIFSConstants.BIG_BLOCK_SIZE)?&&
          (count?
          !=?-1))?{
          ????????????????count?
          =?stream.read(_data,?totalBytesRead,
          POIFSConstants.BIG_BLOCK_SIZE?
          -?totalBytesRead);
          ????????????????
          if?(count?!=?-1)?{
          ????????????????????????totalBytesRead?
          +=?count;
          ????????????????}
          ????????}
          ??????????
          if?(count?==?-1)?{
          ????????????????_eof?
          =?true;
          ??????????}?
          else?{
          ????????????_eof?
          =?false;
          ????????}?
          ??????????
          if?((totalBytesRead?!=?POIFSConstants.BIG_BLOCK_SIZE)?&&?(totalBytesRead?!=?0))?{
          ????????????String?type?
          =?"?byte"?+?((totalBytesRead?==?1)???(""):?("s"));
          ????????????
          throw?new?IOException("Unable?to?read?entire?block;?"?+
          totalBytesRead?
          +?type?+?"?read;?expected?"?+?POIFSConstants.BIG_BLOCK_SIZE?+?"bytes");
          ????????}
          ????}


          打包:
          ant?jar

          重啟app,OK!

          說明:
          主要問題出在 InputStream的read上,原來的實現(xiàn)用ReadFully方法:
          public?static?int?readFully(InputStream?in,?byte[]?b,?int?off,?int?len)
          ????
          throws?IOException
          ????{
          ????????
          int?total?=?0;
          ????????
          for?(;;)?{
          ????????????
          int?got?=?in.read(b,?off?+?total,?len?-?total);
          ????????????
          if?(got?<?0)?{
          ????????????????
          return?(total?==?0)???-1?:?total;
          ????????????}?
          else?{
          ????????????????total?
          +=?got;
          ????????????????
          if?(total?==?len)
          ????????????????????
          return?total;
          ????????????}
          ????????}
          ????}

          InputStream的read不能確保返回的是最大字節(jié)數(shù),但是另一個實現(xiàn)卻可以:
          ByteInputStream
          所以,下面的方法也可以修改這個問題:
          ?//?read?entire?stream?into?byte?array:
          ????ByteArrayOutputStream?byteOS?=?new?ByteArrayOutputStream();
          ????
          byte[]?buffer?=?new?byte[1024];
          ????
          int?count;
          ????
          while?(count?=?inputStream.read(buffer))?!=?-1)
          ????????byteOS.append(buffer,?
          0,?count);
          ????byteOS.close();
          ????
          byte[]?allBytes?=?byteOS.betByteArray();

          //?create?workbook?from?array:
          InputStream?byteIS?=?new?ByteArrayInputStream(allBytes);
          HSSFWorkbook?wb?
          =?new?HSSFWorkbook(byteIS);

          posted on 2006-08-10 17:09 Alex 閱讀(3596) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: POI的一個bug問題 2006-10-30 09:09 yye
          我照著你的方法修改了以后,還是出現(xiàn)同樣的錯誤,而且,修改poi源碼那個,使用新的jar包后,連原來可以導(dǎo)入成功的文件也出現(xiàn)了同樣的錯誤。。。。能幫忙解決一下嗎?  回復(fù)  更多評論
            

          主站蜘蛛池模板: 平遥县| 武强县| 额尔古纳市| 囊谦县| 来安县| 东兴市| 淳化县| 嘉义市| 哈尔滨市| 大邑县| 玛纳斯县| 黑龙江省| 江门市| 宜阳县| 丁青县| 凤冈县| 株洲县| 大余县| 东港市| 滕州市| 扎鲁特旗| 宕昌县| 汉川市| 新闻| 浦县| 观塘区| 九寨沟县| 福州市| 呼图壁县| 兴文县| 凤城市| 惠州市| 都安| 福安市| 潼关县| 称多县| 赤城县| 遂昌县| 奉新县| 开化县| 宁德市|