From 8cf29f50c4f7d935004193f3171df4c339c1c2cd Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 10 Feb 2021 17:23:02 +0100 Subject: [PATCH] [New] Added FileHelper.getTempFile() --- .../li/strolch/utils/helper/FileHelper.java | 63 ++++++++++++++++--- .../li/strolch/utils/helper/XmlHelper.java | 27 +------- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/helper/FileHelper.java b/li.strolch.utils/src/main/java/li/strolch/utils/helper/FileHelper.java index c1c89aa5d..4ded31b8e 100644 --- a/li.strolch.utils/src/main/java/li/strolch/utils/helper/FileHelper.java +++ b/li.strolch.utils/src/main/java/li/strolch/utils/helper/FileHelper.java @@ -15,11 +15,18 @@ */ package li.strolch.utils.helper; +import static li.strolch.utils.helper.StringHelper.isEmpty; +import static li.strolch.utils.helper.StringHelper.normalizeLength; + import java.io.*; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.security.MessageDigest; import java.text.MessageFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -38,6 +45,44 @@ public class FileHelper { private static final int MAX_FILE_SIZE = 50 * 1024 * 1024; private static final Logger logger = LoggerFactory.getLogger(FileHelper.class); + private static final DateTimeFormatter separatedDtf = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + private static final DateTimeFormatter nonSeparatedDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + /** + * Generates a path to the given temporary path to write a file separated in sub folders by day using current date + * + * @param tempPath + * the directory to which to write the file + * @param prefix + * the prefix of the file name + * @param separateHours + * true to have sub folders for each hour + * + * @return the temporary file + */ + public static File getTempFile(File tempPath, String prefix, String suffix, boolean separateDateSegments, + boolean separateHours) { + + LocalDateTime dateTime = LocalDateTime.now(); + LocalDate localDate = dateTime.toLocalDate(); + + String date = separateDateSegments ? localDate.format(separatedDtf) : localDate.format(nonSeparatedDtf); + + String currentHour = normalizeLength(String.valueOf(LocalTime.now().getHour()), 2, true, '0'); + String pathS = date + (separateHours ? "/" : "_") + currentHour; + + File path = new File(tempPath, pathS); + if (!path.exists() && !path.mkdirs()) + throw new IllegalStateException("Failed to create path " + path.getAbsolutePath()); + + prefix = (isEmpty(prefix) ? "" : prefix + "_"); + suffix = (isEmpty(suffix) ? "" : suffix); + if (!suffix.startsWith(".")) + suffix = "_" + suffix; + String fileName = prefix + System.currentTimeMillis() + suffix; + return new File(path, fileName); + } + /** * Reads the contents of a file into a byte array. * @@ -46,7 +91,7 @@ public class FileHelper { * * @return the contents of a file as a string */ - public static final byte[] readFile(File file) { + public static byte[] readFile(File file) { if (file.length() > MAX_FILE_SIZE) throw new RuntimeException( String.format("Only allowed to read files up to %s. File too large: %s", //$NON-NLS-1$ @@ -79,7 +124,7 @@ public class FileHelper { * * @return the contents of a file as a string */ - public static final String readFileToString(File file) { + public static String readFileToString(File file) { try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file));) { @@ -109,7 +154,7 @@ public class FileHelper { * * @return the contents of a file as a string */ - public static final String readStreamToString(InputStream stream) { + public static String readStreamToString(InputStream stream) { try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));) { @@ -136,7 +181,7 @@ public class FileHelper { * @param dstFile * the path to which to write the data */ - public static final void writeToFile(byte[] bytes, File dstFile) { + public static void writeToFile(byte[] bytes, File dstFile) { try (BufferedOutputStream out = new BufferedOutputStream(Files.newOutputStream(dstFile.toPath()))) { out.write(bytes); @@ -155,7 +200,7 @@ public class FileHelper { * @param dstFile * the file to write to */ - public static final void writeStringToFile(String string, File dstFile) { + public static void writeStringToFile(String string, File dstFile) { try (BufferedWriter bufferedwriter = new BufferedWriter(new FileWriter(dstFile));) { bufferedwriter.write(string); @@ -176,7 +221,7 @@ public class FileHelper { * * @return true if all went well, and false if it did not work. The log will contain the problems encountered */ - public final static boolean deleteFile(File file, boolean log) { + public static boolean deleteFile(File file, boolean log) { return FileHelper.deleteFiles(new File[] { file }, log); } @@ -241,7 +286,7 @@ public class FileHelper { * * @return true if and only if the copying succeeded; false otherwise */ - public final static boolean copy(File[] srcFiles, File dstDirectory, boolean checksum) { + public static boolean copy(File[] srcFiles, File dstDirectory, boolean checksum) { if (!dstDirectory.isDirectory() || !dstDirectory.canWrite()) { String msg = "Destination is not a directory or is not writeable: {0}"; //$NON-NLS-1$ @@ -282,7 +327,7 @@ public class FileHelper { * * @return true if and only if the renaming succeeded; false otherwise */ - public final static boolean copy(File fromFile, File toFile, boolean checksum) { + public static boolean copy(File fromFile, File toFile, boolean checksum) { try (BufferedInputStream inBuffer = new BufferedInputStream(Files.newInputStream(fromFile.toPath())); BufferedOutputStream outBuffer = new BufferedOutputStream(Files.newOutputStream(toFile.toPath()))) { @@ -339,7 +384,7 @@ public class FileHelper { * * @return true if and only if the renaming succeeded; false otherwise */ - public final static boolean move(File fromFile, File toFile) { + public static boolean move(File fromFile, File toFile) { if (fromFile.renameTo(toFile)) { return true; diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/helper/XmlHelper.java b/li.strolch.utils/src/main/java/li/strolch/utils/helper/XmlHelper.java index 5eada121a..11b637d50 100644 --- a/li.strolch.utils/src/main/java/li/strolch/utils/helper/XmlHelper.java +++ b/li.strolch.utils/src/main/java/li/strolch/utils/helper/XmlHelper.java @@ -15,8 +15,6 @@ */ package li.strolch.utils.helper; -import static li.strolch.utils.helper.StringHelper.normalizeLength; - import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; @@ -31,8 +29,6 @@ import javax.xml.transform.stream.StreamResult; import java.io.*; import java.nio.file.Files; import java.text.MessageFormat; -import java.time.LocalDate; -import java.time.LocalTime; import li.strolch.utils.RemoveCRFilterWriter; import li.strolch.utils.exceptions.XmlException; @@ -333,27 +329,10 @@ public class XmlHelper { } } - public static void marshallTempFile(File tempPath, String prefix, Object object) throws Exception { - marshallTempFile(tempPath, prefix, false, object); - } - - public static void marshallTempFile(File tempPath, String prefix, boolean separateHours, Object object) - throws Exception { - - String currentHour = normalizeLength(String.valueOf(LocalTime.now().getHour()), 2, true, '0'); - - String pathS; - if (separateHours) - pathS = LocalDate.now() + "/" + currentHour; - else - pathS = LocalDate.now() + "_" + currentHour; - - File path = new File(tempPath, pathS); - if (!path.exists() && !path.mkdirs()) - throw new IllegalStateException("Failed to create path " + path.getAbsolutePath()); - - File dataFile = new File(path, prefix + "_" + System.currentTimeMillis() + ".xml"); + public static void marshallTempFile(File tempPath, String prefix, boolean separateDateSegments, + boolean separateHours, Object object) throws Exception { + File dataFile = FileHelper.getTempFile(tempPath, prefix, ".xml", separateDateSegments, separateHours); marshall(dataFile, object); }