VSCode调试Java程序时PrintWriter无法写入本地文件的问题
VSCode调试Java时PrintWriter写文件为空?看这解决
问题情况
写了个用PrintWriter往txt文件写内容的Java程序,CMD里用javac编译、java运行都正常,文件能写出内容;但在VSCode里按F5调试,目标txt文件就是空的。代码示例:
import java.io.*; public class Count { public static void main(String[] args) throws IOException { PrintWriter pw = new PrintWriter("count1m.txt"); for (int i = 1; i <= 1000000; i++) { pw.println(i); } pw.close(); } }
问题根源
核心是工作目录不一致:
- CMD运行时,你的工作目录是
.java文件所在的文件夹,所以文件直接生成在这个文件夹下,你能看到。 - VSCode调试默认的工作目录是你打开的项目根目录,不是
.java文件所在的子目录。你以为文件是空的,其实它生成在项目根目录里了;当然也有极小概率是调试时程序提前终止,pw.close()没执行,但你代码里close()在循环结束后,这种情况很少见。
解决方法
1. 用绝对路径写文件
直接指定文件的完整路径,比如:
PrintWriter pw = new PrintWriter("D:/code/java-demo/count1m.txt");
这样不管工作目录在哪,都会写到你指定的位置,不会出错。
2. 修改VSCode调试的工作目录
- 打开VSCode调试面板,点齿轮图标打开
launch.json配置文件。 - 在对应的Java调试配置里,加个
cwd字段,设置成当前.java文件的目录:
{ "version": "0.2.0", "configurations": [ { "type": "java", "name": "Debug (Launch) - Count", "request": "launch", "mainClass": "Count", "cwd": "${fileDirname}" // 这行是关键,指向当前文件所在目录 } ] }
${fileDirname}是VSCode自带的变量,自动取当前打开的.java文件的目录,这样调试时的工作目录就和CMD里一致了。
3. 去默认目录找文件
如果不想改配置,直接去你在VSCode里打开的项目根目录看看,count1m.txt大概率在那,而且已经有内容了。
小技巧
怕再踩路径坑?可以在代码里加一行打印当前工作目录的代码,直接看文件生成在哪:
System.out.println("当前工作目录:" + System.getProperty("user.dir"));
运行后控制台会输出路径,跟着找就行。
内容的提问来源于stack exchange,提问作者Evan Liu
相关产品推荐
相关产品推荐

