【发布时间】:2011-05-29 14:29:52
【问题描述】:
不同的操作系统有不同的文件名最大长度。 Java在处理文件时对文件名长度有限制吗?
【问题讨论】:
不同的操作系统有不同的文件名最大长度。 Java在处理文件时对文件名长度有限制吗?
【问题讨论】:
Java 没有最大文件名长度,显然字符串最大长度限制(即数组最大长度,即 Integer.MAX_VALUE)除外。也许一些 JVM 有一个下限,但我从来没有遇到过这样的问题(而且我几乎可以肯定这将是 Java 规范的一个错误),当然操作系统也可以有一个。
【讨论】:
由于文件名是一个字符串,而长度和位置方法返回一个整数,我会说最大值是 Integer.MAX_VALUE。
【讨论】:
Java 可能达到最大字符串长度:String's Maximum length in Java - calling length() method
【讨论】:
Windows 的文件名长度为 256 个字符。我相信 Unix 也差不多。因此,虽然 Java IO 可能没有定义的长度(字符串长度可能是肯定的),但它取决于操作系统的实现。
【讨论】:
Java 需要将所有文件名字符串转换为 byte[] 才能与操作系统交互。这意味着对于某些字符集,限制将小于 20 亿。但是我不知道有任何操作系统支持这种长度的文件名。 ;)
【讨论】:
我做了一个测试,得到了 ~ 1150 个字符的最大长度。
if (!destFile.exists()) {
try {
destFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} else
return;
...
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
得到了
java.io.FileNotFoundException: /media/34A0-486C/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/57/58/59/60/61/62/63/64/65/66/67/68/69/70/71/72/73/74/75/76/77/78/79/80/81/82/83/84/85/86/87/88/89/90/91/92/93/94/95/96/97/98/99/100/101/102/103/104/105/106/107/108/109/110/111/112/113/114/115/116/117/118/119/120/121/122/123/124/125/126/127/128/129/130/131/132/133/134/135/136/137/138/139/140/141/142/143/144/145/146/147/148/149/150/151/152/153/154/155/156/157/158/159/160/161/162/163/164/165/166/167/168/169/170/171/172/173/174/175/176/177/178/179/180/181/182/183/184/185/186/187/188/189/190/191/192/193/194/195/196/197/198/199/200/201/202/203/204/205/206/207/208/209/210/211/212/213/214/215/216/217/218/219/220/221/222/223/224/225/226/227/228/229/230/231/232/233/234/235/236/237/238/239/240/241/242/243/244/245/246/247/248/249/250/251/252/253/254/255/256/257/258/259/260/261/262/263/264/265/266/267/268/269/270/271/272/273/274/275/276/277/278/279/280/281/282/283/284/285/286/287/288/289/290/291/292/293/294/295/296/297/298/299/300/301/302/303/304/305/306/307/308/309/310/0.mp3
(No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at java.io.FileOutputStream.<init>(FileOutputStream.java:145)
这是在 linux 的 fat32 文件系统上完成的。
【讨论】:
glibc 没有限制,见The GNU C Library, limits for files
宏:int PATH_MAX
整个文件名长度的统一系统限制(如果有)(即,系统调用的参数,如 open),包括终止空字符。
可移植性说明:即使定义了 PATH_MAX,GNU C 库也不会强制执行此限制。
宏:int FILENAME_MAX
该宏的值是一个整数常量表达式,表示文件名字符串的最大长度。它在 stdio.h 中定义。
与 PATH_MAX 不同,即使没有施加实际限制,也会定义此宏。在这种情况下,它的值通常是一个非常大的数字。在 GNU/Hurd 系统上总是如此。
使用说明: 不要使用 FILENAME_MAX 作为存储文件名的数组的大小!你不可能做一个那么大的数组!请改用动态分配(请参阅内存分配)。
所以,Java 没有限制——除了字符串的最大长度——因为底层系统没有。在 Windows 上,路径可以以 \\?\ 为前缀以不受限制。
【讨论】:
是的,255 个字符。它符合操作系统隐含的限制。
例如,在 Mac OS Yosemite 上,最大路径长度为 1016 个符号,而最大文件名为 255 个符号。如果超过这个限制,Java NIO 会抛出异常。
【讨论】: