在java中的类中将输出写入文本文件?

时间:2015-02-21 00:05:45

标签: java output printwriter

我遇到了将输出写入文本文件的问题。我不太确定如何去做。我试图通过写一些东西来编写输出 - Writer是printWriter类的一个对象:

这大幅缩减,但归结为。

Writer.println(sortRI());

我不能将该语句写为方法本身 - 并且我正在尝试写入输出文件的此类中的所有方法都是void。

所以我的问题是如何从我的方法中将输出写入文本文件是无效的 - 他们通过一些打印语句打印出他们的结果。有没有办法可以实例化一个编写器并使用编写器来打印方法。其中一种方法的示例如下所示:

ZipCodeLocation [] data2 = new ZipCodeLocation [];

public class Processor
{
  ...

  public void readData(){

  ...

  }

public void findSpringfield()
{
    System.out.println("------------------------------------------------------------------------");
    System.out.println("SPRINGFIELD ZIP CODES");

    for(int i=0; i < data2.length ; i++)
    {
        if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD"))
        {
          System.out.println(data2[i].getzipCode().replaceAll("\"",""));  //Prints out zipCodes that have Springfield in them
        }
    }
}

如何在控制台中将消息打印到System.out,而不是让它将方法的输出写入文本文件?

4 个答案:

答案 0 :(得分:3)

您提出了一个非常好的问题,因为它描述了所有软件共有的设计考虑因素的实例。

这里的主题是业务逻辑与接口的分离。更一般地说,它是在面向对象程序中讨论明确定义的职责。

理想情况下,您的业务逻辑将返回一个数据结构,这将允许调用者对结果执行任何所需操作,例如将其写入文件或将其显示在网页中。

public List<String> findSpringfield()
{
    List<String> results = new ArrayList<String>();
    for(int i=0; i < data2.length ; i++) {
        if(data2[i].getpostalCity().contains("SPRINGFIELD")) {
            results.add(data2[i].getzipCode().replaceAll("\"",""));  //Collects zipCodes that have Springfield in them
        }
    }
    return results;
}

如果这不是一个选项,那么绝对最低限度,您可能希望修改方法以接受 PrintStream 参数。

public void findSpringfield(PrintStream out)
{
    out.println("------------------------------------------------------------------------");
    out.println("SPRINGFIELD ZIP CODES");

    for(int i=0; i < data2.length ; i++) {
        if(data2[i].getpostalCity().contains("SPRINGFIELD")) {
            out.println(data2[i].getzipCode().replaceAll("\"",""));  //Prints out zipCodes that have Springfield in them
        }
    }
}

这样你可以称之为

findSpringfield(System.out);

或者你可以传递一个与System.out不同的PrintStream实例,它指向你自己的文件。

最后,如果以上两个选项都不适合你,我会告诉你如何做一些非常糟糕的练习。您可以将System.out重定向到您选择的文件。正如我所说,这是一个可怕的想法;仅在非常有限的范围内使用它作为最后的手段。

System.out = new PrintStream("somePath/someFile.txt");

此外,作为设计改进,请考虑概括您的 findSpringfield 方法以接受 String postalCity 参数,以便您可以重复使用它来查找其他城市的邮政编码。

public List<String> zipsByCity(String postalCity)
{
    // use postalCity to filter results, rather than hardcoded "SPRINGFIELD" string
}

答案 1 :(得分:1)

尝试将Writer作为参数发送到方法,而不是在方法内打印到标准输出,打印到编写器:

public void findSpringfield(FileWriter writer)
{
     writer.println("---------------------------------------------------                                               ---------------------");
          writer.println("SPRINGFIELD ZIP CODES");

 for(int i=0; i < data2.length ; i++)
 {
    if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD"))
    {
         writer.println(data2[i].getzipCode().replaceAll("\"",""));               //Prints out zipCodes that have Springfield in them

   }

  }

答案 2 :(得分:1)

 File file = new File("out.txt");
      BufferedWriter output = new BufferedWriter(new FileWriter(file));
       for(int i=0; i < data2.length ; i++){
          if(data2[i].getpostalCity().replaceAll("\"","").contains("SPRINGFIELD")){
                output.write(data2[i].getzipCode().replaceAll("\"",""));
           }        
         }
      output.close();

这应该有效,但它需要一个try-catch块或一个抛出声明

答案 3 :(得分:0)

现在看来,你的方法中的每一个方法都必须实现对文件的写入或将文件编写器作为参数。这两种方法都有效,但效率很低。

根据我对你的问题的理解,你将会有更多名为findXYZ的虚空方法。

为什么不写write方法void findTown(String townName)? 我可能错了,或者对你想要达到的目标有错误的印象,但如果我是对的,那么你的方向是错误的。