2016-06-22 10 views
1

Ich versuche, den Unterschied zwischen Datendateien, die im Ordner "Assets" gespeichert sind, und denen, die im Ordner "res/raw" gespeichert sind, zu verstehen. Mein Ziel ist es, eine Datendatei in der App-Verzeichnisstruktur zu speichern, in der (in diesem Fall) Testergebnisse gespeichert werden, auf die zugegriffen werden kann und die dann geändert werden können. Es ist mein Verständnis, dass ich dafür eine ASSET anstelle der RAW-Datei verwenden muss.Verwenden Sie eine Textdatei, die im Ordner ASSETS gespeichert ist

Ich habe es geschafft, die Daten aus der Textdatei in ein Array zu laden, wenn die Textdatei im RES/RAW-Ordner gespeichert wurde, aber ich kann es jetzt nicht arbeiten, da ich eine ASSET-Datei verwende. Ich dachte, es war so einfach wie AssetManager.open.

Letztlich ist meine eine Frage das. Wie lese und schreibe ich in eine Textdatei im ASSET-Ordner?

Hier ist mein Code:

public class MainActivity extends AppCompatActivity { 

    String[][] testScoreList = new String[3][3]; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Load test scores into arraylist 
     nameArrayListMethod(); 
    } 

    //This method loads test scores into an array 
    public void nameArrayListMethod(){ 
     InputStreamReader InputSR = null; 
     BufferedReader BufferedRdr = null; 
     String thisLine = null; 

     AssetManager am = getAssets(); 

     InputSR = new InputStreamReader(am.open("test_scores.txt")); 
     BufferedRdr = new BufferedReader(InputSR); 


     try { 
      // open input stream test_scores for reading purpose. 
      int i = 0; 
      while ((thisLine = BufferedRdr.readLine()) != null) { 
       // System.out.println(thisLine); 

       String[] parts = thisLine.split(" "); 
       testScoreList[i][0] = parts[0]; 
       testScoreList[i][1] = parts[1]; 
       i = i +1; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 

Ich erhalte eine Unhandled exception: java.io.IOException eror auf der (am.open("test_scores.txt")) Linie.

Beifall für die Eingabe

Antwort

1

AssetManger # open (String) Ausnahme werfen, und Sie müssen damit umgehen.

public final InputStream open(String fileName) throws IOException { 
    return open(fileName, ACCESS_STREAMING); 
} 

So brauchen Sie:

try { 
     InputSR = new InputStreamReader(am.open("test_scores.txt")); 
     BufferedRdr = new BufferedReader(InputSR); 
     // open input stream test_scores for reading purpose. 
     int i = 0; 
     while ((thisLine = BufferedRdr.readLine()) != null) { 
      // System.out.println(thisLine); 

      String[] parts = thisLine.split(" "); 
      testScoreList[i][0] = parts[0]; 
      testScoreList[i][1] = parts[1]; 
      i = i +1; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
+0

Warum gibt es eine Ausnahme? Die Datei test_scores.txt existiert. Ihre Lösung funktioniert übrigens, aber ich verstehe nicht warum. – Airfix

+0

Es wirft keine Ausnahme, aber es könnte aufgrund unvorhergesehener Dinge. Das Lesen und Schreiben von Dingen gehört zu diesen risikoreicheren Dingen. Im Gespräch mit einem Server wird es schlimmer ... – Flummox

1
InputStream is = getResources().openRawResource(R.raw.yourTxtFile); 
String s = IOUtils.toString(is); // Here is the whole string you want 
IOUtils.closeQuietly(is); // don't forget to close your streams 
+0

Außer meiner Datei ist in das Vermögen nicht den rohen Ordner Ressourcenordner. Ich musste in Assets arbeiten, um die Datei auf dem Benutzergerät zu speichern und zu ändern. – Airfix

0

Versuchen zu verwenden try/catch Ihre App zu halten vor einem Absturz. Sie sind aus einem bestimmten Grund da. Diese

ist, wie ich Dateien im Android öffnen:

try { 
    InputStream inputstream = getResources().openRawResource(getResources().getIndentifier("file_name", "folder", getPackageName())); 
    BufferedReader bufferedRdr = new BufferedReader(inputstream); 
} catch (IOException ioe) { 
    ioe.printStackTrace(); // error handling should be better then this... 
} // and you should close the InputStream and BufferedReader with .close(). 
+0

Nun, wenn Sie mit der R.raw-Referenz arbeiten, wie David vorgeschlagen hat, ist die Chance, dass IOException sehr niedrig ist, –

+0

Es ist eine gute Möglichkeit, die R.raw zu verwenden. Könnte Programmierer Pref sein. wie und wann mit den geringen Chancen für Ausnahmen umzugehen. Ich versuche, mit ihnen umzugehen, also stürzt die App nicht ohne ersichtlichen Grund ab. Aber das ist eine andere Diskussion;) – Flummox

+0

Ich benutze die Datei nicht in R.raw. Die Datei, auf die ich zugreifen muss, befindet sich im Ordner "Assets". Es war mein Verständnis, dass ich den Assest-Ordner anstelle des Raw-Ordners verwenden musste, damit der Benutzer die Datendatei aktualisieren und speichern konnte. – Airfix

0
BufferedReader br = null; 
    try { 
     br = new BufferedReader(new InputStreamReader(getAssets().open("myfile.txt"))); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) {  
    }