我必须阅读年度最佳女演员和电影的文件。然后我使用该文件创建两个新文件,一个包含年份和女演员,另一个包含年份和电影。该文件是这样的:
2002 Nicole Kidman
The Hours
2003 Charlize Theron
Monster
2004 Hilary Swank
Million Dollar Baby
2005 Reese Witherspoon
Walk the Line
2006 Helen Mirren
The Queen
2007 Marion Cotillard
La Vie en Rose
2008 Kate Winslett
The Reader
2009 Sandra Bullock
The Blind Side
2010 Natalie Portman
The Black Swan
这是我到目前为止所做的:
import java.io.*;
import java.util.*;
public class BestActress{
public static void main(String[] args)throws FileNotFoundException{
Scanner input = new Scanner(System.in);
Scanner reader = new Scanner(new File("BestActress.txt"));
while(reader.hasNextLine()){
int yearNumber=reader.nextInt();
String text=reader.nextLine();
actressLine(text, yearNumber);
String textt=reader.nextLine();
movieLine(textt, yearNumber);
}
}
public static void actressLine(String text, int year)throws FileNotFoundException{
PrintWriter writer = new PrintWriter(new File("YearBestActresses.txt"));
Scanner data = new Scanner(text);
while (data.hasNext()){
String actressName=data.nextLine();
writer.println(year+actressName);
writer.close();
}
}
public static void movieLine(String textt, int year)throws FileNotFoundException{
PrintWriter writer = new PrintWriter(new File("YearBestActresMovies.txt"));
Scanner data=new Scanner(textt);
while(data.hasNext()){
String movieName=data.nextLine();
writer.println(year+" "+movieName);
writer.close();
}
}
}
创建的文件只说去年2010年Natalie Portman和2010年黑天鹅。
答案 0 :(得分:1)
你的程序中有几个问题。
首先,每个方法在收到一行文本时,会打开一个编写器,写入字符串的内容,然后关闭编写器。
默认情况下,打开编写器会清除文件。如果其中存在上一次迭代中写入的数据,则会将其删除。此外,开启和关闭都是繁重的操作,只应在需要时进行。
在进入main
的读取循环之前,您应该打开两个文件进行写入,并将writer对象作为参数传递给您的方法。然后在方法中,您只需将一行写入文件即可。
循环结束后关闭两个文件。所有这些最好用try with resources构造完成。
其他问题:
if ( reader.hasNextLine() )
。这确保了还有下一行。答案 1 :(得分:0)
这是因为每次编写新行时都会重新创建PrintWriter
个对象。每次执行此操作都会删除并重新创建文件。这就是为什么你只看到文件中的最后一个输出。
预先创建编写器并将它们传递给编写行的方法。 (当然,您还需要将close()
方法移动到外部方法中。)像这样:
编辑简化actressLine
和movieLine
,@ laune在评论中建议。
import java.io.*;
import java.util.*;
public class BestActress {
public static void main(String[] args)throws FileNotFoundException{
Scanner input = new Scanner(System.in);
Scanner reader = new Scanner(new File("BestActress.txt"));
PrintWriter writer1 = new PrintWriter(new File("YearBestActresses.txt"));
PrintWriter writer2 = new PrintWriter(new File("YearBestActresMovies.txt"));
while(reader.hasNextLine()){
int yearNumber=reader.nextInt();
String text=reader.nextLine();
actressLine(text, yearNumber, writer1);
String textt=reader.nextLine();
movieLine(textt, yearNumber, writer2);
}
writer1.close();
writer2.close();
}
public static void actressLine(String text, int year, PrintWriter writer) {
writer.println(year + text);
}
public static void movieLine(String text, int year, PrintWriter writer ) {
writer.println(year + " " + text);
}
}