2015-03-02 62 views
0

我必须阅读年度最佳女演员和电影文件。然后我使用该文件创建两个新文件,一个是年份和女演员,另一个是年份和电影。该文件是这样的:如何读取文件并使用这些文件创建两个新文件?

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年的黑天鹅。

回答

0

这是因为您每次编写新行时都要重新创建PrintWriter对象。每次你这样做,它都会删除并重新创建文件。这就是为什么你只能看到文件中的最后一个输出。

事先创建编写器并将它们传递到写入行的方法中。 (然后,当然,你需要移动close()方法到外的方法为好。)事情是这样的:

编辑:简体actressLinemovieLine为@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); 
    } 
} 
+0

我不认为扫描仪和while循环的方法actressLine和movieLine是有用的:省略。只要writer.println就足够了。 – laune 2015-03-02 17:59:44

+0

好点,@laune,我已经按照你的建议简化了方法。 – jas 2015-03-02 18:08:38

1

你的程序有几个问题。

首先,每种方法,当它接收到一行文本时,打开一个作者,写入字符串的内容,并关闭作者。

打开一个作家,默认情况下,清除该文件。如果在之前的迭代中写入了数据,它将被删除。此外,开幕式和闭幕式都是繁重的操作,只有在需要时才可以进行。

您应该在进入main的读取循环之前打开两个文件进行写入,然后将作者对象作为参数传递给您的方法。然后在方法中,您可以将一行写入文件。

循环结束后关闭两个文件。所有这些最好用try with resources结构完成。

其他问题:

  • 你并不真的需要创建您传递给方法的数据项的扫描仪。你可以直接写入作者。
  • 您的主程序中的读循环是危险的。它检查是否有下一行,然后读取两行。如果只有一条下一行呢?有两个主要的策略来处理这个问题:
    1. 把第二次阅读if (reader.hasNextLine())。这确保了还有下一行。
    2. 保留一个标志(布尔值),告诉您如果您正在阅读年份和女演员行或电影行,并且在每一轮中只读取一行。如果标志告诉你它是第一个,那么把它保存在一个变量中。如果是第二个,请写下他们两个。请记住在每行之后更改标志。
相关问题