FileInputStream(file) 返回 ENOENT(没有那个文件或目录)android
FileInputStream(file) returning ENOENT (No such file or directory) android
我正在尝试从文件管理器中检索文件(任何类型)并将此文件编码为 Base64 字符串。
我找到了很多涉及图像的答案,但我需要任何类型的文件。
他就是我正在做的。
我正在像这样从图库中检索文件(任何类型)
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Choose file"), GALLERY_REQUEST_CODE);
在我的结果中
Uri returnUri = intent.getData();
是什么给了我'content://com.android.providers.downloads.documents/document/1646'
那我试试
File file = new File( returnUri.getPath() );
到目前为止一切顺利,但随后我尝试将文件编码为 Base64 字符串:
String str = null;
try {
str = convertFile(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
和 convertFile 方法
public String convertFile(File file)
throws IOException {
byte[] bytes = loadFile(file);
byte[] encoded = Base64.encode(bytes, Base64.DEFAULT);
String encodedString = new String(encoded);
return encodedString;
}
和 loadFile 方法
private static byte[] loadFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
Log.i("MobileReport","Anexo -> loadfile(): File is too big!");
// File is too large
}
byte[] bytes = new byte[(int)length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("It was not possible to read the entire file "+file.getName());
}
is.close();
return bytes;
}
错误在'loadFile'方法的第一行
InputStream is = new FileInputStream(file);
应用程序崩溃,在日志中我得到:
java.io.FileNotFoundException: /document/1646: open failed: ENOENT (No such file or directory)
我已经声明了读取和写入权限。
谁能帮我解决这个错误?
谢谢!
returnUri
是一个 Uri
。它不是文件系统路径。
特别是,如果你检查它,你会发现它是一个content://
Uri
。要获得该内容的 InputStream
,请在 ContentResolver
上使用 openInputStream()
。
我正在尝试从文件管理器中检索文件(任何类型)并将此文件编码为 Base64 字符串。 我找到了很多涉及图像的答案,但我需要任何类型的文件。 他就是我正在做的。
我正在像这样从图库中检索文件(任何类型)
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Choose file"), GALLERY_REQUEST_CODE);
在我的结果中
Uri returnUri = intent.getData();
是什么给了我'content://com.android.providers.downloads.documents/document/1646'
那我试试
File file = new File( returnUri.getPath() );
到目前为止一切顺利,但随后我尝试将文件编码为 Base64 字符串:
String str = null;
try {
str = convertFile(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
和 convertFile 方法
public String convertFile(File file)
throws IOException {
byte[] bytes = loadFile(file);
byte[] encoded = Base64.encode(bytes, Base64.DEFAULT);
String encodedString = new String(encoded);
return encodedString;
}
和 loadFile 方法
private static byte[] loadFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
Log.i("MobileReport","Anexo -> loadfile(): File is too big!");
// File is too large
}
byte[] bytes = new byte[(int)length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("It was not possible to read the entire file "+file.getName());
}
is.close();
return bytes;
}
错误在'loadFile'方法的第一行
InputStream is = new FileInputStream(file);
应用程序崩溃,在日志中我得到:
java.io.FileNotFoundException: /document/1646: open failed: ENOENT (No such file or directory)
我已经声明了读取和写入权限。 谁能帮我解决这个错误? 谢谢!
returnUri
是一个 Uri
。它不是文件系统路径。
特别是,如果你检查它,你会发现它是一个content://
Uri
。要获得该内容的 InputStream
,请在 ContentResolver
上使用 openInputStream()
。