This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
commit b43c74a3c36c4b1472936f4c6632d88c00153b91 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sun Aug 8 09:36:31 2021 -0400 Reimplement internals with NIO. --- .../io/output/DeferredFileOutputStream.java | 33 ++++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/apache/commons/io/output/DeferredFileOutputStream.java b/src/main/java/org/apache/commons/io/output/DeferredFileOutputStream.java index 990657f..143587a 100644 --- a/src/main/java/org/apache/commons/io/output/DeferredFileOutputStream.java +++ b/src/main/java/org/apache/commons/io/output/DeferredFileOutputStream.java @@ -21,9 +21,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.Path; +import java.util.function.Supplier; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; +import org.apache.commons.io.file.PathUtils; /** * An output stream which will retain data in memory until a specified threshold is reached, and only then commit it to @@ -50,7 +51,7 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { /** * The file to which output will be directed if the threshold is exceeded. */ - private File outputFile; + private Path outputPath; /** * The temporary file prefix. @@ -65,7 +66,7 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { /** * The directory to use for temporary files. */ - private final File directory; + private final Path directory; /** * True when close() has been called successfully. @@ -96,12 +97,12 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { * @param initialBufferSize The initial size of the in memory buffer. */ private DeferredFileOutputStream(final int threshold, final File outputFile, final String prefix, - final String suffix, final File directory, final int initialBufferSize) { + final String suffix, final File directory, final int initialBufferSize) { super(threshold); - this.outputFile = outputFile; + this.outputPath = toPath(outputFile, null); this.prefix = prefix; this.suffix = suffix; - this.directory = directory; + this.directory = toPath(directory, PathUtils::getTempDirectory); memoryOutputStream = new ByteArrayOutputStream(initialBufferSize); currentOutputStream = memoryOutputStream; @@ -200,7 +201,7 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { * @return The file for this output stream, or {@code null} if no such file exists. */ public File getFile() { - return outputFile; + return outputPath != null ? outputPath.toFile() : null; } /** @@ -235,10 +236,10 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { @Override protected void thresholdReached() throws IOException { if (prefix != null) { - outputFile = File.createTempFile(prefix, suffix, directory); + outputPath = Files.createTempFile(directory, prefix, suffix); } - FileUtils.forceMkdirParent(outputFile); - final OutputStream fos = Files.newOutputStream(outputFile.toPath()); + PathUtils.createParentDirectories(outputPath); + final OutputStream fos = Files.newOutputStream(outputPath); try { memoryOutputStream.writeTo(fos); } catch (final IOException e) { @@ -274,7 +275,11 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { if (isInMemory()) { return memoryOutputStream.toInputStream(); } - return Files.newInputStream(outputFile.toPath()); + return Files.newInputStream(outputPath); + } + + private Path toPath(final File file, final Supplier<Path> defaultPathSupplier) { + return file != null ? file.toPath() : defaultPathSupplier == null ? null : defaultPathSupplier.get(); } /** @@ -295,9 +300,7 @@ public class DeferredFileOutputStream extends ThresholdingOutputStream { if (isInMemory()) { memoryOutputStream.writeTo(outputStream); } else { - try (InputStream fis = Files.newInputStream(outputFile.toPath())) { - IOUtils.copy(fis, outputStream); - } + Files.copy(outputPath, outputStream); } } }