diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java index 273d255a884fc41c2cbeb3cbc22ce04509a11e60..7ec6a26580af5ea62ad2f15d1189d537a1e493ad 100644 --- a/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java +++ b/common/source/java/ch/systemsx/cisd/common/utilities/FileUtilities.java @@ -21,6 +21,8 @@ import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -60,14 +62,7 @@ public final class FileUtilities try { fileReader = new FileReader(file); - BufferedReader bufferedReader = new BufferedReader(fileReader); - StringBuilder builder = new StringBuilder(); - String line; - while ((line = bufferedReader.readLine()) != null) - { - builder.append(line).append('\n'); - } - return new String(builder); + return readString(new BufferedReader(fileReader)); } catch (IOException ex) { throw new EnvironmentFailureException("Error when loading file " + file, ex); @@ -86,6 +81,51 @@ public final class FileUtilities } } + /** + * Loads a resource as a string. + * + * @param clazz Class for which <code>getResourceAsStream()</code> will be invoked. + * @param resource Absolute path of the resource (will be the argument of <code>getResourceAsStream()</code>). + * @return <code>null</code> if the specified resource does not exist. + * @throws EnvironmentFailureException if an <code>IOException</code> occurs during reading the resource. + */ + public static String loadStringResource(Class clazz, String resource) + { + InputStream stream = clazz.getResourceAsStream(resource); + if (stream == null) + { + return null; + } + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + try + { + return readString(reader); + } catch (IOException ex) + { + throw new EnvironmentFailureException("Couldn't read resource " + resource, ex); + } finally + { + try + { + reader.close(); + } catch (IOException ex) + { + throw new EnvironmentFailureException("Couldn't close reader for resource " + resource, ex); + } + } + } + + private static String readString(BufferedReader reader) throws IOException + { + StringBuilder builder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) + { + builder.append(line).append('\n'); + } + return new String(builder); + } + /** * Checks whether a <var>directory</var> of some <var>kind</var> is fully accessible to the program. * diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java index 1e98ca232934b6b2c09b39ada1ce41dc7ad7e7fe..3c9d53dcb673d0f4b799405b793aa1d2ebd671df 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FileUtilitiesTest.java @@ -16,7 +16,10 @@ package ch.systemsx.cisd.common.utilities; +import static org.testng.AssertJUnit.assertEquals; + import java.io.File; +import java.io.FileWriter; import java.io.IOException; import org.testng.annotations.BeforeSuite; @@ -32,7 +35,6 @@ import ch.systemsx.cisd.common.logging.LogInitializer; */ public class FileUtilitiesTest { - private static final File workingDirectory = new File("targets" + File.separator + "unit-test-wd"); @BeforeSuite @@ -88,4 +90,22 @@ public class FileUtilitiesTest FileUtilities.deleteRecursively(root); } + @Test + public void testLoadText() throws Exception + { + File file = new File(workingDirectory, "test.txt"); + FileWriter writer = new FileWriter(file); + try + { + writer.write("Hello\nWorld!"); + } finally + { + writer.close(); + } + + String text = FileUtilities.loadText(file); + assert file.delete(); + assertEquals("Hello\nWorld!\n", text); + } + }