文件 I/O 错误:文件名、目录名或卷标语法不正确

File I/O Error: filename, directory name, or volume label syntax is incorrect

提问人:David H. 提问时间:6/6/2023 最后编辑:user207421David H. 更新时间:6/6/2023 访问量:1007

问:

我正在尝试用 Java 编写一个程序,该程序接受 CSV 文件作为用户输入(作为文件名或文件路径)。该程序将删除所有大于或等于 3 的空格,并将其替换为逗号。然后,程序会将修改后的文件保存到具有用户指定名称的新位置。我目前在读取用户的文件时遇到困难。提供输入文件时收到以下错误消息:

An error occurred: "C:\...\buzz (The filename, directory name, or volume label syntax is incorrect)"

这是我运行该程序的主要方法:

package fileConverter;

import java.io.*;
import java.util.*;

public class Program {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("Enter file name or location:");
        String inputFile = scanner.next();

        System.out.println("Enter output file name or location:");
        String outputFile = scanner.next();

        try {
            FileConverter.convertWhitespaceToComma(inputFile, outputFile);
            System.out.println("Conversion complete. Output written to " + outputFile);
        } catch (IOException e) {
            System.out.println("An error occurred: " + e.getMessage());
        } finally { 
            scanner.close();
        }
    }
}

此主要方法调用“FileConverter.java”,如下所示:

package fileConverter;

import java.io.*;
import java.util.regex.Pattern;

public class FileConverter {

    public static void convertWhitespaceToComma(String inputFile, String outputFile) throws IOException {

        // Create a regex pattern for matching whitespace sequences of length 3 or more
        Pattern pattern = Pattern.compile("\\s{3,}");

        FileReader fr = new FileReader(inputFile);
        BufferedReader br = new BufferedReader(fr);

        FileWriter fw = new FileWriter(outputFile);
        BufferedWriter bw = new BufferedWriter(fw);

        String line;

        while ((line = br.readLine()) != null) {

            // Replace all matched whitespace sequences with commas
            String modifiedLine = line.replaceAll(pattern.pattern(), ",");
            bw.write(modifiedLine);
            bw.newLine();
        }
        bw.close();
        fw.close();
        br.close();
        fr.close();
    }
}

我在 main 中有一个 try-catch 块,它打印一条错误消息 (),这就是此错误消息的来源:e.getMessage()

An error occurred: "C:\...\buzz (The filename, directory name, or volume label syntax is incorrect)"

当我编译并运行程序时,这是从终端出来的:

Enter file name or location:
"C:\...\buzz lightyear\...\File Converter\src\fileConverter\<filename.txt>"
Enter output file name or location:
An error occurred: "C:\Users\buzz (The filename, directory name, or volume label syntax is incorrect)
C:\...\buzz lightyear\...\File Converter> 

我知道我的代码可能还有其他问题,但让我弄清楚这个问题,我会努力解决剩下的问题!

任何帮助和/或建议都是值得赞赏的。我只是想确定为什么无法识别文件。谢谢!

作为解决方法,我尝试提供文件名而不是完整路径,但我收到以下错误消息:

The system cannot find the file specified
java 文件-io java.util.scanner fileNotFoundException

评论

0赞 Old Dog Programmer 6/6/2023
看起来目录名称中的空格导致进程混乱。作为测试,将目录复制到 ,使用它,看看它是否有所作为。buzz_lightyear
2赞 user207421 6/6/2023
Scanner.next()正在这样做。用。Scanner.nextLine()
0赞 David H. 6/6/2023
好的,我将方法从 scanner.next() 更改为 scanner.nextLine()。我仍然收到错误消息:“C:\Users\buzz lightyear\Desktop\File Converter\src\fileConverter\<file name>”(文件名、目录名称或卷标语法不正确)“,但我会尝试将文件目录更改为 buzz_lightyear。感谢大家到目前为止的帮助。
0赞 Old Dog Programmer 6/6/2023
使用调试器,设置断点,并检查实际包含的内容和内容。inputFileoutputFile
0赞 Old Dog Programmer 6/6/2023
如果问题是由 中的空格引起的,它也将是由 中的空格引起的。因此,将路径名中出现空格的 to to 以及 change。buzz lightyearFile Converterbuzz lightyearbuzz_lightyearFile ConverterFile_Converter

答:

2赞 James Ledbury 6/6/2023 #1

您的问题似乎是使用 scanner.next() 读取到空格,因此当您给它路径 C:\Buzz Lightyear 时,它只会读取 C:\Buzz。

请改用 nextLine()

希望这会有所帮助。

评论

0赞 David H. 6/6/2023
你好!非常感谢您的建议。我将我的方法从 next() 更改为 nextLine(),但我仍然在终端中得到这个: 输入文件名或位置:“C:\Users\buzz lightyear\Desktop\File Converter\src\fileConverter\<file name.TXT>” 输入输出文件名或位置:“C:\Users\buzz lightyear\Desktop\File Converter\src\fileConverter\<new file name>” 发生错误: “C:\Users\buzz lightyear\Desktop\File Converter\src\fileConverter\<file name.TXT>”(文件名、目录名称或卷标语法不正确)
2赞 James Ledbury 6/6/2023
只是为了确认,当您有<文件name.TXT>时,这实际上不在您的输入中,对吗?我假设它只是一个占位符,但是如果它在您的输入中,则不能将文件名放在<>内。
0赞 DuncG 6/6/2023
以及确保不使用 ,也删除了 path 周围的引号。我假设您已经插入以隐藏使用的较长路径。<>...
0赞 David H. 6/7/2023
@JamesLedbury正确。这只是一个占位符。我确实尝试了带引号和不带引号的引号,并得到了与上述相同的错误消息。
0赞 David H. 6/7/2023
@DuncG正确,那只是为了隐藏较长的文件路径