]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Read ZIP entries in chunks
authorFrédéric Perrin <frederic.perrin@att.com>
Thu, 30 Jan 2020 10:40:32 +0000 (10:40 +0000)
committerFrédéric Perrin <frederic.perrin@att.com>
Thu, 30 Jan 2020 14:09:36 +0000 (14:09 +0000)
Cuts reading a tile from several seconds to pretty much instantaneous.
Particularily noticable with 1-arcsecond datafiles

src/tim/prune/function/srtm/SrtmSource.java

index 0791cd833c28fc7a2acd14cb4901a1a675d3cae2..44ceccfab52a13a5ced20108ad539cafbf2c6fb2 100644 (file)
@@ -19,11 +19,19 @@ public abstract class SrtmSource {
                throws IOException
        {
                int[] heights = new int[tileSize];
+               int dataSize = 2 * tileSize;
+               byte[] buffer = new byte[dataSize];
                // Read entire file contents into one byte array
-               for (int i = 0; i < heights.length; i++)
+               int alreadyRead = 0;
+               while (alreadyRead < dataSize)
                {
-                       heights[i] = inStream.read() * 256 + inStream.read();
-                       if (heights[i] >= 32768) {heights[i] -= 65536;}
+                       alreadyRead += inStream.read(buffer, alreadyRead, dataSize - alreadyRead);
+               }
+               for (int i = 0; i < tileSize; i++)
+               {
+                       // Bytes are signed. Cast high-order to int with sign
+                       // extension, and clamp low-order to its unsigned range
+                       heights[i] = buffer[2 * i] * 256 + (0xff & buffer[2 * i + 1]);
                }
                // Close stream
                inStream.close();