2012-05-02 2 views
1

есть текстовый файл, который мы читаем из него, тогда мы хотим написать его после некоторых небольших изменений в текстовом файле, но вопрос в том, почему он имеет разные результаты, если мы используем System.out.println и когда мы используем pwPaperAuthor.println?Ошибка строки Tokenizing

код как:

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 { 

     } 
    } 
} 

Ouput

если

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

если

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

Основное различие между использованием классов ... Стрим-классы и классы ... Reader/... Writer - это то, что поток имеет дело с необработанными байтами, а последние - с символами. Для работы с символами требуется указать конкретную «кодировку символов»; Одним из таких кодировок является Unicode в его различных формах (UTF-8, UTF-16, ...). –

ответ

0

Там нет никакого способа, вы можете прочитать файл и записать его в тот же цикл, основанный API. Вам нужно будет создать новый файл и скопировать все то же самое, добавив новое. То, что вы делаете сейчас, имеет непредсказуемое поведение. Если вы все еще хотите читать и писать одновременно, вам придется использовать RandomAccessFile, но это довольно сложно.

+0

любое решение для исправления этой проблемы другим простым способом? – lonesome

+1

То, что каждый делает и считает легким, - это первое предложение: создать новый файл temp, после чего удалить старый и переименовать. –