Java BufferedReader控制台参数

Java BufferedReader控制台参数,java,bufferedreader,Java,Bufferedreader,我的任务是写一个叫做“Sokoban”的小游戏。在这个子任务中,我必须让程序读取一个文件 当我没有在“JavaSokoban”之后写东西时,它应该阅读标准映射。 这是可行的,但当我将“javasokobanexample.txt”写入控制台时,它还应该读取另一个文件 我的缓冲读卡器代码是: public class Sokoban { public static void main(String[]args) throws IOException { BufferedRea

我的任务是写一个叫做“Sokoban”的小游戏。在这个子任务中,我必须让程序读取一个文件

当我没有在“JavaSokoban”之后写东西时,它应该阅读标准映射。 这是可行的,但当我将“javasokobanexample.txt”写入控制台时,它还应该读取另一个文件

我的缓冲读卡器代码是:

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我很抱歉忽略了它。我将程序名误读为参数。我已编辑了答案。