Java IO是否具有最大文件名长度?

不同的操作系统具有不同的文件名最大长度。 在处理文件时,Java是否对文件名长度有任何限制?

Java没有最大文件名长度,但字符串最大长度限制(即数组最大长度,即Integer.MAX_VALUE)显然除外。 也许有些JVM有一个下限,但我从来没有遇到过这样的问题(我几乎可以肯定它会是一个关于Java规范的错误),当然操作系统可以有一个。

Windows的文件名长度为256个字符。 我相信Unix也有同样的东西。 因此,虽然Java IO可能没有定义的长度(可能确定字符串长度),但它将取决于操作系统的实现。

我做了一个测试,得到了大约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.(FileOutputStream.java:194) at java.io.FileOutputStream.(FileOutputStream.java:145) 

这是在linux的fat32文件系统上完成的。

Java可能会达到最大字符串长度: String的Java中的最大长度 – 调用length()方法

Java需要将所有文件名字符串转换为byte []以与OS交互。 这意味着对于某些字符集,限制将小于20亿。 但是我不知道任何支持这个长度的文件名的操作系统。 ;)

glibc没有限制,请参阅GNU C库,文件限制

宏:int PATH_MAX

统一系统限制(如果有),表示整个文件名的长度(即,给予系统调用的参数,例如open),包括终止空字符。

可移植性注意:即使定义了PATH_MAX,GNU C库也不会强制实施此限制。

宏:int FILENAME_MAX

此宏的值是一个整数常量表达式,表示文件名字符串的最大长度。 它在stdio.h中定义。

与PATH_MAX不同,即使没有施加实际限制,也会定义此宏。 在这种情况下,其值通常是非常大的数字。 在GNU / Hurd系统上总是如此。

使用备注:不要将FILENAME_MAX用作存储文件名的数组大小! 你不可能制造出那么大的arrays! 请改用动态分配(请参阅内存分配)。

因此,Java没有限制 – 除了String的最大长度 – 因为底层系统没有。 在Windows上,pathes可能以\\?\为前缀,无限制。

由于文件名是一个String,长度和位置方法返回一个int,我会说最大值是Integer.MAX_VALUE。