【问题标题】:Reading in a file Android读取文件Android
【发布时间】:2014-10-23 20:16:18
【问题描述】:

我制作了这个方法,它读取一个 csv 文件并将数据存储到一个包含在地图 Map 中的数组列表中。这个方法仅在 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;
    }

【问题讨论】:

  • 发布堆栈跟踪错误.. 或试试这个:code.google.com/p/secrets-for-android/source/browse/trunk/src/…
  • 这有帮助吗?
  • 这看起来不相关。
  • 我很抱歉..错误的部分..我认为这应该是现在说明的问题
  • 你还是没有说是哪一行,但是从NullPointer中猜测,可能是CSV解析失败,然后values为空,然后你调用get就可以了。

标签: java android file csv


【解决方案1】:

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

  • 尝试从 Activity 的 onCreate() 方法中删除您的代码 - 重载 onCreate() 通常是不好的做法,请移至 onResume() 或为其添加按钮。

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

【讨论】:

    【解决方案2】:

    你一定也添加了

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

    如果您访问位于getExternalStorageDirectory() 的文件,则转到您的AndroidManifest.xml 文件。

    如果不是这样,可能是StrictMode

    你可以通过StrictMode.setThreadPolicy(StrictMode.allowThreadDiskWrites())添加到onCreate()进行测试。

    但是,在主线程上进行文件访问是不好的做法,因为它们可能会花费任意长时间。

    【讨论】:

    • 就像我说的那样,当我在 java 中调试它(从我的计算机中读取文件)时,代码可以完美地工作......当我在 android 中实现它时,问题就出现了。从我的 sd (android) 卡读取文件一定有问题,但我不确定
    • @user3156801 您是否添加了访问 SD 卡的权限?
    • 是的,将 放入清单中。我也试过 FileInputStream 而不是 FileReader 但没有区别
    • @user3156801 如果您添加了错误消息,这会容易得多:)
    • 如您所见,我添加了一个 logcat..希望这会有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2011-05-21
    • 2015-05-19
    • 1970-01-01
    • 2014-10-01
    • 2016-05-16
    相关资源
    最近更新 更多