Changeset 2721


Ignore:
Timestamp:
05/02/07 10:05:46 (13 years ago)
Author:
melissa
Message:

Added support for reading gzip-compressed files.

Location:
trunk/loci/formats
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/FormatHandler.java

    r2695 r2721  
    123123    for (int i=0; i<suffixes.length; i++) { 
    124124      if (lname.endsWith("." + suffixes[i])) return true; 
     125      if (lname.endsWith("." + suffixes[i] + ".gz")) return true;  
     126      //if (lname.endsWith("." + suffixes[i] + ".bz2")) return true;  
    125127    } 
    126128    return false; 
  • trunk/loci/formats/RandomAccessStream.java

    r2673 r2721  
    2727import java.io.*; 
    2828import java.util.*; 
     29import java.util.zip.*; 
     30import loci.formats.in.CBZip2InputStream; 
    2931 
    3032/** 
     
    7072  protected DataInputStream dis; 
    7173 
     74  /** Length of the file. */ 
     75  protected long length; 
     76 
    7277  /** The file pointer within the DIS. */ 
    7378  protected long fp; 
     
    96101  /** Number of valid entries in the buffer size array. */ 
    97102  protected int lastValid = 0; 
     103 
     104  /** Flag indicating this file has been compressed. */ 
     105  protected boolean compressed = false; 
    98106 
    99107  // -- Constructors -- 
     
    108116    if (f.exists()) { 
    109117      raf = new RAFile(f, "r"); 
    110       dis = new DataInputStream(new BufferedInputStream( 
    111         new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD)); 
    112       long len = raf.length(); 
    113       buf = new byte[(int) (len < MAX_OVERHEAD ? len : MAX_OVERHEAD)]; 
    114       raf.readFully(buf); 
    115       raf.seek(0); 
    116       bufferSizes[0] = MAX_OVERHEAD / 2; 
    117       lastValid = 1; 
    118       nextMark = MAX_OVERHEAD; 
     118       
     119      BufferedInputStream bis = new BufferedInputStream( 
     120        new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD);  
     121      
     122      String path = f.getPath().toLowerCase(); 
     123 
     124      if (path.endsWith(".gz")) { 
     125        dis = new DataInputStream(new GZIPInputStream(bis)); 
     126        compressed = true; 
     127      
     128        length = 0; 
     129 
     130        while (dis.available() != 0) { 
     131          length += dis.skipBytes(1024); 
     132        } 
     133 
     134        bis = new BufferedInputStream( 
     135          new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD);  
     136        dis = new DataInputStream(new GZIPInputStream(bis)); 
     137      } 
     138      /* 
     139      else if (path.endsWith(".bz2")) { 
     140        dis = new DataInputStream(new CBZip2InputStream(bis)); 
     141        compressed = true; 
     142      
     143        length = 0; 
     144 
     145        while (dis.available() != 0) { 
     146          length += dis.skipBytes(1024); 
     147        } 
     148 
     149        bis = new BufferedInputStream( 
     150          new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD);  
     151        dis = new DataInputStream(new CBZip2InputStream(bis)); 
     152      } 
     153      */  
     154      else dis = new DataInputStream(bis); 
     155       
     156      if (!compressed) { 
     157        length = raf.length(); 
     158        buf = new byte[(int) (length < MAX_OVERHEAD ? length : MAX_OVERHEAD)]; 
     159        raf.readFully(buf); 
     160        raf.seek(0); 
     161        bufferSizes[0] = MAX_OVERHEAD / 2; 
     162        lastValid = 1; 
     163        nextMark = MAX_OVERHEAD; 
     164      }  
    119165    } 
    120166    else if (file.startsWith("http")) { 
     
    137183    fp = 0; 
    138184    afp = 0; 
     185    length = raf.length();  
    139186  } 
    140187 
     
    171218  public long length() throws IOException { 
    172219    if (fileCache.get(this) == Boolean.FALSE) reopen(); 
    173     return raf.length(); 
     220    return length; 
    174221  } 
    175222 
     
    208255 
    209256    long oldAFP = afp; 
    210     if (afp < raf.length() - 1) afp++; 
     257    if (afp < length - 1) afp++; 
    211258 
    212259    if (status == DIS) { 
     
    291338    int n = 0; 
    292339 
    293     if (status == DIS) { n = dis.read(array); } 
     340    if (status == DIS) {  
     341      return read(array, 0, array.length); 
     342    } 
    294343    else if (status == ARRAY) { 
    295344      n = array.length; 
     
    320369 
    321370    if (status == DIS) { 
    322       n = dis.read(array, offset, n); 
     371      int p = dis.read(array, offset, n); 
     372      if (p == -1) return -1;  
     373      if ((p >= 0) && ((fp + p) < length)) {  
     374        int k = p;  
     375        while ((k >= 0) && (p < n) && ((afp + p) <= length) &&  
     376          ((offset + p) < array.length)) 
     377        { 
     378          k = dis.read(array, offset + p, n - p);  
     379          if (k >= 0) p += k;  
     380        } 
     381      } 
     382      n = p;  
    323383    } 
    324384    else if (status == ARRAY) { 
     
    346406 
    347407    if (status == DIS) { 
    348       dis.readFully(array, 0, array.length); 
     408      readFully(array, 0, array.length); 
    349409    } 
    350410    else if (status == ARRAY) { 
     
    392452    } 
    393453    catch (IOException e) { } 
    394     dis.mark(readLimit); 
    395   } 
    396  
    397   public boolean markSupported() { return true; } 
     454    if (!compressed) dis.mark(readLimit); 
     455  } 
     456 
     457  public boolean markSupported() { return !compressed; } 
    398458 
    399459  public void reset() throws IOException { 
     
    443503    int oldBufferSize = bufferSizes[bufferSizes.length - 1]; 
    444504 
     505    if (compressed) { 
     506      // can only read from the input stream 
     507 
     508      if (afp < fp) { 
     509        dis.close(); 
     510       
     511        BufferedInputStream bis = new BufferedInputStream( 
     512          new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD);  
     513     
     514        String path = Location.getMappedId(file).toLowerCase(); 
     515 
     516        if (path.endsWith(".gz")) { 
     517          dis = new DataInputStream(new GZIPInputStream(bis)); 
     518        } 
     519        /* 
     520        else if (path.endsWith(".bz2")) { 
     521          dis = new DataInputStream(new CBZip2InputStream(bis)); 
     522        } 
     523        */ 
     524        fp = 0;  
     525      } 
     526 
     527      while (fp < afp) { 
     528        fp += dis.skipBytes((int) (afp - fp)); 
     529      } 
     530       
     531      return DIS; 
     532    } 
     533 
    445534    if (dis != null) { 
    446535      while (fp > (length() - dis.available())) { 
     
    542631    if (f.exists()) { 
    543632      raf = new RAFile(f, "r"); 
    544       dis = new DataInputStream(new BufferedInputStream( 
    545         new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD)); 
    546       long len = raf.length(); 
    547       buf = new byte[(int) (len < MAX_OVERHEAD ? len : MAX_OVERHEAD)]; 
    548       raf.readFully(buf); 
    549       raf.seek(0); 
     633       
     634      BufferedInputStream bis = new BufferedInputStream( 
     635        new FileInputStream(Location.getMappedId(file)), MAX_OVERHEAD);  
     636      
     637      String path = f.getPath().toLowerCase(); 
     638 
     639      if (path.endsWith(".gz")) { 
     640        dis = new DataInputStream(new GZIPInputStream(bis)); 
     641        compressed = true; 
     642      } 
     643      /* 
     644      else if (path.endsWith(".bz2")) { 
     645        dis = new DataInputStream(new CBZip2InputStream(bis)); 
     646        compressed = true; 
     647      } 
     648      */ 
     649      else dis = new DataInputStream(bis); 
     650       
     651      if (!compressed) { 
     652        length = raf.length(); 
     653        buf = new byte[(int) (length < MAX_OVERHEAD ? length : MAX_OVERHEAD)]; 
     654        raf.readFully(buf); 
     655        raf.seek(0); 
     656      }  
    550657    } 
    551658    else { 
  • trunk/loci/formats/in/OMEXMLReader.java

    r2701 r2721  
    304304      File f = new File(Location.getMappedId(id)); 
    305305      f = f.getAbsoluteFile(); 
    306       if (f.exists()) { 
     306      String path = f.getPath().toLowerCase(); 
     307      if (f.exists() && path.endsWith(".ome")) { 
    307308        r.setVar("f", f); 
    308309        r.exec("ome = new OMENode(f)"); 
Note: See TracChangeset for help on using the changeset viewer.