Changed license to CC0
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / file / IOHelper.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.file;
6
7 import java.io.*;
8
9 public class IOHelper {
10
11     /**
12      * Deletes files and directories recursively. WARNING!!! Follows symlinks!!!
13      *
14      * @param file directory to delete with entire contents.
15      * @throws IOException if filesystem error happens
16      */
17     public static void deleteRecursively(final File file) throws IOException {
18         if (file.isDirectory()) {
19
20             File[] files = file.listFiles();
21             if (files == null)
22                 throw new RuntimeException("Failed to read directory content for: "
23                         + file);
24
25             for (final File subFile : files)
26                 deleteRecursively(subFile);
27
28             if (!file.delete())
29                 throw new RuntimeException("Failed to delete directory: "
30                         + file);
31
32             return;
33         }
34
35         if (file.isFile())
36             if (!file.delete())
37                 throw new FileNotFoundException("Failed to delete file: "
38                         + file);
39     }
40
41     public static byte[] getFileContents(final File file)
42             throws IOException {
43
44         final byte[] result = new byte[(int) file.length()];
45         try (final FileInputStream fileInputStream = new FileInputStream(file)) {
46             if (fileInputStream.read(result) != result.length)
47                 throw new RuntimeException("Could not read file content:" + file);
48         }
49         return result;
50     }
51
52     public static String getFileContentsAsString(final File file)
53             throws IOException {
54         try {
55             return new String(getFileContents(file), "UTF-8");
56         } catch (final UnsupportedEncodingException exception) {
57             throw new RuntimeException(exception);
58         }
59     }
60
61     /**
62      * Compares new file content with old file content. If content in equal,
63      * then leaves file as-is. If content differs, then overrides file with the
64      * new content.
65      *
66      * @param file       file to potentially overwrite
67      * @param newContent new content
68      * @return <code>true</code> if file was overwritten.
69      * @throws FileNotFoundException if file is not found.
70      * @throws IOException           if error happens during file IO.
71      */
72     public static boolean overwriteFileIfContentDiffers(final File file,
73                                                         final byte[] newContent) throws IOException {
74
75         checkForEquality:
76         {
77             if (file.length() == newContent.length) {
78
79                 final byte[] oldContent = getFileContents(file);
80
81                 for (int i = 0; i < newContent.length; i++)
82                     if (newContent[i] != oldContent[i])
83                         break checkForEquality;
84
85                 // new file content in identical to old content
86                 return false;
87             }
88         }
89
90         // New content differs from existing. Overwrite file.
91         saveToFile(file, newContent);
92         return true;
93     }
94
95     public static void saveToFile(final File file, final byte[] content)
96             throws IOException {
97         try (final FileOutputStream fos = new FileOutputStream(file)) {
98             fos.write(content);
99         }
100     }
101
102 }