Как использовать FileSystem.getPath () в качестве цели для (File-) Writer? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть приложение, которое выводит некоторые файлы.

В зависимости от конфигурации мне нужно поместить их либо в обычную папку, либо в zip-файл.

Я пытаюсь использовать FileSystem, чтобы отделить код, фактически записывающий от фактического типа назначения.

Моя проблема в том, что для Paths, созданного Zip- FileSystems, метод .tpFile() не поддерживается. Поэтому я не могу создать FileWriter, который я могу передать, например, JAXB.

public class FileSystemWriteTest {
    public static void main(String[] args) throws IOException {
        FileSystem localFileSystem = FileSystems.getDefault();
        File relativeZipPath = Paths.get("target", "testpath").toFile();
        relativeZipPath.mkdirs();
        URI relativeZipFilePath = Paths.get(relativeZipPath.toString(), "test.zip").toUri();

        URI zipUri = URI.create("jar:"
                + relativeZipFilePath);
        System.out.println(zipUri);
        Map<String, String> env = new HashMap<>();
        env.put("create", "true");
        try (FileSystem zipFile = FileSystems.newFileSystem(zipUri, env)) {
            for (FileSystem fs : Arrays.asList(localFileSystem, zipFile)) {
                Path file = fs.getPath("test.txt");
                System.out.println(file.toAbsolutePath());
/* line 31 */   try (FileWriter fileWriter = new FileWriter(file.toFile())) {
                    fileWriter.write("irgend ein Text zum test\nob das so auch geht");
                    fileWriter.flush();
                }
            }
        }

    }
}

бросает

jar:file:///D:/data/scm-workspace/anderes/Test/target/testpath/test.zip
D:\data\scm-workspace\anderes\Test\test.txt
/test.txt
Exception in thread "main" java.lang.UnsupportedOperationException
    at com.sun.nio.zipfs.ZipPath.toFile(ZipPath.java:597)
    at com.oc.test.filesystem.FileSystemWriteTest.main(FileSystemWriteTest.java:31)

То, что я пытаюсь сделать, - это записать вывод JaxB непосредственно на диск во время его записи, не сохраняя его в памяти до завершения JaxB. (Мои XML-файлы довольно большие, поэтому я могу столкнуться с OOME)

Мой вопрос:
Как я могу открыть подходящий Writer или OutputStream из FileSystem с архивом ZIP-файла?

С другой стороны
Какие еще есть у меня возможности скрыть реальную цель записи (папка с файлом ZIP) от JaxB?

1 Ответ

0 голосов
/ 03 сентября 2018

Как и большинство других операций с файловой системой, открытие OutputStream, Writer или Channel может быть выполнено с помощью класса утилит Files.

См., Например,

но обратите внимание также на методы более высокого уровня, такие как

Но учтите, что для потоковой передачи непосредственно в zip-файл использование ZipOutputStream поверх FileOutputStream может оказаться более эффективным, чем использование ZipFileSystem.

...