2011-10-11 73 views
3

我的應用程序具有將文件保存在SD卡上的功能。在文件名中使用特殊字符保存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(); 
} 

這工作完全正常才撞到了文件名中包含它的空間 (例如「你好World.txt」) (如:你好?世界.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


看到老鼠評論後,我意識到它可能不是文件名中的空格。所以,這裏是堆棧跟蹤。

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,它有關於文件名中無效字符的更多信息。希望這將清除任何疑慮。

+0

嘗試使用沒有f.createNewFile(); –

+0

它會給FileNotFoundException – PH7

+0

你有沒有在清單文件中設置存儲權限。 –

回答

0

我不知道「Hello World.txt」有什麼問題,但「誰擁有世界?吸菸者或非吸菸者.acsm」包含無效字符「?」。也許你應該對無效字符進行檢查以避免崩潰。

+0

我認爲這是正確的。即使 」?」在Linux中使用,我不認爲它在Android中是允許的。無論如何,避免使用文件/文件夾中的特殊字符以實現多平臺友好是一個不錯的主意。 – karnok

+0

@stefan,我明白你的觀點。 不幸的是,我無法避免使用這些文件名,因爲它們是從我無法訪問的數據源中提取的,而且我也需要以該名稱保存文件。 你能給我更多的信息或關於無效字符的鏈接嗎? – PH7

+0

對不起,我沒有android的無效字符列表。我認爲這可能是一個FAT32問題,所以這意味着以下所有字符都是無效的:/ \:*?「<> | – stefan