2015-03-02 51 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. 保留一個標誌(布爾值),告訴您如果您正在閱讀年份和女演員行或電影行,並且在每一輪中只讀取一行。如果標誌告訴你它是第一個,那麼把它保存在一個變量中。如果是第二個,請寫下他們兩個。請記住在每行之後更改標誌。
相關問題