Android Test - Läsa och skriva till fil
Hej. Jag sitter och försöker göra en klass som läser och skriver till Android via Internal Storage.
Felet är att det som skrivs till filen inte går att läsa. När den försöker läsa ut listan igen så ger readObjectsFromFile ett IOException.
Jag vet inte om man kan läsa filerna manuellt i android, kan man?
Metoden som ska läsa ser ut så här:
public List<T> readObjectsFromFile(String classTag) {
List<T> objList = new ArrayList<T>();
try {
// Open streams for writing
ois = new ObjectInputStream(context.openFileInput(classTag + "Object"));
objList = (List<T>) ois.readObject(); // Här ger ois.readObject() ett IOException
// Close the streams
ois.close();
} catch (FileNotFoundException e) {
Log.e("FileStorage",
"FileNotFoundException in FileStorage readObjectsToFile");
} catch (StreamCorruptedException e) {
Log.e("FileStorage",
"StreamCorruptedException in FileStorage readObjectsToFile");
} catch (ClassNotFoundException e) {
Log.e("FileStorage",
"ClassNotFoundException in FileStorage readObjectsToFile");
} catch (IOException e) {
Log.e("FileStorage", "IOException in FileStorage readObjectsToFile");
}
return objList;
}
Metoden som skriver
public boolean writeObjectsToFile(String classTag, List<T> objList) {
try {
FileOutputStream fos = context.openFileOutput(classTag + "Object", Context.MODE_PRIVATE);
// Open streams for writing
ObjectOutputStream oos = new ObjectOutputStream(context.openFileOutput(classTag + "Object", Context.MODE_PRIVATE));
oos.writeObject(objList);
// Close the ObjectInputStream
oos.close();
} catch (FileNotFoundException e) {
Log.e("FileStorage", FileNotFoundException in FileStorage writeObjectsToFile");
return false;
} catch (IOException e) {
Log.e("FileStorage", "IOException in FileStorage writeObjectsToFile");
return false;
}
return true;
}
Test klass metoden som gör att det inte funkar
public void testReadObjectsFromFile() {
//Init
classListOne = new ArrayList<TestClassOne>();
classListTwo = new ArrayList<TestClassTwo>();
storageOne = new FileStorage<TestClassOne>(getContext());
storageTwo = new FileStorage<TestClassTwo>(getContext());
for (int i = 0; i < 100; i++) {
TestClassOne testOne = new TestClassOne("StringOne" + Integer.toString(i), "StringTwo" + Integer.toString(i));
classListOne.add(testOne);
// Clone list to set it into the other class
List<TestClassOne> cloneList = new ArrayList<TestClassOne>();
for (TestClassOne c : classListOne) {
cloneList.add(c);
}
classListTwo.add(new TestClassTwo(cloneList));
// Write to file
storageOne.writeObjectsToFile(TestClassOne.TAG, classListOne);
storageTwo.writeObjectsToFile(TestClassTwo.TAG, classListTwo);
// Read from storageOne
List<TestClassOne> readFromStorageOne = storageOne.readObjectsFromFile(TestClassOne.TAG);
// Test all values are intact
for (int n = 0; n < i; n++) {
assertEquals(readFromStorageOne.get(n).testStringOne, classListOne.get(n).testStringOne); // <-- Här får vi ett IndexOutOfBounds
assertEquals(readFromStorageOne.get(n).testStringTwo, classListOne.get(n).testStringTwo);
}
// Read from storageTwo
List<TestClassTwo> readFromStorageTwo = storageTwo.readObjectsFromFile(TestClassTwo.TAG);
// Test all values are intact
for (int n = 0; n < i; n++) {
assertEquals(readFromStorageTwo.get(n), classListTwo.get(n));
}
}
}
De två inre klasserna i testet
private class TestClassOne implements Serializable {
public static final String TAG = "TestClassOne";
public String testStringOne;
public String testStringTwo;
public TestClassOne(String testStringOne, String testStringTwo) {
this.testStringOne = testStringOne;
this.testStringTwo = testStringTwo;
}
}
private class TestClassTwo implements Serializable {
public static final String TAG = "TestClassTwo";
public List<TestClassOne> list;
public TestClassTwo(List<TestClassOne> list) {
this.list = list;
}
}
}
CPU - QuadCore Intel Core 2 Quad 2,4 Q6600 | Ram - 4 096MB (DDR2-800 DDR2 SDRAM) | Moderkort - Asus P5E3 | Grafikkort - ATI Radeon HD 3870 X2 (1024 MB)