@Test public void testLineReaderPosition() throws IOException { final File multiBlockFile = File.createTempFile("BlockCompressedAsciiLineReaderTest", ".gz"); multiBlockFile.deleteOnExit(); // write a file that has more than a single compressed block final long expectedFinalLineOffset = populateMultiBlockCompressedFile(multiBlockFile); try (final BlockCompressedInputStream bcis = new BlockCompressedInputStream(multiBlockFile); final BlockCompressedAsciiLineReader asciiLineReader = new BlockCompressedAsciiLineReader(bcis)) { String line = null; long actualFinalLineOffset = -1; do { actualFinalLineOffset = asciiLineReader.getPosition(); line = asciiLineReader.readLine(); } while (line != null && !line.equals(sentinelLine)); // test that we read the sentinel line; its at the expected offset, and that offset // represents a virtual file pointer Assert.assertNotNull(line); Assert.assertEquals(line, sentinelLine); Assert.assertEquals(expectedFinalLineOffset, actualFinalLineOffset); Assert.assertTrue(BlockCompressedFilePointerUtil.getBlockAddress(actualFinalLineOffset) != 0); } }
@Test(expectedExceptions = UnsupportedOperationException.class) public void testRejectPositionalInputStream() throws IOException { final File multiBlockFile = File.createTempFile("BlockCompressedAsciiLineReaderTest", ".gz"); multiBlockFile.deleteOnExit(); populateMultiBlockCompressedFile(multiBlockFile); try (final BlockCompressedInputStream bcis = new BlockCompressedInputStream(multiBlockFile); final BlockCompressedAsciiLineReader asciiLineReader = new BlockCompressedAsciiLineReader(bcis)) { asciiLineReader.readLine(new PositionalBufferedStream(new ByteArrayInputStream(new byte[1100]))); } }
/** * Create an AsciiLineReader of the appropriate type for a given InputStream. * @param inputStream An InputStream-derived class that implements BlockCompressedInputStream or PositionalBufferedStream * @return AsciiLineReader that wraps inputStream */ public static AsciiLineReader from(final InputStream inputStream) { if (inputStream instanceof BlockCompressedInputStream) { // For block compressed inputs, we need to ensure that no buffering takes place above the input stream to // ensure that the correct (virtual file pointer) positions returned from this stream are preserved for // the indexer. We can't used AsciiLineReader in this case since it wraps the input stream with a // PositionalBufferedInputStream. return new BlockCompressedAsciiLineReader((BlockCompressedInputStream) inputStream); } else if (inputStream instanceof PositionalBufferedStream) { // if this is already a PositionalBufferedStream, don't let AsciiLineReader wrap it with another one... return new AsciiLineReader((PositionalBufferedStream)inputStream); } else { log.warn("Creating an indexable source for an AsciiFeatureCodec using a stream that is " + "neither a PositionalBufferedStream nor a BlockCompressedInputStream"); return new AsciiLineReader(new PositionalBufferedStream(inputStream)); // wrap the stream in a PositionalBufferedStream } }
/** * Create an AsciiLineReader of the appropriate type for a given InputStream. * @param inputStream An InputStream-derived class that implements BlockCompressedInputStream or PositionalBufferedStream * @return AsciiLineReader that wraps inputStream */ public static AsciiLineReader from(final InputStream inputStream) { if (inputStream instanceof BlockCompressedInputStream) { // For block compressed inputs, we need to ensure that no buffering takes place above the input stream to // ensure that the correct (virtual file pointer) positions returned from this stream are preserved for // the indexer. We can't used AsciiLineReader in this case since it wraps the input stream with a // PositionalBufferedInputStream. return new BlockCompressedAsciiLineReader((BlockCompressedInputStream) inputStream); } else if (inputStream instanceof PositionalBufferedStream) { // if this is already a PositionalBufferedStream, don't let AsciiLineReader wrap it with another one... return new AsciiLineReader((PositionalBufferedStream)inputStream); } else { log.warn("Creating an indexable source for an AsciiFeatureCodec using a stream that is " + "neither a PositionalBufferedStream nor a BlockCompressedInputStream"); return new AsciiLineReader(new PositionalBufferedStream(inputStream)); // wrap the stream in a PositionalBufferedStream } }