Die Codes sind sicher nicht perfekt, funktionieren aber mal vorerst „nach aussen“:
Hier der Code zum schreiben:
public static String writeFileOnInternalStorage(final Object caDirectoryOrAndroidAppContext, final String caFileNameWithOptionalRelativePath, final String caFileContent)
{
FileWriter lFileWriter = null;
try
{
final String clObjectClassName = caDirectoryOrAndroidAppContext.getClass().getName();
File lFile = null;
if ((clObjectClassName.intern() == "android.app.Application") || (clObjectClassName.intern() == "android.content.Context"))
{
final Method clFilesDirMethod = caDirectoryOrAndroidAppContext.getClass().getMethod("getFilesDir");
final File clFilesDir = (File) clFilesDirMethod.invoke(caDirectoryOrAndroidAppContext);
lFile = new File(clFilesDir, "/");
lFile = new File(lFile, caFileNameWithOptionalRelativePath);
}
else
{
if (caDirectoryOrAndroidAppContext instanceof String)
{
final String clAbsolutFilePath = caDirectoryOrAndroidAppContext + File.separator + caFileNameWithOptionalRelativePath;
lFile = new File(clAbsolutFilePath);
}
}
String lRetValPrefix = "File is already existing, was overwritten:";
if (!lFile.exists())
{
if (caDirectoryOrAndroidAppContext instanceof String)
{
lFile.createNewFile();
}
lRetValPrefix = "File didn't exist until now, was created:";
}
lRetValPrefix = lRetValPrefix + " ";
lFileWriter = new FileWriter(lFile);
lFileWriter.append(caFileContent);
lFileWriter.flush();
return lRetValPrefix + lFile.getAbsolutePath();
}
catch (final Exception caException)
{
return "Exception: " + caException.getMessage();
}
finally
{
if (lFileWriter != null)
{
try
{
lFileWriter.close();
}
catch (final Exception caException)
{
final Runtime clRuntime = Runtime.getRuntime();
clRuntime.gc();
}
}
}
}
Hier der Code zum Lesen:
public static String openFileOnInternalStorage(final Object caDirectoryOrAndroidAppContext,
final String caFileNameWithOptionalRelativePath) {
BufferedReader lBufferedReader = null;
final StringWriter clStringWriter = new StringWriter();
final String clObjectClassName = caDirectoryOrAndroidAppContext.getClass().getName();
try {
File lFile = null;
if ((clObjectClassName.intern() == "android.app.Application")
|| (clObjectClassName.intern() == "android.content.Context")) {
final Method clFilesDirMethod = caDirectoryOrAndroidAppContext.getClass().getMethod("getFilesDir");
final File clFilesDir = (File) clFilesDirMethod.invoke(caDirectoryOrAndroidAppContext);
lFile = new File(clFilesDir, "/");
lFile = new File(lFile, caFileNameWithOptionalRelativePath);
} else {
if (caDirectoryOrAndroidAppContext instanceof String) {
final String clAbsolutFilePath = caDirectoryOrAndroidAppContext + File.separator
+ caFileNameWithOptionalRelativePath;
lFile = new File(clAbsolutFilePath);
}
}
lBufferedReader = new BufferedReader(new FileReader(lFile));
String lLine = null;
final String clLineSeparator = System.getProperty("line.separator");
while ((lLine = lBufferedReader.readLine()) != null) {
clStringWriter.append(lLine);
clStringWriter.append(clLineSeparator);
}
return new String(clStringWriter.toString());
} catch (final Exception caException) {
return "Exception: " + caException.getMessage();
} finally {
try {
if (clStringWriter != null) {
clStringWriter.close();
}
if (lBufferedReader != null) {
lBufferedReader.close();
}
} catch (final Exception clException) {
final Runtime clRuntime = Runtime.getRuntime();
clRuntime.gc();
}
}
}
Hier der Einsatz als testPrefixJUnitTest
-Methode (class … extends TestCase, die JUnit-Variante der alten Schule, ist aber einfach als Ersatz für ne main(…)-Funktion gedacht, d.h. ohne irgendwelche Unit-Test-typischen Sachen wie assert & Co…). Eigentlich noch mal das gleiche wie in einem vorherigen Post von mir:
public void testPrintWriterEndOfFileProblem_na() {
System.out.println("Test function testPrintWriterEndOfFileProblem_na(): write ... ");
System.out.println(PrintWriterEndOfFileProblem.writeFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt",
Hasher.hash("na", Hasher.SHA512)));
System.out.println("Test function testPrintWriterEndOfFileProblem(): read ... ");
final String clFileContent = PrintWriterEndOfFileProblem.openFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt").replace("\r\n", "").replace("\r", "").replace("\n", "");;
System.out.println("File content: " + clFileContent);
}
public void testPrintWriterEndOfFileProblem_nana() {
System.out.println("Test function testPrintWriterEndOfFileProblem_nana(): write ... ");
System.out.println(PrintWriterEndOfFileProblem.writeFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt",
Hasher.hash("nana", Hasher.SHA512)));
System.out.println("Test function testPrintWriterEndOfFileProblem(): read ... ");
final String clFileContent = PrintWriterEndOfFileProblem.openFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt").replace("\r\n", "").replace("\r", "").replace("\n", "");;
System.out.println("File content: " + clFileContent);
}
public void testPrintWriterEndOfFileProblem_nanana() {
System.out.println("Test function testPrintWriterEndOfFileProblem_nanana(): write ... ");
System.out.println(PrintWriterEndOfFileProblem.writeFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt",
Hasher.hash("nanana", Hasher.SHA512)));
System.out.println("Test function testPrintWriterEndOfFileProblem(): read ... ");
final String clFileContent = PrintWriterEndOfFileProblem.openFileOnInternalStorage("C:\\Users\\xxx", "TEST.txt").replace("\r\n", "").replace("\r", "").replace("\n", "");;
System.out.println("File content: " + clFileContent);
}
Resulat:
Test function testPrintWriterEndOfFileProblem_nanana(): write ...
File is already existing, was overwritten: C:\Users\xxx\TEST.txt
Test function testPrintWriterEndOfFileProblem(): read ...
File content: 40946257f1f5653e361dc670a489e2face9e2b5e1858dba02cf840fb9bfaa5ef013182dafe8b89a2c4417139e30869e9da3554b1bb3bfe902e5e2b5c528e71b6
Test function testPrintWriterEndOfFileProblem_na(): write ...
File is already existing, was overwritten: C:\Users\xxx\TEST.txt
Test function testPrintWriterEndOfFileProblem(): read ...
File content: e2d0181ee3bb4a437c9b6a2358b08d7103b409ba202b75a4b1d9dca83ba8db0c9837ecc6f898f32a27ebb36367be0696ba5e095742c742cdc1fefbb8e8d7d21f
Test function testPrintWriterEndOfFileProblem_nana(): write ...
File is already existing, was overwritten: C:\Users\xxx\TEST.txt
Test function testPrintWriterEndOfFileProblem(): read ...
File content: 37bdf6dfe9b40ba59244bf86f2b6bfeca817ca5f8d35c74de629a9c8e50074fa96778559308443d3fe719fc6ae166aa56e69fad1cc81ad36bddc139c6f520d38
…scheint demzufolge zu gehen, alle Hashes sind anders; habe das Problem mit der Leerzeile ja ausserhalb von Android testen wollen, als Anfänger habe ich mühe das dort zu debuggen. Deshalb geben die Funktionen auch Strings zurück, welche ich zumindest mit einer Android-MessageBox anzeigen könnte.
Deshalb JUnit-Test unter Windows. Aber dort tritt dann plötzlich das Problem mit der 2. Leerzeile nicht mehr auf.
Was auch die Kernfrage des Threads ist.
Bei der Sache mit den Hashes mit na/nana/nanana-Kennwörtern und hashAusDateiInhalt.replace("\r\n", "").replace("\r", "").replace("\n", "");
läuft alles glatt! :-))
Gruss, Jan
Nachtrag: „PrintWriter“ in den Namen ist falsch, hab da was verwechselt… wenn schon: „FileWriter“