在 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
}
我在将输出写入文本文件时遇到问题。我不太确定如何去做。我试图通过写一些东西来写输出 - 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
}