好的,這很有趣:看起來android.jar中的File.createTempFile()方法實現的方式與rt.jar中的不同。
在rt.jar中(與Java 8),我們有:
public static File createTempFile(String prefix, String suffix,
File directory)
throws IOException
{
if (prefix.length() < 3)
throw new IllegalArgumentException("Prefix string too short");
if (suffix == null)
suffix = ".tmp";
File tmpdir = (directory != null) ? directory
: TempDirectory.location();
SecurityManager sm = System.getSecurityManager();
File f;
do {
f = TempDirectory.generateFile(prefix, suffix, tmpdir);
if (sm != null) {
try {
sm.checkWrite(f.getPath());
} catch (SecurityException se) {
// don't reveal temporary directory location
if (directory == null)
throw new SecurityException("Unable to create temporary file");
throw se;
}
}
} while ((fs.getBooleanAttributes(f) & FileSystem.BA_EXISTS) != 0);
if (!fs.createFileExclusively(f.getPath()))
throw new IOException("Unable to create temporary file");
return f;
}
它採用TempDirectory.generateFile(String, String, File)
:
private static final SecureRandom random = new SecureRandom();
static File generateFile(String prefix, String suffix, File dir)
throws IOException
{
long n = random.nextLong();
if (n == Long.MIN_VALUE) {
n = 0; // corner case
} else {
n = Math.abs(n);
}
// Use only the file name from the supplied prefix
prefix = (new File(prefix)).getName();
String name = prefix + Long.toString(n) + suffix;
File f = new File(dir, name);
if (!name.equals(f.getName()) || f.isInvalid()) {
if (System.getSecurityManager() != null)
throw new IOException("Unable to create temporary file");
else
throw new IOException("Unable to create temporary file, " + f);
}
return f;
}
這將導致與他們正隨機數的文件名。
在的android.jar(Android的API 20),我們有:
public static File createTempFile(String prefix, String suffix, File directory)
throws IOException {
// Force a prefix null check first
if (prefix.length() < 3) {
throw new IllegalArgumentException("prefix must be at least 3 characters");
}
if (suffix == null) {
suffix = ".tmp";
}
File tmpDirFile = directory;
if (tmpDirFile == null) {
String tmpDir = System.getProperty("java.io.tmpdir", ".");
tmpDirFile = new File(tmpDir);
}
File result;
do {
result = new File(tmpDirFile, prefix + tempFileRandom.nextInt() + suffix);
} while (!result.createNewFile());
return result;
}
由於tempFileRandom
是一個標準Random
實例,其nextInt()
方法將返回正以及負整數。
因此,使用File.createTempFile()
可以在Android上返回帶有負號/連字符的文件名。
因此,最好的選擇是實現自己的文件名稱生成器和createTempFile()
方法,該方法基於運行時庫中提供的方法,但只有正的隨機數。
爲什麼這很重要?是否有它引起的特定問題,還是僅僅在美學上不令人滿意? –
@Andy Turner:「 - 」符號不被接受爲Android中文件名的字符。所以我總是必須重命名這些名字。 –
@HansiHansenbaum當然可以。 Android是Linux。唯一不可接受的字符是/和空終止符 –