我是否必须在每种方法中编写“BufferedReader ...”?

时间:2013-06-26 20:00:38

标签: java

我正在学习java编程。我是否必须在我必须从用户那里获取输入的每种方法中一次又一次地写BufferedReader br = new BufferedReader(new InputStreamReader(System.in));?如果存在其他一些替代方案,请提出建议。

4 个答案:

答案 0 :(得分:2)

您可能应该更仔细地考虑应用程序的设计。

通常将与用户的交互和应用程序的逻辑分开是一个非常好的主意。

理想情况下,您将有一个类封装BufferedReader和要打印到控制台的内容,并提供获取所需输入的方法,并向用户显示他应该知道的信息。

为了完成这项工作,您必须创建该类的新实例,并将其传递给需要与用户交互的所有类。

通过这种方式,您可以清楚地区分应用程序的不同问题,这种分离将提高应用程序的可维护性。例如,想想除了文本用户界面之外还需要编写图形用户界面会发生什么。

答案 1 :(得分:1)

根据您的使用案例,有两种可能的答案:

如果您正在使用输出流进行调试,请执行您喜欢的任何操作(只要它适合您),这就是您的代码。其他用户的答案适用于此。

但是,如果您将其用于实际程序,则应执行以下操作之一:

  • 将输出流作为参数传递给将使用它的每个方法,或
  • 让每个方法都返回主程序将输出的字符串。

对于主要的输入/输出方法,比如'输入有效值之前输入的提示用户',您应该将流作为参数传递,如下所示:

<强>不正确:

public static void main(String[] args){
    promptUserForInput();
}
public static int promptUserForInput(){
    Scanner in = new Scanner(System.console().reader());
    PrintWriter out = System.console().writer();
    out.print("Enter an integer:");
    // [...]
}

<强>正确:

public static void main(String[] args){
    promptUserForInput(System.console());
}
public static int promptUserForInput(Console io){
    Scanner in = new Scanner(io.reader());
    PrintWriter out = io.writer();
    out.print("Enter an integer:");
    // [...]
}

另一种情况是,该方法不需要与用户进行实时交互,它应返回交互方法将使用的String对象。

<强>不正确:

public static void main(String[] args){
    printMsg("bob", "tuna fish", "pickles", "rye");
}
public static String printMsg(String person, String type, String topping, String bread){
    System.out.printf("%1$s wants a %2$s sandwich with %3$s on %4$s bread%n",
            person, type, topping, bread);
}

<强>正确:

public static void main(String[] args){
    System.out.println(generateMsg("bob", "tuna fish", "pickles", "rye"));
}
public static String generateMsg(String person, String type, String topping, String bread){
    return String.format("%1$s wants a %2$s sandwich with %3$s on %4$s bread",
            person, type, topping, bread);
}

还有另外一项改进,我认为这更符合你的问题。您可以创建工厂类来为您实例化读者和作者:

public class InputFactory {
    public static InputStreamReader inStreamReader(InputStream in){
        return new InputStreamReader(in);
    }
    public static BufferedReader bufferedReader(InputStream in){
        return new BufferedReader(inStreamReader(in));
    }
    public static Scanner scanner(InputStream in){
        return new Scanner(inStreamReader(in));
    }
}

您可以根据需要添加任意数量的重载,因此您只需调用一个函数即可从任何输入流构建所需的输入流类型,甚至可以调用其他潜在的输入源(如文件)。要从BufferedReader获取InputStream,请致电InputFactory.bufferedReader(myInputStream)。虽然这仍然有点长,但eclipse中的自动完成功能可以帮助您快速输入,如果您只使用链式构造函数,它将无法做到。

答案 2 :(得分:0)

您可以将其设为static变量:

public static BufferedReader br = 
                       new BufferedReader(new InputStreamReader(System.in));

并相应地从每个相关方法访问它。

另外,请查看Scanner,这是一个实用程序类,可以更轻松地从用户那里读取输入。


正如@mariosangiorgio指出的那样,重要的是要考虑你的程序的哪些部分在做什么。您通常应该将代码拆分为逻辑上一致的块,这意味着将处理I / O的代码与处理核心逻辑的代码分开。因此,在设计任何严肃的应用程序时,static - 变量方法可能不是最好的方法,因为它可能在某些情况下破坏这种“代码分离”的哲学。然而,对于刚刚学习的人来说,它应该没有问题。

答案 3 :(得分:0)

这取决于你可以将它作为参数传递给你的方法,或者使它成为像

这样的类属性
public class Something {
     private BufferedReader reader = new BufferedReader(new InputStreamReaddoinger(System.in));
}

甚至将其设为公共静态变量,以便从其他类访问它

public static BufferedReader reader = new BufferedReader(new InputStreamReaddoinger(System.in));