2016-06-22 14 views
1

assetsフォルダに保存されているデータファイルとres/rawフォルダに保存されているデータファイルの違いを理解しようとしています。私の目標は、(この場合は)テストスコアが格納されているアプリケーションディレクトリ構造にデータファイルを格納し、アクセスして変更できるようにすることです。 RAWファイルの代わりにASSETを使う必要があるのは私の理解です。ASSETSフォルダに保存されているテキストファイルを使用してください。

テキストファイルがRES/RAWフォルダに格納されているときに、テキストファイルからデータをロードすることができましたが、ASSETファイルを使用しているので、動作させることができません。 AssetManager.openを使うのと同じくらい簡単だと思いました。

最終的に私の1つの質問はこれです。 ASSETフォルダ内のテキストファイルを読み書きするにはどうすればよいですか?

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(); 

     } 

私は(am.open("test_scores.txt"))ライン上Unhandled exception: java.io.IOException ERORを取得しています:

は、ここに私のコードです。入力

答えて

1

AssetMangerの#オープン(文字列)が例外をスローします、あなたはそれを処理する必要があります。

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

だから、必要があります。私のファイルを除き

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

なぜ例外がスローされますか?ファイルtest_scores.txtは存在します。あなたのソリューションは途中で動作しますが、私はその理由を理解していません。 – Airfix

+0

例外は発生しませんが、予期しないことが原因で発生する可能性があります。読んだり書いたりすることは、より危険なことの一つです。サーバーと話すとき、それは悪化する... – 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

は、資産フォルダ内のリソースの生のフォルダではありません。私は、ユーザーのデバイス上でファイルを保存して変更できるように、資産で作業する必要がありました。 – Airfix

0

ため

乾杯がクラッシュからあなたのアプリを保つために/キャッチを試みる使用してみてください。彼らは理由のためにそこにいます。

これは私がアンドロイド内のファイルを開く方法です:

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

DavidさんのようにR.rawのリファレンスで作業する場合、IOExceptionを取得する可能性は非常に低いと提言しています –

+0

R.rawを使用するとよい方法です。プログラマー向けになるかもしれない。どのようにして例外の低いチャンスを処理するか私はそれらを処理しようとするので、アプリケーションは何の明白な理由もなくクラッシュしません。しかしそれは別の議論です;) – Flummox

+0

私はR.rawでファイルを使用していません。私がアクセスする必要があるファイルは、assetsフォルダです。ユーザーがデータファイルを更新して保存できるように、生のフォルダの代わりにassestフォルダを使用する必要があることは私の理解であった。 – 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) {  
    } 
関連する問題