/** * Creates a {@code FileBasedReader} to read a single file. * * <p>Uses the delegate source to create a single file reader for the delegate source. Utilizes * the default decompression channel factory to not wrap the source reader if the file name does * not represent a compressed file allowing for splitting of the source. */ @Override protected final FileBasedReader<T> createSingleFileReader(PipelineOptions options) { if (isSplittable()) { return sourceDelegate.createSingleFileReader(options); } return new CompressedReader<>(this, sourceDelegate.createSingleFileReader(options)); }
@Override public final BoundedReader<T> createReader(PipelineOptions options) throws IOException { // Validate the current source prior to creating a reader for it. this.validate(); String fileOrPattern = fileOrPatternSpec.get(); if (mode == Mode.FILEPATTERN) { long startTime = System.currentTimeMillis(); List<Metadata> fileMetadata = FileSystems.match(fileOrPattern, emptyMatchTreatment).metadata(); LOG.info("Matched {} files for pattern {}", fileMetadata.size(), fileOrPattern); List<FileBasedReader<T>> fileReaders = new ArrayList<>(); for (Metadata metadata : fileMetadata) { long endOffset = metadata.sizeBytes(); fileReaders.add( createForSubrangeOfFile(metadata, 0, endOffset).createSingleFileReader(options)); } LOG.debug( "Creating a reader for file pattern {} took {} ms", fileOrPattern, System.currentTimeMillis() - startTime); if (fileReaders.size() == 1) { return fileReaders.get(0); } return new FilePatternReader(this, fileReaders); } else { return createSingleFileReader(options); } }