2013-04-29 3 views
1

У меня есть файл вызов «CI.txt»Является ли мой текст для записи неправильным?

Внутри файла информация:

Mr Abc;ABC;abc123;Abc Road;428428;VISA;2222111144442222 
Mr Efg;EFG;efg123;Efg Road;424213;MASTERCARD;4444555566667777 
Mr Lmn;LMN;lmn123;Lmn Road;492482;VISA;9999000011112222 

Вот мой код, он работает очень хорошо, но проблема ..

for (Customer ci : custList){ 
//Compares the username and userpassword 
//If correct, set new card number and card type.. 
if (inputUser.equals(ci.getUserName()) && inputPass.equals(ci.getPassword())) { 
    ci.setCardNo(newCardNo); 
    ci.setCardType(newCardType); 
} 

    String text = ci.getRealName() + ";" + ci.getUserName() + ";" + ci.getPassword() + ";" + ci.getContact() + ";" + ci.getcardType() + ";" + ci.getcardNo(); 
    try { 
     File fileCI = new File("CI.txt"); 
     FileWriter fileWriter = new FileWriter(fileCI); 
     BufferedWriter bw = new BufferedWriter(fileWriter); 
     bw.write(text); 
     bw.close(); 
    } 
    catch (FileNotFoundException e) { 
    System.out.println("File not found"); 
    } 
    catch (IOException e) { 
    System.out.println("Unable to write to file"); 
    }          
} 

Мой выход будет иметь только записи мистера Лемна. Нет записи о г-н Абк, который я обновил тип и номер новой кредитной карты. Почему это происходит? Я сделал System.out.println(text) в заявлении try, и все было распечатано правильно. Кто-нибудь может помочь?

+2

Вы пишете незашифрованный номер кредитной карты в текстовый файл? – LittleBobbyTables

+2

@LittleBobbyTables Глядя на номера кредитных карт, я думаю, что OP изучает обработку файлов, и это всего лишь тестовый проект. – Apurv

+0

Да, его тестовый проект. Ничего больше. Почему ты такой серьезный? – John

ответ

1

Проблема в том, что вы пишете файл внутри цикла for. Это означает, что с каждым циклом файл перезаписывается новыми данными. В конце показаны только последние данные. Вам нужно переместить код for-loop внутри кода записи файла, например:

try 
     { 
      File fileCI = new File ("CI.txt"); 
      FileWriter fileWriter = new FileWriter (fileCI); 
      BufferedWriter bw = new BufferedWriter (fileWriter); 

      for (Customer ci : custList) 
      { 
       if (inputUser.equals (ci.getUserName()) 
         && inputPass.equals (ci.getPassword())) 
       { 
        ci.setCardNo (newCardNo); 
        ci.setCardType (newCardType); 
       } 
       String text = ci.getRealName() + ";" + ci.getUserName() + ";" 
         + ci.getPassword() + ";" + ci.getContact() + ";" 
         + ci.getcardType() + ";" + ci.getcardNo(); 

       bw.write (text); 

      } 
bw.close(); 
fileWriter.close(); 

     } 
     catch (FileNotFoundException e) 
     { 
      System.out.println ("File not found"); 
     } 
     catch (IOException e) 
     { 
      System.out.println ("Unable to write to file"); 
     } 
+0

Совет. Лучше закрыть BufferedWriter и FileWriter в блоке finally. –

+0

Спасибо за помощь ур. Я понимаю свою ошибку сейчас – John

+0

Совет: не нужно улавливать несколько исключений отдельно. На самом деле это хуже, чем не поймать что-либо, потому что теперь некоторые исключения будут проглатываться, весь метод возвращается успешно, в то время как другие вызовут метод выбросить исключение. Это типичный пример исключения-обработки-антипаттерн. –

2

Вы строите текст и создать новый файл для каждого клиента, поэтому последний перекрывает все остальные:

for (Customer ci : custList){ 
    //... 
    String text = ci.getRealName() + ";" + ci.getUserName() + ";" + ci.getPassword() + ";" +  ci.getContact() + ";" + ci.getcardType() + ";" + ci.getcardNo(); 
    try { 
    File fileCI = new File("CI.txt"); 
    FileWriter fileWriter = new FileWriter(fileCI); 
    //... 

} 

Вам нужно создать файл вне цикла, а затем построить содержание и заполнить файл данными и, наконец, закрыть файл.

+0

Спасибо, я получил то, что вы сказали – John

5

Вы открываете и закрываете файл на каждой итерации цикла for. Открытие файла по умолчанию стирает все в нем. Вы должны открыть файл перед запуском for-loop и закрыть его только после этого.

+0

спасибо за помощь!Такая глупая ошибка, которую я сделал – John

2

Проблема в коде, что каждый для цикла итерации воссоздает файл и переписывает его содержимое

+0

, я понял это сейчас. спасибо за помощь – John

0

Вы работаете каждый клиент в цикле.

for (Customer ci : custList){ 

Каждый раз, когда вы запускаете цикл, вы создаете новый файл с именем CI.txt

File fileCI = new File("CI.txt"); 

Поскольку вы создаете файл с нуля для каждого клиента, только последний клиент останется. Откройте файл для добавления.

0

Использование:

public FileWriter(File file,boolean append) 
     throws IOException 

Он говорит, добавить - если это правда, то байты будут записаны в конец файла, а не в начале

Вот является API doc.

Смежные вопросы