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

Writing output to text file in a class in java?

我在将输出写入文本文件时遇到问题。我不太确定如何去做。我试图通过写一些东西来写输出 - Writer is an object of the printWriter class:

这已被大幅削减,但归结为。

Writer.println(sortRI());

我不能将该语句写成方法本身——并且此 class 我试图写入输出文件的所有方法都是无效的。

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

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,而是如何让它将方法的输出写入文本文件?

尝试将 Writer 作为方法的参数发送,而不是在方法内部打印到标准输出,而是打印到 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

   }

  }
 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 块或 throws 声明

现在看起来,您的每个方法都必须实现写入文件或获取文件编写器作为参数。这两个都可以,但效率很低。

据我从你的问题中了解到,你将拥有更多名为 findXYZ 的无效方法。

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

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

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

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

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
}