Java IO a-t-il une longueur maximale de nom de fichier?

Différents systèmes d’exploitation ont différentes longueurs maximales de noms de fichiers. Est-ce que Java a une limite de longueur de nom de fichier lorsque vous travaillez avec des fichiers?

Java n’a pas de longueur de nom de fichier maximale, sauf évidemment pour la limite de longueur maximale de chaîne (qui correspond à la longueur maximale du tableau, c’est-à-dire Integer.MAX_VALUE). Certaines machines virtuelles ont peut-être une limite inférieure, mais je ne rencontre jamais un tel problème (et je suis presque certain qu’il s’agirait d’un bogue par rapport aux spécifications Java), mais les systèmes d’exploitation peuvent en avoir un.

Windows a une longueur de nom de fichier de 256 caractères. Unix a à peu près le même, je crois. Ainsi, bien que Java IO ne puisse pas avoir une longueur définie (longueur de chaîne peut-être à coup sûr), cela dépendrait de la mise en œuvre pour le système d’exploitation.

J’avais fait un test et obtenu une longueur maximale d’environ 1150 caractères.

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(); } 

et j’ai

 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) 

Cela a été fait sur un système de fichiers fat32 sous Linux.

Java peut atteindre la longueur de chaîne maximale: longueur maximale de Ssortingng en Java – méthode de longueur d’appel ()

Java doit transformer toutes les chaînes de nom de fichier en octet [] pour interagir avec le système d’exploitation. Cela signifie que, pour certains personnages, la limite sera inférieure à 2 milliards. Cependant, je ne connais aucun système d’exploitation prenant en charge des noms de fichier de cette longueur. 😉

La glibc n’impose pas de limite, voir The GNU C Library, limites pour les fichiers

Macro: int PATH_MAX

Limite système uniforme (le cas échéant) pour la longueur d’un nom de fichier entier (c’est-à-dire l’argument atsortingbué aux appels système tels que open), y compris le caractère nul final.

Remarque sur la portabilité: la bibliothèque GNU C n’applique pas cette limite même si PATH_MAX est défini.

Macro: int FILENAME_MAX

La valeur de cette macro est une expression constante entière représentant la longueur maximale d’une chaîne de nom de fichier. Il est défini dans stdio.h.

Contrairement à PATH_MAX, cette macro est définie même si aucune limite réelle n’est imposée. Dans un tel cas, sa valeur est généralement un très grand nombre. C’est toujours le cas sur les systèmes GNU / Hurd.

Remarque sur l’utilisation: N’utilisez pas FILENAME_MAX comme taille d’un tableau dans lequel stocker un nom de fichier! Vous ne pouvez pas faire un tableau si gros! Utilisez plutôt l’allocation dynamic (voir Allocation de mémoire).

Ainsi, Java n’a pas de limite – à l’exception de la longueur maximale d’une chaîne – comme le système sous-jacent. Sous Windows, les chemins peuvent être préfixés par \\? \ Pour être illimités.

Puisque le nom de fichier est une chaîne et que les méthodes de longueur et de position renvoient un int, je dirais que le maximum est Integer.MAX_VALUE.