【问题标题】:BufferedWriter not writing ALL the informationBufferedWriter 没有写入所有信息
【发布时间】:2015-01-07 19:11:10
【问题描述】:

我正在制作一个简单的教程程序,其中用户输入一些数据,然后将数据写入文本文件,然后读取文本文件并显示数据。但是,并非所有数据都写入文本文件。请查看以下内容:

这是我的代码:

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 被写入文本文件,但我得到了这个:

如果您能提供帮助,谢谢!

【问题讨论】:

  • I also have this code 这是复制和粘贴错误吗?它包含与上面相同的代码。
  • 你用的是哪个jdk?标准 java 中没有 BufferedWriter.write(String) 方法。你的代码真的可以编译吗?
  • 顺便说一句:似乎convertedSalary 将始终为0,因为您没有将Integer.parseInt(inputSalary); 的返回值分配给它。并且没有变量userSalary,但inputSalary似乎被写入文件,因为它包含2500作为第三行(即bwriter.write(inputSalary);)。
  • @Dima 当然有。继承自Writer
  • @Dima jdk7。是的,它确实编译

标签: java printwriter bufferedwriter writer


【解决方案1】:

看看API

public void write(int c)
   throws IOException

写入单个字符。要写入的字符包含在 给定整数值的 16 个低位; 16位高阶 位被忽略。

这意味着int实际上是一个char,将根据Unicode/ASCII表进行转换。

要写入整数值,请使用bwriter.writer(String.valueOf(benefitDeduction));

【讨论】:

  • 这可能就是为什么写单引号而不是数字
  • @MrChasi 看起来你更愿意使用 PrintWriter ,它有很适合你的 println 方法。
  • 好的,太好了,感谢您的帮助。我是java新手,所以我不知道这一点。所有数字变量都一样吗?包括双和长?
  • @MrChasi 查看该答案的 API :-)
  • @MrChasi 查看PrintWriter API,它将大大简化您的代码。
【解决方案2】:

您的代码有两个主要问题。

首先,您实际上并没有将 ParseInt 中的值分配给您的 convertedSalary 变量。因此,它将始终为零。

同样,您也没有将convertedSalary 写入文件。

其次,我认为您混淆了BufferedWriter.write(int)PrintWriter.print(int)BufferedWriter 将打印此整数表示的字符,如果它介于 065535 之间(或者如果不是,则在其低两个字节中的任何内容)。

所以,如果你的整数是,例如,65,你将打印的是字符A,它的值在Unicode中是65

所以也许你应该在那里使用PrintWriter 而不是BufferedWriter。或者按照其他答案的建议将数字转换为字符串。

【讨论】:

    【解决方案3】:

    正如其他答案所指出的,您的问题是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);
    

    这样做。

    【讨论】:

      【解决方案4】:

      您的问题是,当您编写数字时,这些值被写为二进制数字而不是文本数字。你可以通过writer.write("" + myNumber);来解决这个问题

      【讨论】:

      • 好的,“myNumber”是我的预定义整数?
      • @MrChasi 是的,这取决于您预定义的含义
      【解决方案5】:

      Integer.parseInt(inputSalary) //返回一个整数

      引用JDK: Integer.parseInt(); = "将字符串参数解析为带符号的十进制整数。字符串中的字符必须都是十进制数字,除了第一个字符可以是ASCII减号'-'('\u002D')来表示负值或ASCII 加号 '+' ('\u002B') 表示正值。返回结果整数值,就好像参数和基数 10 作为参数提供给 parseInt(java.lang.String, int)方法。”

      您的代码应为:

      convertedInt = Integer.parseInt(inputSalary);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多