Является ли Java IO максимальной длиной имени файла?

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

Ответ 1

Java не имеет максимальной длины имени файла, кроме, очевидно, для ограничения длины строки String (которая является максимальной длиной массива, то есть Integer.MAX_VALUE). Возможно, некоторые JVM имеют нижний предел, но я никогда не сталкиваюсь с такой проблемой (и я почти уверен, что это будет ошибкой в ​​отношении спецификаций Java), конечно, ОС может иметь один.

Ответ 2

Windows имеет длину имени файла в 256 символов. У Unix есть примерно то же, что я считаю. Таким образом, хотя Java IO может не иметь определенной длины (возможно, длина строки), она будет зависеть от реализации для операционной системы.

Ответ 3

Я сделал тест и получил длину 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.

Ответ 5

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

Ответ 6

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

Макро: int PATH_MAX

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

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

Макро: int FILENAME_MAX

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

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

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

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

Ответ 7

Так как имя файла - это метод String, а методы length и position возвращают int, я бы сказал, что максимальным является Integer.MAX_VALUE.