Java技术问询:如何用Scanner为FileWriter指定文件名?预定义字符串失效
问题分析与解决:Scanner获取文件名导致FileWriter创建文件失败
首先看你遇到的报错信息:java.io.FileNotFoundException: entries\awdwad .txt (文件名、目录名或卷标语法不正确),结合你后来找到的原因——遗漏分隔符,其实问题出在路径拼接时的格式错误,下面帮你梳理清楚整个问题的来龙去脉和后续的避坑方案:
问题根源拆解
- 拼写小失误:你最初的示例代码里
Filewriter是小写的w,正确应该是FileWriter(Java类名大小写敏感),不过从堆栈跟踪来看你已经修正了这个问题,不然代码根本编译不过。 - 路径/文件名格式非法:报错里的文件名是
entries\awdwad .txt,这里的问题大概率是你在拼接目录和文件名时,要么多了一个多余的分隔符,要么少了必要的分隔符,导致系统无法识别正确的文件路径。比如如果原本是想把文件放到entries目录下,但拼接时写成了entriesawdwad.txt(没加分隔符),或者字符串里的\没转义成\\(Windows系统要求),都会触发这个错误。另外文件名末尾的空格也可能导致系统识别异常。
修复与避坑方案
1. 用安全的方式拼接路径
手动写路径分隔符很容易出错,推荐用Java提供的工具类来构建路径,避免手动拼接的问题:
import java.io.*; import java.util.Scanner; public class Example{ public static void main(String[] arg) { String title; Scanner input = new Scanner(System.in); // 去掉输入的首尾空格,避免文件名带多余空格 title = input.next().trim(); try { // 用File类的构造方法自动处理路径分隔符 File targetFile = new File("entries", title + ".txt"); FileWriter fw = new FileWriter(targetFile); // 记得用完关闭流,或者用try-with-resources自动关闭 fw.close(); } catch (IOException ex) { // 不要空catch,打印堆栈信息帮你快速定位问题 ex.printStackTrace(); } input.close(); } }
或者用更现代的NIO Paths类写法:
Path targetPath = Paths.get("entries", title + ".txt"); FileWriter fw = new FileWriter(targetPath.toFile());
2. 校验并清理用户输入的文件名
用户输入的内容可能包含系统不允许的字符(比如Windows下的\ / : * ? " < > |,Linux下的/),可以提前过滤:
title = input.next().trim(); // 过滤掉非法字符,替换成空字符串 title = title.replaceAll("[\\\\/:*?\"<>|]", "");
3. 不要忽略异常处理
空的catch (IOException ex) {}会让你完全看不到错误细节,这也是你一开始找不到问题的原因之一。至少要打印堆栈跟踪,或者给出友好的错误提示。
总结
你找到的“遗漏分隔符”确实是核心问题,本质是路径格式不符合系统要求。用Java提供的路径构建工具类,加上输入内容的校验,就能避免这类问题再次发生啦。
内容的提问来源于stack exchange,提问作者Amerul Atiq
相关产品推荐
相关产品推荐

