2014-08-29 184 views
2

我做了這個方法,它讀取一個csv文件,並將數據存儲到包含在地圖中的ArrayList。Map..This方法在java中單獨運行。但是當我在android中實現它時,它didn工作和應用程序崩潰..我一直試圖解決它所以任何幫助非常感謝謝謝..以下是我嘗試在Android中使用此方法通過讀取SD卡中的csv文件。當我使用get方法時,它似乎崩潰了。在下面你可以看到logcat。閱讀文件Android

public class New extends Activity { 
private static Map<String, List<String>> values; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

     try { 
      FileReader fr = new FileReader(Environment.getExternalStorageDirectory() + "/" + "Android/data/" 
        + getPackageName().toString()+ "/" + "SOPARC.csv"); 
     values = parseCsv(fr, ",", true); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     values.get("Date").get(2); 
    } 


    public static Map<String, List<String>> parseCsv(Reader reader, String separator, boolean hasHeader) throws IOException { 
     Map<String, List<String>> values = new LinkedHashMap<String, List<String>>(); 
     List<String> columnNames = new LinkedList<String>(); 
     BufferedReader br = null; 
     br = new BufferedReader(reader); 
     String line; 
     int numLines = 0; 
     while ((line = br.readLine()) != null) { 
      if (StringUtils.isNotBlank(line)) { 
       if (!line.startsWith("#")) { 
        String[] tokens = line.split(separator); 
        if (tokens != null) { 
         for (int i = 0; i < tokens.length; ++i) { 
          if (numLines == 0) { 
           columnNames.add(hasHeader ? tokens[i] : ("row_"+i)); 
          } else { 
           List<String> column = values.get(columnNames.get(i)); 
           if (column == null) { 
            column = new LinkedList<String>(); 
           } 
           column.add(tokens[i]); 
           values.put(columnNames.get(i), column); 
          } 
         } 
        } 
        ++numLines; 
       } 
      } 
     } 
     return values; 
    } 

enter image description here

+0

後堆棧跟蹤誤差..或試試這個: http://code.google.com/p/secrets-for-android/source/browse/trunk/src/au/com/bytecode/ opencsv/CSVReader.java – Davide 2014-08-29 19:31:16

+0

這是否有幫助? – user3156801 2014-08-29 19:58:12

+0

看起來不相關。 – auselen 2014-08-29 20:06:40

回答

0

您還必須添加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

AndroidManifest.xml文件,如果您在getExternalStorageDirectory()訪問文件。如果不是這種情況,可能是StrictMode

您可以通過StrictMode.setThreadPolicy(StrictMode.allowThreadDiskWrites())加入onCreate()進行測試。

但是,在主線程上執行文件訪問是不好的做法,因爲它們可能會花費任意長的時間。

+0

就像我說的代碼在我調試它在java(從我的電腦讀取文件)時正常工作。當我在android中實現它時,問題就出現了。必須是從我的sd(android)卡中讀取文件的問題,但我不確定 – user3156801 2014-08-29 19:26:40

+0

@ user3156801您是否添加了訪問SD卡的權限? – auselen 2014-08-29 19:27:35

+0

是把<使用權限android:name =「android.permission.WRITE_EXTERNAL_STORAGE」/>放入清單。我也試過FileInputStream是FileReader,但沒有區別 – user3156801 2014-08-29 19:35:45

0

如果這個工作在Java中(我不能測試),並在Android不工作,可能有一些問題,如:

  • 嘗試從活動的onCreate()方法刪除你的代碼 - 超載onCreate(),移至onResume()或爲其添加一個按鈕,這是非常糟糕的做法。

  • 秒 - 使用AsyncTask在單獨的線程上讀取文件,而不是在主(UI)線程上讀取文件,因爲這可能會導致崩潰/ ANR。