2016-06-22 160 views
1

我想了解資產文件夾中存儲的數據文件與存儲在res/raw文件夾中的數據文件之間的區別。我的目標是將數據文件存儲在應用程序目錄結構中(在這種情況下)存儲測試成績,可以訪問它們,然後修改它們。這是我的理解,我需要使用ASSET而不是RAW文件。使用存儲在資產文件夾中的文本文件

當文本文件存儲在RES/RAW文件夾中時,我設法將文本文件中的數據加載到數組中,但現在我無法使用ASSET文件工作。我認爲這與使用AssetManager.open一樣簡單。

最終我的一個問題就是這個。如何讀取和寫入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

除了我的文件是在Assets文件夾而不是資源的原始文件夾。我需要處理資產,以便我可以在用戶設備上保存和修改文件。 – Airfix

0

儘量使用try/catch來保持你的應用程序崩潰。他們在那裏是有原因的。

這是我的Android之內打開的文件:

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

那麼,如果你使用R.raw的參考像David一樣建議獲得IOException的機會非常低 –

+0

這是使用R.raw的好方法。可能是程序員的首選。如何以及何時處理例外的低可能性。我試圖處理它們,所以應用程序不會沒有任何明顯的原因崩潰。但這是另一個討論;) – Flummox

+0

我沒有在R.raw中使用該文件。我需要訪問的文件位於資產文件夾中。這是我的理解,我需要使用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) {  
    } 
相關問題