Writing output to text file in a class in java?
我有一个将输出写入文本文件的问题。我不太确定该怎么做。我试图通过沿着-writer行编写一些内容来编写输出,这是printwriter类的一个对象:
这是大幅削减,但归根结底是。
1 |
我不能将该语句作为方法本身来编写——我试图为其编写输出文件的此类中的所有方法都是无效的。
所以我的问题是,如何从无效的方法中将输出写入文本文件——它们通过几个打印语句打印出结果。有没有一种方法可以实例化一个编写器并使用编写器打印方法?其中一种方法的示例如下所示:
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 |
或者您可以将它传递给与System.out不同的printstream实例,后者指向您自己的文件。
最后,如果以上两个选项都不适用于您,我将告诉您如何做一些非常糟糕的做法。您可以将System.out重定向到您选择的文件。正如我所说,这是一个可怕的想法;在非常有限的范围内,将它作为最后的手段。
1 |
此外,作为设计改进,考虑将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)?我可能是错的,或者对你想要达到的目标有错误的印象,但是如果我是对的,那么你就走错了方向。