Имеет ли Java IO максимальную длину имени файла?

различные операционные системы имеют различные длины имени файла максимальные. Имеет ли Java ограничение на длину имени файла при работе с файлами?

7 ответов


Java не имеет максимальной длины имени файла, за исключением, очевидно, предела максимальной длины строки (который является максимальной длиной массива, т. е. целым числом.МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ.) Возможно, у некоторых JVMs есть нижний предел, но я никогда не сталкивался с такой проблемой (и я почти уверен, что это будет ошибка в отношении спецификаций 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.<init>(FileOutputStream.java:194)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:145)

Это было сделано на файловой системе fat32 из linux.


Java может поразить максимальную длину строки: максимальная длина строки в методе Java-calling length ()


Java должен превратить все строки имени файла в байт[] для взаимодействия с ОС. Это означает, что для некоторых наборов символов предел будет меньше 2 миллиардов. Однако я не знаю ни одной ОС, которая поддерживает имена файлов длиной. ;)


glibc не накладывает ограничения, см. библиотека GNU C, ограничения для файлов

макрос: int PATH_MAX

равномерное системное ограничение (если есть) для длины всего имени файла (то есть аргумент, заданный системным вызовам, таким как open), включая завершающий нулевой символ.

Переносимость Примечание: библиотека GNU C не применяет это ограничение, даже если path_max определен.

макрос: int FILENAME_MAX

значение этого макроса-это целочисленное константное выражение, задающее максимальную длину строки имени файла. Он определен в stdio.h.

В отличие от PATH_MAX, этот макрос определяется, даже если нет фактического ограничения. В таком случае его значение обычно очень большое. Это всегда происходит в системах GNU/Hurd.

Использование Примечание: не используйте FILENAME_MAX как размер массива, в котором хранится имя файла! Вы не можете сделать массив таким большим! Вместо этого используйте динамическое выделение (см. выделение памяти).

таким образом, Java не имеет ограничений, кроме максимальной длины строки, поскольку базовая система не имеет. В Windows патхи могут иметь префикс \\?\ быть неограниченным.


поскольку имя файла-это строка, а методы length и position возвращают int, я бы сказал, что максимум-целое число.МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ.