我只是找不到如何在 Android 11 上打开一个简单的 .csv 文件
I just can't find how to open a simple .csv file on Android 11
有了 Android 11 Scoped Storage 的新方法,它让我不得不学习它。我还在使用 Java,缺少 Android 11 的 Java 教程太疯狂了!
我正在制作一个可以打开 .csv
文件以读取其内容并将其添加到 arrayList
的应用程序,这样我就可以在 textview
上显示它,事情是,即使我正在阅读 Android 文档和所有内容,也没有任何效果!这是我到目前为止所做的:
按照 developer.android 上的教程进行操作:https://developer.android.com/training/data-storage/shared/documents-files
private void openFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, true);
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
这样我可以打开 filepicker
并导航到我的文件,然后阅读 .csv
我正在使用 ReaderCSV
:
if (requestCode == PICKFILE_REQUEST_CODE
&& resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
try {
CSVReader reader = new CSVReader(new FileReader(uri.toString()));
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
} catch (IOException | CsvValidationException e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
//Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show();
}
}
但是当我尝试使用 uri 结果时,它给我一个错误:
"java.io.FileNotFoundException:
content:/com.android.providers.media.documents/document/document%3A4165:
open failed: ENOENT (No such file or directory)"
现在我被困住了,因为我无法以任何形式解决它。
在我的清单上我有权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
编辑:这就是我解决特定问题的方法。
if (requestCode == 1
&& resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
try {
myList.clear();
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String mLine;
while ((mLine = r.readLine()) != null) {
myList.add(mLine);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
reload_myList();
}
}
这是有效的,但有一个问题,因为我的 .CSV 文件只是一列数据,它确实有效,因为 readLine(),如果你使用的是一个完全不同的 .CSV 文件,其中有许多数据分开on (,) 不要像我那样使用这个方法,因为我认为它不会像你想要的那样表现,我很确定你应该在读取文件时添加一些正则表达式(“,”),但我不'我不知道怎么做,我很高兴它成功了!
基本上我必须做的来获取文件的内容是使用:
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
我认为问题出在这一行:
CSVReader reader = new CSVReader(new FileReader(uri.toString()));
当您使用 Uri 时,您实际上并没有保存文件的真实路径。所以你不能从 uri.toString().
创建 File 对象
我的建议:
- 尝试使用不同的 CSVReader 构造函数。您可以从 Android 的 Uri 打开 InputStream 并读取该流。
有了 Android 11 Scoped Storage 的新方法,它让我不得不学习它。我还在使用 Java,缺少 Android 11 的 Java 教程太疯狂了!
我正在制作一个可以打开 .csv
文件以读取其内容并将其添加到 arrayList
的应用程序,这样我就可以在 textview
上显示它,事情是,即使我正在阅读 Android 文档和所有内容,也没有任何效果!这是我到目前为止所做的:
按照 developer.android 上的教程进行操作:https://developer.android.com/training/data-storage/shared/documents-files
private void openFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, true);
startActivityForResult(intent, PICKFILE_REQUEST_CODE);
}
这样我可以打开 filepicker
并导航到我的文件,然后阅读 .csv
我正在使用 ReaderCSV
:
if (requestCode == PICKFILE_REQUEST_CODE
&& resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
try {
CSVReader reader = new CSVReader(new FileReader(uri.toString()));
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
System.out.println(nextLine[0] + nextLine[1] + "etc...");
}
} catch (IOException | CsvValidationException e) {
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
//Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show();
}
}
但是当我尝试使用 uri 结果时,它给我一个错误:
"java.io.FileNotFoundException: content:/com.android.providers.media.documents/document/document%3A4165: open failed: ENOENT (No such file or directory)"
现在我被困住了,因为我无法以任何形式解决它。
在我的清单上我有权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
编辑:这就是我解决特定问题的方法。
if (requestCode == 1
&& resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
try {
myList.clear();
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
String mLine;
while ((mLine = r.readLine()) != null) {
myList.add(mLine);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
reload_myList();
}
}
这是有效的,但有一个问题,因为我的 .CSV 文件只是一列数据,它确实有效,因为 readLine(),如果你使用的是一个完全不同的 .CSV 文件,其中有许多数据分开on (,) 不要像我那样使用这个方法,因为我认为它不会像你想要的那样表现,我很确定你应该在读取文件时添加一些正则表达式(“,”),但我不'我不知道怎么做,我很高兴它成功了!
基本上我必须做的来获取文件的内容是使用:
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
我认为问题出在这一行:
CSVReader reader = new CSVReader(new FileReader(uri.toString()));
当您使用 Uri 时,您实际上并没有保存文件的真实路径。所以你不能从 uri.toString().
创建 File 对象我的建议:
- 尝试使用不同的 CSVReader 构造函数。您可以从 Android 的 Uri 打开 InputStream 并读取该流。