2014-08-29 141 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。