У Java IO есть максимальная длина имени файла? - PullRequest
11 голосов
/ 22 декабря 2010

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

Ответы [ 7 ]

7 голосов
/ 22 декабря 2010

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

5 голосов
/ 22 декабря 2010

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

2 голосов
/ 31 августа 2012

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

1 голос
/ 08 мая 2014

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

Макрос: int PATH_MAX

Единый системный предел (если таковой имеется) для длины полного имени файла (то есть аргумента, передаваемого системным вызовам, таким как open), включая завершающий нулевой символ. Библиотека GNU C не применяет этот предел, даже если определено PATH_MAX.

Макрос: int FILENAME_MAX

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

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

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

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

1 голос
/ 22 декабря 2010

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

1 голос
/ 22 декабря 2010

Java может достигать максимальной длины строки: Максимальная длина строки в Java - вызов метода length ()

0 голосов
/ 22 декабря 2010

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

...