【问题标题】:Does Java IO have a maximum file name length limit?Java IO 是否有最大文件名长度限制?
【发布时间】:2011-05-29 14:29:52
【问题描述】:

不同的操作系统有不同的文件名最大长度。 Java在处理文件时对文件名长度有限制吗?

【问题讨论】:

    标签: java file file-io io


    【解决方案1】:

    Java 没有最大文件名长度,显然字符串最大长度限制(即数组最大长度,即 Integer.MAX_VALUE)除外。也许一些 JVM 有一个下限,但我从来没有遇到过这样的问题(而且我几乎可以肯定这将是 Java 规范的一个错误),当然操作系统也可以有一个。

    【讨论】:

    【解决方案2】:

    由于文件名是一个字符串,而长度和位置方法返回一个整数,我会说最大值是 Integer.MAX_VALUE。

    【讨论】:

      【解决方案3】:

      Java 可能达到最大字符串长度:String's Maximum length in Java - calling length() method

      【讨论】:

        【解决方案4】:

        Windows 的文件名长度为 256 个字符。我相信 Unix 也差不多。因此,虽然 Java IO 可能没有定义的长度(字符串长度可能是肯定的),但它取决于操作系统的实现。

        【讨论】:

          【解决方案5】:

          Java 需要将所有文件名字符串转换为 byte[] 才能与操作系统交互。这意味着对于某些字符集,限制将小于 20 亿。但是我不知道有任何操作系统支持这种长度的文件名。 ;)

          【讨论】:

            【解决方案6】:

            我做了一个测试,得到了 ~ 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)
            

            这是在 linux 的 fat32 文件系统上完成的。

            【讨论】:

              【解决方案7】:

              glibc 没有限制,见The GNU C Library, limits for files

              宏:int PATH_MAX

              整个文件名长度的统一系统限制(如果有)(即,系统调用的参数,如 open),包括终止空字符。

              可移植性说明:即使定义了 PATH_MAX,GNU C 库也不会强制执行此限制。

              宏:int FILENAME_MAX

              该宏的值是一个整数常量表达式,表示文件名字符串的最大长度。它在 stdio.h 中定义。

              与 PATH_MAX 不同,即使没有施加实际限制,也会定义此宏。在这种情况下,它的值通常是一个非常大的数字。在 GNU/Hurd 系统上总是如此。

              使用说明: 不要使用 FILENAME_MAX 作为存储文件名的数组的大小!你不可能做一个那么大的数组!请改用动态分配(请参阅内存分配)。

              所以,Java 没有限制——除了字符串的最大长度——因为底层系统没有。在 Windows 上,路径可以以 \\?\ 为前缀以不受限制。

              【讨论】:

                【解决方案8】:

                是的,255 个字符。它符合操作系统隐含的限制。

                例如,在 Mac OS Yosemite 上,最大路径长度为 1016 个符号,而最大文件名为 255 个符号。如果超过这个限制,Java NIO 会抛出异常。

                【讨论】:

                  猜你喜欢
                  • 2021-09-03
                  • 1970-01-01
                  • 2013-03-28
                  • 1970-01-01
                  • 2020-01-02
                  • 2020-05-20
                  • 2014-04-28
                  • 2022-12-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多