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;
            }
        }
    }
}

Как видите, я использую int 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 записывается в текстовый файл, но вместо этого я получаю это: Результат запуска программы

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


person Mr Chasi    schedule 07.01.2015    source источник
comment
I also have this code это ошибка копирования и вставки? Он содержит тот же код, что и выше.   -  person Tom    schedule 07.01.2015
comment
Какой jdk вы используете? В стандартном java нет метода BufferedWriter.write(String). Ваш код действительно компилируется?   -  person Dima    schedule 07.01.2015
comment
Кстати: кажется, что convertedSalary всегда будет 0, потому что вы не присваиваете ему возвращаемое значение Integer.parseInt(inputSalary);. И нет переменной userSalary, но inputSalary, кажется, записывается в файл, потому что он содержит 2500 в качестве третьей строки (то есть bwriter.write(inputSalary);).   -  person Tom    schedule 07.01.2015
comment
@Дима Конечно есть. Он унаследован от Writer.   -  person Jagger    schedule 07.01.2015
comment
@Дима jdk7. Да компилируется   -  person Mr Chasi    schedule 07.01.2015
comment
@ Том, о, глупый я! Ха-ха, я этого не заметил. Но как мне убедиться, что вычет выгоды написан?   -  person Mr Chasi    schedule 07.01.2015
comment
@MrChasi Не пишите как int ;). Смотрите ответ Джаггерса.   -  person Tom    schedule 07.01.2015


Ответы (5)


Ознакомьтесь с API. .

public void write(int c)
   throws IOException

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

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

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

person Jagger    schedule 07.01.2015
comment
Возможно, поэтому вместо числа написано одинарная кавычка. - person Ascalonian; 07.01.2015
comment
@MrChasi Также похоже, что вы предпочитаете использовать PrintWriter, в котором есть println методов, которые вам подойдут. - person Jagger; 07.01.2015
comment
Хорошо, это здорово, спасибо за вашу помощь. Я новичок в Java, поэтому не знал об этом. Одинаково ли это для всех числовых переменных? Включая двойной и длинный? - person Mr Chasi; 07.01.2015
comment
@MrChasi проверьте API для этого ответа :-) - person Ascalonian; 07.01.2015
comment
@MrChasi Посмотрите на PrintWriter API, это значительно упростит ваш код. - person Jagger; 07.01.2015
comment
Спасибо, парни! Это большая помощь. Не забудьте проголосовать за этот полезный вопрос ;) - person Mr Chasi; 07.01.2015

В вашем коде есть две основные проблемы.

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

Опять же, вы также не записываете convertedSalary в файл.

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

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

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

person RealSkeptic    schedule 07.01.2015

Как указано в других ответах, ваша проблема заключается в вызове 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 для обработки BufferedWriter . Он обработает ресурс и закроет его для вас. Нет необходимости делать это вручную.

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

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

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

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

Integer.parseInt(inputSalary);

to:

convertedSalary = Integer.parseInt(inputSalary);

сделать это.

person Tom    schedule 07.01.2015

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

person ControlAltDel    schedule 07.01.2015
comment
Хорошо, если myNumber является моим предопределенным целым числом? - person Mr Chasi; 07.01.2015
comment
@MrChasi да, в зависимости от того, что вы подразумеваете под предопределенным - person ControlAltDel; 07.01.2015

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

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

Ваш код должен выглядеть так:

convertInt = Integer.parseInt (inputSalary);

person david    schedule 07.01.2015