如何读取文件并使用这些文件创建两个新文件?

时间:2015-03-02 17:44:31

标签: java

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

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

2 个答案:

答案 0 :(得分:1)

你的程序中有几个问题。

首先,每个方法在收到一行文本时,会打开一个编写器,写入字符串的内容,然后关闭编写器。

默认情况下,打开编写器会清除文件。如果其中存在上一次迭代中写入的数据,则会将其删除。此外,开启和关闭都是繁重的操作,只应在需要时进行。

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

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

其他问题:

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

答案 1 :(得分: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);
    }
}
相关问题