在Android文件中阅读

时间:2014-08-29 19:05:14

标签: java android file csv

我制作了这个读取csv文件的方法,并将数据存储到地图Map中包含的arraylist中。这种方法在java中运行良好..但是当我在android中实现它时它不起作用而且应用程序崩溃..我一直在努力修复它所以任何帮助非常感谢谢谢..我是尝试通过从SD卡读取csv文件在android中使用此方法。当我使用get方法时,它似乎崩溃了。下面你可以看到logcat。

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

2 个答案:

答案 0 :(得分:0)

您还必须添加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果您访问AndroidManifest.xml处的文件,请

getExternalStorageDirectory()文件。

如果情况不是这样,可能是StrictMode

您可以StrictMode.setThreadPolicy(StrictMode.allowThreadDiskWrites())onCreate()进行测试。

然而,在主线程上进行文件访问是不好的做法,因为它们可能需要任意长时间。

答案 1 :(得分:0)

如果这在Java中有效(我无法测试)并且在Android中不起作用,则可能存在一些问题,例如:

  • 尝试从活动的onCreate()方法中删除您的代码 - 重载onCreate(),移至onResume()或为其添加按钮是一种非常糟糕的做法。

  • 第二 - 使用AsyncTask在单独的线程上读取文件,而不是在主(UI)线程上,因为它可能会导致崩溃/ ANR。