我在下面有这个代码,当我在eclipse中使用它时,它的工作完全正常。 但是,如果我构建一个可执行jar文件,则此代码无法完成。问题是永远不会创建文本文件。
这是类文件夹的绝对方式" game / src / res"地图"世界"是我尝试创建文本文件的地方。
所以我的问题:
运行可执行jar文件时是否有一种简单的方法来创建文本文件?
public GenerateWorld(int m, int n,int y, int x){//m is rows n is columns
Random random = new Random();
try{
out = new PrintStream(new FileOutputStream("src/res/worlds/temple.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
out.println(n+" "+m);
out.println(x+" "+y);
numbers = new String[m][n];
String row = "";
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(i+1==x&&j+1==y){
numbers[i][j] = 29+" ";
} else {
if(i==0){//TOP WALL
if(j==0){
numbers[i][j] = 25+" ";
} else if(j+1==n) {
numbers[i][j] = 26+" ";
} else {
numbers[i][j] = 21+" ";
}
} else if(j==0){//LEFT WALL
if(i==0 || i+1 == m){
numbers[i][j] = 25+" ";
} else {
numbers[i][j] = 23+" ";
}
} else if(i+1 == m){//BOTTOM;
if(j == 0 || j+1 == n){
numbers[i][j] = 25+" ";
} else {
numbers[i][j] = 22+" ";
}
} else if(j+1 == n){//RIGTH WALL
if(i==0){
numbers[i][j] = 26+" ";
} else if( i+1==m){
numbers[i][j] = 25+" ";
} else {
numbers[i][j] = 24+" ";
}
} else {
if(random.nextInt(20)==5){
numbers[i][j] = 28+" ";
} else {
numbers[i][j] = 20+" ";
}
}
}
row += numbers[i][j];
}
out.println(row);
row = "";
}
out.close();
}
答案 0 :(得分:2)
由于您使用new FileOutputStream("src/res/worlds/temple.txt")
,请确保此路径相对于当前工作目录确实存在。如果没有(即“src / res / worlds /”),则Java无法创建“temple.txt”文件。当您从Eclipse运行它时,您的CWD被设置为项目目录,其中可能存在“src / res / worlds”目录。但是如果你从JAR运行它,而CWD不是你项目的主目录,那么这条路径就不可用了。
因此,请使用File
的类isDirectory
方法来测试您的路径是否存在,如果不存在,请使用mkdirs
方法立即创建整个路径。
但最好考虑将生成的文件放在一些可配置的目录中(不是在源文件中硬编码)。
答案 1 :(得分:1)
你可以做的是你可以在代码中获取jar的绝对路径,然后使用属性文件,你可以使用MKDIRS获取你想要创建目录的路径,或者只是检查文件是否是创建与否,然后创建文件。
获得绝对路径 String absolutePath = getClass()。getProtectionDomain()。getCodeSource()
之后只需在内部或外部加载属性文件,然后使用路径。