Check file size on tar input path and use stream copying instead of buffering fully

This commit is contained in:
Winston Li 2017-08-02 21:40:00 +01:00
parent 045eea8282
commit f9307c7110

View file

@ -100,11 +100,7 @@ public class Tar {
continue;
}
long size = e.getSize();
Preconditions.checkArgument(
size >= 0 && size <= Integer.MAX_VALUE,
"file too big (" + size + " B): " +
"tarTo should have thrown an IOException"
);
checkFileSize(size);
try (OutputStream out = new FileOutputStream(f)) {
/* TarInputStream pretends each
entry's EOF is the stream's EOF */
@ -113,6 +109,14 @@ public class Tar {
}
}
private static void checkFileSize(long size) {
Preconditions.checkArgument(
size >= 0 && size <= Integer.MAX_VALUE,
"file too big (" + size + " B): " +
"tarTo should have thrown an IOException"
);
}
private static void addTarEntry(
TarArchiveOutputStream tout,
Path base,
@ -151,13 +155,19 @@ public class Tar {
Path base,
File file
) throws IOException {
Preconditions.checkArgument(file.isFile());
Preconditions.checkArgument(
file.isFile(),
"given file" +
" is not file: %s", file);
checkFileSize(file.length());
String name = base.relativize(
Paths.get(file.getAbsolutePath())
).toString();
ArchiveEntry entry = tout.createArchiveEntry(file, name);
tout.putArchiveEntry(entry);
tout.write(FileUtils.readFileToByteArray(file));
try (InputStream in = new FileInputStream(file)) {
IOUtils.copy(in, tout);
}
tout.closeArchiveEntry();
}