代码之家  ›  专栏  ›  技术社区  ›  Samboni

Java FileWriter输出问号

  •  0
  • Samboni  · 技术社区  · 10 年前

    我一直找不到原因。我在这段代码中遇到的唯一问题是 FileWriter 尝试将新值放入文本文件,但它会放入?。我不知道为什么,甚至不知道这意味着什么。代码如下:

    if (secMessage[1].equalsIgnoreCase("add")) {
        if (secMessage.length==2) {
            try {
                String deaths = readFile("C:/Users/Samboni/Documents/Stuff For Streaming/deaths.txt", Charset.defaultCharset());
                FileWriter write = new FileWriter("C:/Users/Samboni/Documents/Stuff For Streaming/deaths.txt");
                int comb = Integer.parseInt(deaths) + 1;
                write.write(comb);
                write.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    下面是readFile方法:

    static String readFile(String path, Charset encoding) throws IOException {
        byte[] encoded = Files.readAllBytes(Paths.get(path));
        return new String(encoded, encoding);
    }
    

    此外,secMessage数组是一个字符串数组,包含IRC消息的单词,这些单词被拆分为单个单词,这样程序就可以逐个单词地对命令做出反应。

    2 回复  |  直到 10 年前
        1
  •  4
  •   Jon Skeet    10 年前

    你在打电话 Writer.write(int) 它将一个UTF-16代码点写入文件,只取最下面的16位。如果您的平台默认编码不能表示您尝试编写的代码点,它将编写“?”作为替换字符。

    我怀疑你 事实上 希望写出数字的文本表示,在这种情况下,应使用:

    write.write(String.valueOf(comb));
    

    换句话说,将值转换为字符串,然后 然后 写出来。所以如果 comb 为123,则会将三个字符(“1”、“2”、“3”)写入文件。

    就我个人而言,我会避免 FileWriter 不过-我更喜欢使用 OutputStreamWriter 包装 FileOutputStream 因此您可以控制编码。或者在Java 7中,您可以使用 Files.newBufferedWriter 做得更简单。

        2
  •  0
  •   MeowMeow    10 年前
    write.write(new Integer(comb).toString());
    

    您可以将int转换为字符串。否则,您将需要int为字符。这只适用于数字的一小部分,0-9,因此不建议使用。