Java BufferedReader控制台参数
我的任务是写一个叫做“Sokoban”的小游戏。在这个子任务中,我必须让程序读取一个文件 当我没有在“JavaSokoban”之后写东西时,它应该阅读标准映射。 这是可行的,但当我将“javasokobanexample.txt”写入控制台时,它还应该读取另一个文件 我的缓冲读卡器代码是:Java BufferedReader控制台参数,java,bufferedreader,Java,Bufferedreader,我的任务是写一个叫做“Sokoban”的小游戏。在这个子任务中,我必须让程序读取一个文件 当我没有在“JavaSokoban”之后写东西时,它应该阅读标准映射。 这是可行的,但当我将“javasokobanexample.txt”写入控制台时,它还应该读取另一个文件 我的缓冲读卡器代码是: public class Sokoban { public static void main(String[]args) throws IOException { BufferedRea
public class Sokoban {
public static void main(String[]args) throws IOException {
BufferedReader br = Files.newBufferedReader(Paths.get("sokoban.txt"));
String line = null;
int spielfeldbreite = 0;
int spielfeldhoehe = 0;
while ((line = br.readLine()) != null) {
spielfeldbreite = line.length();
spielfeldhoehe++;
}
br.close();
Scanner scan = new Scanner(System.in);
String eingabe;
int playerX = 0;
int playerY = 0;
boolean exit = false;
char[][] room = new char[spielfeldbreite][spielfeldhoehe];
br = Files.newBufferedReader(Paths.get("sokoban.txt"))
||br = Files.newBufferedReader(Paths.get(args[]));
line = null;
int zeile = 0;
int zielfeld = 0;
int kiste = 0;
int kisteaufziel = 0;
int spieler = 0;
int hashtag = 0;
int leer = 0;
while ((line = br.readLine()) != null) {
for (int spalte = 0; spalte < spielfeldbreite; spalte++) {
room[spalte][zeile] = line.charAt(spalte);
switch (room[spalte][zeile]) {
case '@':
playerX = spalte;
playerY = zeile;
spieler++;
break;
case '.':
zielfeld++;
break;
case '+':
playerX = spalte;
playerY = zeile;
zielfeld++;
spieler++;
break;
case '*':
zielfeld++;
kiste++;
kisteaufziel++;
break;
case '$':
kiste++;
break;
case '#':
hashtag++;
break;
case ' ':
leer++;
break;
default:
System.out.println("Illegal symbol!");
line = null;
break;
}
}
zeile++;
}
br.close();
公共类Sokoban{
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=Files.newBufferedReader(path.get(“sokoban.txt”);
字符串行=null;
int spielfeldbreite=0;
int spielfeldhoehe=0;
而((line=br.readLine())!=null){
spielfeldbreite=line.length();
斯皮尔费尔德霍厄++;
}
br.close();
扫描仪扫描=新扫描仪(System.in);
字符串eingabe;
int playerX=0;
int playerY=0;
布尔退出=假;
char[][]房间=新char[spielfeldbreite][spielfeldhoehe];
br=Files.newbuffereder(path.get(“sokoban.txt”))
||br=Files.newbuffereder(path.get(args[]);
行=空;
int-zeile=0;
int-zielfeld=0;
int-kiste=0;
int-kisteaufziel=0;
int-spieler=0;
int hashtag=0;
int-leer=0;
而((line=br.readLine())!=null){
对于(int-spalte=0;spalte
我希望一切都是可以理解的。提前谢谢你如果我正确理解了你的问题,那么你所要做的就是修改
BufferReader
获取文件名的代码段
换句话说,您必须检查在运行应用程序时是否传递了任何参数,然后根据您选择的文件名
的参数数量
以下是代码片段:
String fileName = args.length > 0 ? args[0] : "sokoban.txt";
BufferedReader br = Files.newBufferedReader(Paths.get(fileName));
第一行将检查您是否传递了任何参数。如果您传递了参数,那么它将把第一个参数作为文件名
,如果没有,那么它将默认为您的标准文件。这里提供的代码有很多问题:
第一次使用后,请关闭BufferedReader,然后再次尝试从中读取
br=Files.newbuffereder(path.get(“sokoban.txt”))
||br=Files.newbuffereder(path.get(args[]);
不起作用,因为缺少args的表达式。
最好使用if来确定要使用的whiche文件
您多次使用path.get(“sokoban.txt”)
,这并不是很糟糕,但将代码更改为例如读取另一个文件非常耗时。
可以使用一个常量来定义文件名
如前所述,使用
String defaultMap = "sokoban.txt";
String fileName = args.length > 1 ? args[1] : defaultMap;
BufferedReader br = Files.newBufferedReader(Paths.get(fileName));
Java与C不同。在Java中,args[0]不是程序名,而是第一个命令行参数。您的代码应该是args.length>0?args[0]:“sokoban.txt”
@VGR我很抱歉忽略了它。我将程序名误读为参数。我已编辑了答案。