code: public static <E extends Exception, E2 extends Exception> void parse(final List<File> files, final long lineOffset, final long count,
              final int processThreadNum, final int queueSize, final Try.Consumer<String, E> lineParser, final Try.Runnable<E2> onComplete)
              throws UncheckedIOException, E, E2 {
          if (N.isNullOrEmpty(files)) {
              return;
          }
  
          final List<Reader> readers = new ArrayList<>(files.size());
  
          try {
              for (final File subFile : files) {
                  if (subFile.isFile()) {
                      readers.add(newBufferedReader(subFile));
                  } else {
                      for (final File subSubFile : listFiles(subFile, true, true)) {
                          readers.add(newBufferedReader(subSubFile));
                      }
                  }
              }
  
              final List<Iterator<String>> iterators = new ArrayList<>(readers.size());
  
              for (Reader reader : readers) {
                  iterators.add(new LineIterator(reader));
              }
  
              Iterables.parse(iterators, lineOffset, count, 0, processThreadNum, queueSize, lineParser, onComplete);
          } finally {
              for (Reader reader : readers) {
                  closeQuietly(reader);
              }
          }
      }
docs: Parse the specified files/directory line by line.
  
  @param files parse all the sub files recursively if the element is a directory.
  @param lineOffset
  @param count
  @param processThreadNum thread number used to parse/process the lines/records
  @param queueSize size of queue to save the processing records/lines loaded from source data. Default size is 1024.
  @param lineParser