如何读取文件并使用这些文件创建两个新文件?
问题描述:
我必须阅读年度最佳女演员和电影文件。然后我使用该文件创建两个新文件,一个是年份和女演员,另一个是年份和电影。该文件是这样的:如何读取文件并使用这些文件创建两个新文件?
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娜塔莉·波特曼和2010年的黑天鹅。
答
这是因为您每次编写新行时都要重新创建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);
}
}
答
你的程序有几个问题。
首先,每种方法,当它接收到一行文本时,打开一个作者,写入字符串的内容,并关闭作者。
打开一个作家,默认情况下,清除该文件。如果在之前的迭代中写入了数据,它将被删除。此外,开幕式和闭幕式都是繁重的操作,只有在需要时才可以进行。
您应该在进入main
的读取循环之前打开两个文件进行写入,然后将作者对象作为参数传递给您的方法。然后在方法中,您可以将一行写入文件。
循环结束后关闭两个文件。所有这些最好用try with resources结构完成。
其他问题:
- 你并不真的需要创建您传递给方法的数据项的扫描仪。你可以直接写入作者。
- 您的主程序中的读循环是危险的。它检查是否有下一行,然后读取两行。如果只有一条下一行呢?有两个主要的策略来处理这个问题:
- 把第二次阅读
if (reader.hasNextLine())
。这确保了还有下一行。 - 保留一个标志(布尔值),告诉您如果您正在阅读年份和女演员行或电影行,并且在每一轮中只读取一行。如果标志告诉你它是第一个,那么把它保存在一个变量中。如果是第二个,请写下他们两个。请记住在每行之后更改标志。
- 把第二次阅读
我不认为扫描仪和while循环的方法actressLine和movieLine是有用的:省略。只要writer.println就足够了。 – laune 2015-03-02 17:59:44
好点,@laune,我已经按照你的建议简化了方法。 – jas 2015-03-02 18:08:38