私のアプリには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)
私の考えでは、ファイル名に無効な文字が含まれている必要があります。ファイル名は ("Who owns the World? Smokers or Non-smokers .acsm") です。何か考えはありますか?
同様の問題に直面している人のために、ファイル名に実際に無効な文字があります。ファイル名に無効な文字に関する詳細情報がある SO のこのスレッドを見つけました。これで疑問が解消されることを願っています。