Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.