【发布时间】:2011-10-11 09:41:06
【问题描述】:
我的应用程序具有将文件保存在 SD 卡上的功能。
以下是我保存文件的代码
try {
File mediaDir = new File(
Environment.getExternalStorageDirectory(), "Media");
if (!mediaDir.exists()) {
mediaDir.mkdirs();
}
File f = new File(mediaDir, fileName);
f.createNewFile();
OutputStream os = new FileOutputStream(f);
byte[] data = toWriteBytes;
os.write(data);
os.close();
} catch (Exception e) {
Log.w("ExternalStorage", "Error writing ");
e.printStackTrace();
}
在遇到包含空格的文件名之前,这完全可以正常工作(例如“Hello World.txt”)(例如,hello?world.txt)
这是堆栈跟踪,以防万一
10-11 17:18:48.225: WARN/ExternalStorage(4519): Error writing
10-11 17:18:48.225: WARN/System.err(4519): java.io.IOException: Invalid argument
10-11 17:18:48.235: WARN/System.err(4519): at java.io.File.createNewFileImpl(Native Method)10-11 17:18:48.245: WARN/System.err(4519): at java.io.File.createNewFile(File.java:1257)
10-11 17:18:48.245: WARN/System.err(4519): at com.xxxx.Utility.createExternalStoragePrivateFile(Utility.java:87)
10-11 17:18:48.245: WARN/System.err(4519): at com.xxxxxx$1.handleMessage(Utility.java:52)
10-11 17:18:48.245: WARN/System.err(4519): at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 17:18:48.245: WARN/System.err(4519): at android.os.Looper.loop(Looper.java:123)
10-11 17:18:48.245: WARN/System.err(4519): at android.app.ActivityThread.main(ActivityThread.java:3839)
10-11 17:18:48.245: WARN/System.err(4519): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 17:18:48.245: WARN/System.err(4519): at java.lang.reflect.Method.invoke(Method.java:507)
10-11 17:18:48.245: WARN/System.err(4519): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-11 17:18:48.245: WARN/System.err(4519): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-11 17:18:48.245: WARN/System.err(4519): at dalvik.system.NativeStart.main(Native Method)
那么,我的问题是到底可能是什么问题,我该如何解决?
**注意:我使用单个单词文件名对其进行了测试,它非常好。
没有f.createNewFile(),它会给出FileNotFoundException。
看到Mice评论后,我意识到可能不是文件名中的空格。所以,这里是堆栈跟踪。
10-11 18:06:20.365: WARN/System.err(5280): java.io.FileNotFoundException: /mnt/sdcard/Media/Who owns the World? Smokers or Non-smokers .acsm (Invalid argument)
10-11 18:06:20.385: WARN/System.err(5280): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
10-11 18:06:20.385: WARN/System.err(5280): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
10-11 18:06:20.385: WARN/System.err(5280): at java.io.FileOutputStream.<init>(FileOutputStream.java:94)
10-11 18:06:20.385: WARN/System.err(5280): at java.io.FileOutputStream.<init>(FileOutputStream.java:66)
10-11 18:06:20.385: WARN/System.err(5280): at com.xxxx.Utility.createExternalStoragePrivateFile(Utility.java:88)
10-11 18:06:20.385: WARN/System.err(5280): at com.xxxxx.Utility$1.handleMessage(Utility.java:52)
10-11 18:06:20.385: WARN/System.err(5280): at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 18:06:20.385: WARN/System.err(5280): at android.os.Looper.loop(Looper.java:123)
10-11 18:06:20.385: WARN/System.err(5280): at android.app.ActivityThread.main(ActivityThread.java:3839)
10-11 18:06:20.385: WARN/System.err(5280): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 18:06:20.385: WARN/System.err(5280): at java.lang.reflect.Method.invoke(Method.java:507)
10-11 18:06:20.385: WARN/System.err(5280): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-11 18:06:20.385: WARN/System.err(5280): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-11 18:06:20.385: WARN/System.err(5280): at dalvik.system.NativeStart.main(Native Method)
我的想法是文件名中应该有一些无效字符。文件名是(“谁拥有世界?吸烟者或非吸烟者 .acsm”)。有什么想法吗?
为了那些面临类似问题的人的利益,它确实是文件名中的无效字符。我在 SO 上找到了this thread,其中包含有关文件名中无效字符的更多信息。希望这能消除任何疑虑。
【问题讨论】:
-
尝试不使用 f.createNewFile();
-
它会给出 FileNotFoundException
-
你是否在清单文件中设置了存储权限。
-
是的。仅当文件名有空格时才会出现此问题。单字文件名就可以了。
-
对我来说效果很好,有空格或没有空格。尝试调试 - 进入 File.java,看看它在哪里抛出异常。
标签: android android-sdcard java-io invalid-argument