2012-04-28 63 views
3

有沒有人有不同平臺上文件IO差異的經驗?我寫了一個LWJGL程序,可以傳輸100多MB的TIFF文件。數據流在幾臺Mac和Linux計算機上相當快地發生,但在我的64位Windows 7桌面上,似乎要花幾秒鐘才能加載地圖的每個圖塊。Java在Windows上非常緩慢地讀取文件

基本上,我創建了一個Tile類實例的二維數組。每個圖塊都是TIFF文件的512x512 MB區域,並且render方法將檢查內存中的圖塊區域是否已加載,如果沒有,加載會在ThreadPoolExecutor中排隊,如果已排隊,則什麼都不會發生,如果加載它畫。對TIFF的訪問由TIFF類處理,該類使用RandomAccessFile實例讀取文件。這是我用來從TIFF中讀瓷磚的功能

public BufferedImage getRasterTile(Rectangle area) { 
    BufferedImage image = new BufferedImage(area.width, area.height, 
      BufferedImage.TYPE_INT_RGB); 
    try { 
     long[] bytesPerSample = new long[bitsPerSample.length]; 
     for (int i = 0; i < bytesPerSample.length; i++) { 
      bytesPerSample[i] += bitsPerSample[i]/8 + bitsPerSample[i] 
        % 8 == 0 ? 0 : 1; 
     } 
     long bytesPerPixel = 0; 
     for (long bits : bitsPerSample) { 
      bytesPerPixel += bits/8 + bits % 8 == 0 ? 0 : 1; 
     } 
     long bytesPerRow = bytesPerPixel * imageWidth; 
     int strip, color; 
     byte red, green, blue; 
     for (int i = area.x; i < area.x + area.width; i++) { 
      for (int u = area.y; u < area.y + area.height; u++) { 
       if (i > 0 && u > 0 && i < imageWidth && u < imageLength) { 
        switch (planarConfiguration) { 
        case Chunky: 
         strip = (int) (u/rowsPerStrip); 
         seek(stripOffsets[strip] 
           + (u - strip * rowsPerStrip) 
           * bytesPerRow + i * bytesPerPixel); 
         red = readByte(); 
         green = readByte(); 
         blue = readByte(); 

         color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8 
           | (blue & 0x0ff); 
         image.setRGB(i - area.x, u - area.y, color); 
         break; 
        case Planar: 
         strip = (u/(int) rowsPerStrip); 
         seek(stripOffsets[strip] + i); 
         red = readByte(); 
         seek(stripOffsets[strip + (int) imageLength] + i); 
         green = readByte(); 
         seek(stripOffsets[strip + 2 * (int) imageLength] 
           + i); 
         blue = readByte(); 
         color = (red & 0x0ff) << 16 | (green & 0x0ff) << 8 
           | (blue & 0x0ff); 
         image.setRGB(i - area.x, u - area.y, color); 
         break; 
        } 
       } else { 
        image.setRGB(i - area.x, u - area.y, 0); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return image; 
} 
+0

我很困惑,你是說閱讀很慢(在這種情況下,你能告訴我們你是如何閱讀數據的),或者轉換很慢。 – 2012-04-28 16:02:26

回答

0

我懷疑這是與您閱讀文件的方式有關。我注意到您一再調用名爲readByte()seek的方法。如果這些方法在非緩衝流(或實例)上進行調用,那麼您可能會進行大量的系統調用,這會讓您的方法非常緩慢。

如果這是原因,那麼您應該將整個圖像文件讀入byte[],並使用數組索引來找出需要的字節。如果圖像文件太大,那麼您需要重構代碼以減少查找次數並一次讀取多個字節。