2015-01-07 5 views
1

Я делаю простую учебную программу, в которой пользователь вводит некоторые данные, затем эти данные записываются в текстовый файл, затем считывается текстовый файл и отображаются данные. Однако не все данные записываются в текстовый файл. Пожалуйста, просмотрите следующее:BufferedWriter не пишет ВСЕ информацию

Это мой код:

package chasi.fecalMatter.ExcrementalProgram; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

import javax.swing.JOptionPane; 

public class RedundantExcrement { 

    static String inputName = JOptionPane.showInputDialog("Please input your FULL name:"); 
    static String inputUsername = JOptionPane.showInputDialog("Please input your desired Username:"); 
    static String inputJobTitle = JOptionPane.showInputDialog("Please input your Job title:"); 
    static String inputSalary = JOptionPane.showInputDialog("Please input your monthly salary:"); 

    static int convertedSalary = 0; /*Convert salary from String to int*/ 
    static int benefitDeduction = 0; 

    static String empFileName = inputUsername+"INFO"; 
    static BufferedWriter bwriter = null; 

    public static void main (String[] args) throws IOException { 
     //Catch NumberFormatException. 
     try { 
      Integer.parseInt(inputSalary); 
     } catch (NumberFormatException nfEx) { 
      JOptionPane.showMessageDialog(null, "Please ensure that " + 
        "your salary is entered in NUMERIC form.", "ERROR!", 2); 
      return; 
     } 

     //Specify instructions as regard salary -to- Benefit deduction ratio 
     if (convertedSalary >= 3500) { 
      benefitDeduction = 300; 
     } else { 
      benefitDeduction = 180; 
     } 

    try { /*Catches IOException AND NullPointerException*/ 
      FileWriter fwriter = new FileWriter(empFileName); 
      bwriter = new BufferedWriter(fwriter); 

      bwriter.write(inputName); 
      bwriter.newLine(); 
      bwriter.write(inputJobTitle); 
      bwriter.newLine(); 
      bwriter.write(inputSalary); 
      bwriter.newLine(); 
      bwriter.write(benefitDeduction); 
      bwriter.newLine(); 
      bwriter.write("----------"); 
      bwriter.newLine();    
     } catch (IOException | NullPointerException ionpEx) { 
      JOptionPane.showMessageDialog(null, "An ERROR has occured", "ERROR!", 2); 
      return; 
     } finally { /*CLOSE the writer*/     
      try{ 
       if (bwriter != null) { 
        bwriter.close(); 
       } 
      } catch (IOException ioEx2) { 
       JOptionPane.showMessageDialog(null, "ERROR!"); 
       return; 
      } 
     } 
    } 
} 

Как вы можете видеть, я использую ИНТ convertedSalary для преобразования пользователя, введенный inputSalary из строки в число. В моем методе я использую

try { 
    Integer.parseInt(inputSalary); 
} catch (NumberFormatException nfEx) { 
    JOptionPane.showMessageDialog(null, "Please ensure that " + 
      "your salary is entered in NUMERIC form.", "ERROR!", 2); 
    return; 
} 

Для того, чтобы скрыть его. Позднее (предполагается) будет написан BufferedWriter.

У меня есть этот код:

try { 
    Integer.parseInt(inputSalary); 
} catch (NumberFormatException nfEx) { 
    JOptionPane.showMessageDialog(null, "Please ensure that " + 
       "your salary is entered in NUMERIC form.", "ERROR!", 2); 
    return; 
} 

Для того, чтобы изменить значение моего benefitDeduction в зависимости от величины заработной платы пользователя.

ОДНАКО, то benefitDeduction записывается в текстовый файл, но вместо этого, я получаю это: The result of running the program

Спасибо если вы можете помочь!

+1

'У меня также есть этот код' это скопируйте & вставьте ошибку? Он содержит тот же код, что и выше. – Tom

+0

Какой jdk вы используете? В стандартном java нет метода 'BufferedWriter.write (String)'. Действительно ли ваш код компилируется? – Dima

+1

Btw: кажется, что 'convertSalary' всегда будет' 0', потому что вы не назначаете возвращаемое значение 'Integer.parseInt (inputSalary);' ему. И нет переменной 'userSalary', но' inputSalary', похоже, записывается в файл, потому что в нем содержится '2500' в качестве третьей строки (это' bwriter.write (inputSalary); '). – Tom

ответ

4

Посмотрите на API.

public void write(int c) 
    throws IOException 

Пишет один символ. Символ, который должен быть записан, содержится в 16 младших битов заданного целочисленного значения; 16 старших разрядов бит игнорируются.

Это означает, что int на самом деле является символом char и будет преобразован в соответствии с таблицей Unicode/ASCII.

Чтобы написать целое значение с помощью bwriter.writer(String.valueOf(benefitDeduction));

+2

Может быть, поэтому есть одна цитата вместо номера, написанного – Ascalonian

+0

О, ладно. Só, как мне обойти это? –

+0

@MrChasi См. Мой обновленный вопрос. – Jagger

0

Вашей проблемы заключается в том, что когда вы пишете ваши номера, эти значения записываются в виде двоичных чисел, а не как текст чисел. Вы можете исправить это, выполнив writer.write("" + myNumber);

+0

Хорошо, с «myNumber», являющимся предопределенным int моим? –

+0

@MrChasi да, в зависимости от того, что вы подразумеваете под предопределенным – ControlAltDel

4

Существуют две основные проблемы с вашим кодом.

Во-первых, вы фактически не назначаете значение из своего ParseInt переменной convertedSalary. Следовательно, он всегда будет равен нулю.

Затем вы также не записываете convertedSalary в файл.

Во-вторых, я думаю, вы вводите в заблуждение между BufferedWriter.write(int) и PrintWriter.print(int). BufferedWriter напечатает символ, представленный этим целым числом, если он находится между 0 и 65535 (или все, что есть в его нижних двух байтах, если это не так).

Итак, если ваше целое число составляет, например, 65, то вы напечатаете символ A, значение которого равно 65 в Юникоде.

Возможно, вы должны использовать PrintWriter, а не BufferedWriter. Или преобразуйте числа в строки, как предложили другие ответы.

1

Как указывалось другими ответами, ваша проблема заключается в вызове write(int). Но вместо того, чтобы беспокоиться об конверсии, вы также можете использовать StringBuilder, чтобы создать свой текст первым и написать его одним звонком write(String). Таким образом, вам не придется беспокоиться о типе benefitDeduction:

final String inputName = "Tom"; 
final String inputJobTitle = "Developer"; 
final String inputSalary = "1337"; 
final int benefitDeduction = 180; 

try(final BufferedWriter bwriter = new BufferedWriter(new FileWriter("blub.txt"))) { 
    final StringBuilder builder = new StringBuilder(inputName); 
    builder.append("\n").append(inputJobTitle); 
    builder.append("\n").append(inputSalary); 
    builder.append("\n").append(benefitDeduction); 
    builder.append("\n----------\n"); 
    bwriter.write(builder.toString()); 
} catch (IOException | NullPointerException ex) { 
    JOptionPane.showMessageDialog(null, "An ERROR has occured", "ERROR!", 2); 
    return; 
} 

Также обратите внимание, что я использовал try-with-resources statement для обработки BufferedWriter. Он будет обрабатывать ресурс и закрывать его для вас. Не нужно делать это вручную.

Приведенный выше код записать следующие данные в файл "blub.txt":

Tom 
Developer 
1337 
180 
---------- 

И, как я уже писал в комментариях, вы не назначая новое значение переменной convertedSalary.

Изменить строку:

Integer.parseInt(inputSalary); 

к:

convertedSalary = Integer.parseInt(inputSalary); 

, чтобы сделать это.

0

Integer.parseInt (inputSalary) // возвращает целое число

Цитирование из JDK: Integer.parseInt(); = "Разбирает строковый аргумент как знаковое десятичное целое число. Символы в строке должны быть десятичными цифрами, за исключением того, что первый символ может быть знаком ASCII минус '-' ('\ u002D'), чтобы указать отрицательное значение или ASCII плюс знак '+' ('\ u002B') для указания положительного значения. Возвращаемое целочисленное значение возвращается точно так же, как если бы аргумент и radix 10 были указаны как аргументы parseInt (java.lang.String, int) метод «.

Ваш код должен прочитать:

convertedInt = Integer.parseInt (inputSalary);

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