每日一得

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            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

          出這個問題具有隨機性,有時候沒問題,有時候將Excel里的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上,原來的實現用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不能確保返回的是最大字節數,但是另一個實現卻可以:
          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 閱讀(3591) 評論(1)  編輯  收藏 所屬分類: java

          評論

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

          主站蜘蛛池模板: 襄汾县| 桑植县| 大埔区| 玉田县| 通渭县| 凤凰县| 刚察县| 荥阳市| 饶河县| 揭东县| 连南| 遂昌县| 水城县| 手游| 莱州市| 株洲县| 洛川县| 东乡族自治县| 固始县| 商城县| 临沭县| 安丘市| 金山区| 永吉县| 安图县| 海淀区| 县级市| 灵山县| 庆元县| 托克托县| 鹿泉市| 平塘县| 丽水市| 克拉玛依市| 云龙县| 吉水县| 天等县| 石河子市| 孝昌县| 克拉玛依市| 宜春市|