【问题标题】:Android: Trouble opening a user selected CSV or EXCEL fileAndroid:无法打开用户选择的 CSV 或 EXCEL 文件
【发布时间】:2018-09-05 00:46:25
【问题描述】:

我正在创建一个应用程序,我需要用户能够将数据导入设备上的本地 Room 数据库。我正在使用startActivityForResult(...) 方法从此处显示的Intent.ACTION_GET_CONTENT 获得响应:

Intent intent = new Intent().setType("*/*").setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select File"), GET_FILE_INTENT_CODE);

在要求用户指定要导入的文件的布局并将其转换为ImportStrategy 后,我将onActivityResult(...) 中收到的strategyUri 都传递给我的importData方法

    void importData(Uri data, ImportStrategy strategy) {
        try {
            File csvFile = new File(Environment.getExternalStorageDirectory() + data.getPath());
            CSVReader reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()));

            String[] nextLine;
            List<RainfallRecord> records = new ArrayList<>();

            while ((nextLine = reader.readNext()) != null) {
                records.add(getRecord(nextLine, strategy));
            }

            db.recordDao().insertAll(records);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(this.getApplicationContext(), "Error loading file", Toast.LENGTH_LONG).show();
        } catch (IOException ex) {
            ex.printStackTrace();
            Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
        }
    }

我遇到的问题是当它到达创建 CSVReader 的行时,我得到一个 FileNotFoundException 堆栈跟踪:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/document/1945 (No such file or directory)
W/System.err:     at java.io.FileInputStream.open0(Native Method)
W/System.err:     at java.io.FileInputStream.open(FileInputStream.java:231)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:165)
W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:112)
W/System.err:     at java.io.FileReader.<init>(FileReader.java:58)
W/System.err:     at ekshore.net.raintracker.MainActivity.importData(MainActivity.java:351)
W/System.err:     at ekshore.net.raintracker.MainActivity.lambda$customStrategy$11(MainActivity.java:406)
W/System.err:     at ekshore.net.raintracker.-$$Lambda$MainActivity$A7AYI1UOo4MNVQeFvopgj2wHPMM.onClick(Unknown Source:11)
W/System.err:     at android.view.View.performClick(View.java:6597)
W/System.err:     at android.view.View.performClickInternal(View.java:6574)
W/System.err:     at android.view.View.access$3100(View.java:778)
W/System.err:     at android.view.View$PerformClick.run(View.java:25885)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:873)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6669)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

返回的 URI 是 content://com.android.providers.downloads.documents/document/1945 最后的 1945 应该是 Rain(2018).xlsx

在我对这个问题所做的所有研究中,我发现从 content 的 URI 类型加载文件存在问题。但是我看到的所有修复都是针对媒体文件(图像或音频),而不是像这样的面向数据的文件。当我试图模仿使用ContentResolver 的其他解决方案时,我无法弄清楚。

如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

    标签: java android csv android-studio


    【解决方案1】:

    经过更多研究后,我偶然发现了这个blog 并发现我一直试图以错误的方式去做。我需要打开文件的方式不是通过File 对象,它需要文件路径。相反,我需要使用ContentResolver 来创建和InputStream 并以这种方式获取数据,代码最终看起来像这样:

    try {
            ContentResolver contentResolver = this.getContentResolver();
    
            InputStream inputStream = contentResolver.openInputStream(data);
            Scanner scanner = new Scanner(inputStream).useDelimiter("\n");
    
            String nextLine = scanner.nextLine();
            List<RainfallRecord> records = new ArrayList<>();
    
            if (nextLine.matches("^[A-Za-z]"));
                nextLine = scanner.nextLine();
    
            while (scanner.hasNext()) {
                String[] rainData = nextLine.split(",");
                nextLine = scanner.nextLine();
                records.add(getRecord(rainData, strategy));
            }
    
            db.recordDao().insertAll(records);
        } catch (IOException ex) {
            ex.printStackTrace();
            Toast.makeText(this.getApplicationContext(), "Error processing file", Toast.LENGTH_LONG).show();
        }
    

    if (nextLine.matches("^[A-Za-z]")); 正在检查是否有标头信息,如果有则跳过。

    【讨论】:

      猜你喜欢
      • 2013-11-05
      • 1970-01-01
      • 2021-08-02
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2016-06-14
      • 2023-04-09
      相关资源
      最近更新 更多