Как прочитать ZIP-файл через getResourceAsStream с относительным путем? - PullRequest
0 голосов
/ 20 ноября 2018

Я использовал этот метод для чтения текстовых файлов в каталоге ресурсов / каталога моего maven, чтобы я мог использовать относительный путь:

public static BufferedReader fileReaderAsResource(String filePath) throws IOException {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
        if (is == null) {
            throw new FileNotFoundException(" Not found: " + filePath);
        }
        return new BufferedReader(new InputStreamReader(is, DEFAULT_ENCODING));
    }

Теперь мне нужно прочитать zip-файл из-за его размера, и я все еще хочу использовать относительный путь к файлу в моей папке «resources». Есть ли способ сделать это?

У меня есть этот метод для чтения zip-файла, но он читает только в файле по абсолютному пути:

public static BufferedReader fileZipReader(String fileName) throws IOException, URISyntaxException {
        URL zipUrl = IOUtils.class.getClassLoader().getResource(fileName);
        File zipFile = new File(zipUrl.toURI());
        ZipFile zip = new ZipFile(zipFile);
        for (Enumeration e = zip.entries(); e.hasMoreElements(); ) {
            ZipEntry zipEntry = (ZipEntry) e.nextElement();
            if (!zipEntry.isDirectory()) {
                return new BufferedReader(new InputStreamReader(zip.getInputStream(zipEntry)));
            }
        }
        throw new FileNotFoundException("File not found: " + fileName);
    }

Как прочитать zip-файл по относительному пути к каталогу ресурсов / каталога моего стандартного maven?

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете обернуть InputStream в ZipInputStream, то есть:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
if (is == null) {
    throw new FileNotFoundException(" Not found: " + filePath);
}
ZipInputStream zis = new ZipInputStream(is);

EDIT:

Используйте метод, названный выше как fileReaderZipAsResource, я обычно читаю файл:

try {
            BufferedReader br = fileReaderZipAsResource(qaFilePath);
            String line;
            while ((line = br.readLine()) != null) {
                if (line.isEmpty()) {
                    throw new RuntimeException("Invalid entry ... 2");
                }
                line = line.trim();
                textKGKB.add(line);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

Но отладка показывает, что программа не входит в цикл. Он просто проходит по циклу и продолжает логику, не вызывая исключения. Мой текстовый файл представляет собой текстовый файл с 4 столбцами, разделенный клавишей табуляции. Я просто заархивирую его и назову xyy.zip, и передам его в качестве параметра вышеописанному методу.

В чем проблема? Действительно ли работает упаковка ZipInputStream?

...