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

Writing output to text file in a class in java?

本问题已经有最佳答案,请猛点这里访问。

我有一个将输出写入文本文件的问题。我不太确定该怎么做。我试图通过沿着-writer行编写一些内容来编写输出,这是printwriter类的一个对象:

这是大幅削减,但归根结底是。

1
Writer.println(sortRI());

我不能将该语句作为方法本身来编写——我试图为其编写输出文件的此类中的所有方法都是无效的。

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

zipcodelocation[]data2=新的zipcodelocation[];

1
2
3
4
5
6
7
8
9
public class Processor
{
  ...

  public void readData(){

  ...

  }
1
2
3
4
5
6
7
8
9
10
11
12
13
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?


您已经问了一个非常好的问题,因为它描述了所有软件通用的设计考虑的一个实例。

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

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

1
2
3
4
5
6
7
8
9
10
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参数。

1
2
3
4
5
6
7
8
9
10
11
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
        }
    }
}

你可以这样称呼它

1
findSpringfield(System.out);

或者您可以将它传递给与System.out不同的printstream实例,后者指向您自己的文件。

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

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

此外,作为设计改进,考虑将findspringfield方法归纳为接受字符串postalcity参数,以便可以重用它来查找其他城市的邮政编码。

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


1
2
3
4
5
6
7
8
 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块或throw声明


尝试将writer作为参数发送到方法,而不是打印到方法内部的标准输出,而是打印到writer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

   }

  }

现在看来,每个方法都必须实现对文件的写入或将文件编写器作为参数。这两种方法都会奏效,但都是非常无用的。

根据我从你的问题中了解到的,你将拥有更多的叫做findxyz的无效方法。

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