14

Different operating systems have different file name max lengths. Does Java have any limit on file name length when working with files?

vaibhavsahu
  • 612
  • 2
  • 7
  • 19
Dónal Boyle
  • 3,049
  • 2
  • 25
  • 40

8 Answers8

10

Java has no maximum file name length, except obviously for the String max length limit (which is the array max length, i.e. Integer.MAX_VALUE). Maybe some JVMs have a lower limit but I never run into such a problem (and I'm almost certain it would be a bug with respect to Java specifications), certainly OSes can have one.

Guillaume
  • 5,535
  • 1
  • 24
  • 30
  • 1
    Initially downvoted this, and double-checked myself..turns out to be correct. Filesystems have such limitations: http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits – Grégory Joseph Apr 23 '14 at 20:27
7

Windows has a 256 character filename length. Unix has about the same I believe. So while the Java IO may not have a defined length (String length maybe for sure), it would be dependent on the implementation for the operating system.

Casey
  • 12,070
  • 18
  • 71
  • 107
4

I had made a test and got ~ 1150 chars max length.

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

and got

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)

This was done on a fat32 filesystem from linux.

Sufian
  • 6,405
  • 16
  • 66
  • 120
ungalcrys
  • 5,242
  • 2
  • 39
  • 23
  • Your code tests the maximum length of the path + filename. I think the question might have been asking about the maximum filename. For FAT32 the filename length is limited to 12 (8.3) or 255 (with LFN), and the maximum pathname length is 32,760 (according to: https://learn.microsoft.com/en-us/windows/win32/fileio/filesystem-functionality-comparison?redirectedfrom=MSDN#limits). I suspect your program hit some other limit (perhaps a nested directory limit) before the 32,760 limit. – Adam Howell Mar 28 '22 at 17:36
1

glibc doesn't impose a limit, see The GNU C Library, limits for files

Macro: int PATH_MAX

The uniform system limit (if any) for the length of an entire file name (that is, the argument given to system calls such as open), including the terminating null character.

Portability Note: The GNU C Library does not enforce this limit even if PATH_MAX is defined.

Macro: int FILENAME_MAX

The value of this macro is an integer constant expression that represents the maximum length of a file name string. It is defined in stdio.h.

Unlike PATH_MAX, this macro is defined even if there is no actual limit imposed. In such a case, its value is typically a very large number. This is always the case on GNU/Hurd systems.

Usage Note: Don't use FILENAME_MAX as the size of an array in which to store a file name! You can't possibly make an array that big! Use dynamic allocation (see Memory Allocation) instead.

So, Java has no limit - except the max length of a String - since the underlying system hasn't. On Windows, pathes may be prefixed by \\?\ to be unlimited.

Aubin
  • 14,617
  • 9
  • 61
  • 84
1

Java may hit the maximal String length: String's Maximum length in Java - calling length() method

Community
  • 1
  • 1
PeterMmm
  • 24,152
  • 13
  • 73
  • 111
1

Java needs to turn all filename strings into a byte[] to interact with the OS. This means for some character sets the limit will be less than 2 billion. However I don't know of any OS which supports file names of this length. ;)

Peter Lawrey
  • 525,659
  • 79
  • 751
  • 1,130
1

Yes, 255 characters. It matches limits implied by operating system.

For example, on Mac OS Yosemite maximum path length is 1016 symbols, while maximum file name is 255 symbols. If you exceed this limit, Java NIO will throw an exception.

Ivan Nikitin
  • 3,578
  • 27
  • 39
0

Since file name is a String and length and position methods return an int, I'd say the maximum is Integer.MAX_VALUE.

kiwicptn
  • 502
  • 2
  • 9