2012-05-02 12 views
1

テキストファイルがありますが、テキストファイルを少し変更してから書きますが、 System.out.printlnを使用すると結果が異なるのはなぜですか? pwPaperAuthor.printlnを使用していますか?文字列トークン化エラーが発生しました

コードは次のようである:

package cn.com.author; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.StringTokenizer; 

//input:"IndexAuthors1997-2010.txt" 
//output:"PaperAuthor1997-2010.txt" 
public class PaperAuthors { 

    public static void main(String[] args) { 

     BufferedReader brIndexAuthors = null; 

     BufferedWriter bw = null; 

     PrintWriter pwPaperAuthor = null; 

     try { 
      brIndexAuthors = new BufferedReader(new InputStreamReader(
        new FileInputStream("IndexAuthors1997-2010.txt"))); 
      bw = new BufferedWriter(new FileWriter(new File(
        "PaperAuthor1997-2010.txt"))); 
      pwPaperAuthor = new PrintWriter(new OutputStreamWriter(
        new FileOutputStream("PaperAuthor1997-2010.txt"))); 
      /* 
      * line = brIndexAuthors.readLine(); 
      * 
      * element=line.split("@"); String author=null; StringTokenizer st = 
      * new StringTokenizer(element[1],","); while(st.hasMoreTokens()) { 
      * author = st.nextToken(); pwPaperAuthor.println(element[0] + "+" + 
      * author); //~i++; } 
      */ 
      String line = null; 
      String element[] = new String[3]; 
      String author = null; 
      int i = 0; 
      while ((line = brIndexAuthors.readLine()) != null) { 
       element = line.split("#@"); 
       StringTokenizer st = new StringTokenizer(element[1], ","); 

       int num=st.countTokens(); 

       while (st.hasMoreTokens()) { 
        author = st.nextToken(); 
        pwPaperAuthor.println(element[0]+"@"+author+"@"+element[2]); 
        bw.write(element[0] + "@" + author + "@" + element[2]); 
        bw.newLine(); 
        System.out.println(element[0]+"@"+author+"@"+element[2]); 
        i++; 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 

     } 
    } 
} 

出力リレー

System.out.println(element[0]+"@"+author+"@"+element[2]);------>[email protected] Ern 

場合は、ファイルを読み取り、それに書き込むことができる方法はありません

pwPaperAuthor.println(element[0]+"@"+author+"@"+element[2]); 
         ----->[email protected] [email protected] 
+0

ストリームクラスと...リーダー/ ...ライタークラスの主な違いは、ストリームが生のバイトを処理し、後者が文字を処理することです。文字を扱うには、特定の "文字エンコーディング"を指定する必要があります。さまざまな形のUnicode(UTF-8、UTF-16など)は、そのようなエンコーディングの1つです。 –

答えて

0

場合同じループは、ベースのAPIです。新しいファイルを作成し、同じものをすべてコピーして、新しいものを追加する必要があります。あなたが今やっていることは、予測できない振る舞いをしています。それでも、同時に読み書きをしたい場合は、RandomAccessFileを使用する必要がありますが、これはかなり複雑です。

+0

他の簡単な方法でこの問題を解決する方法はありますか? – lonesome

+1

誰もがやっていることは簡単に見つけます:新しい一時ファイルを作成します。古いファイルを削除して名前を変更すると完了します。 –

関連する問題