Java 为什么BufferedWriter write()方法不自动广播到字符串

Java 为什么BufferedWriter write()方法不自动广播到字符串,java,Java,我发现java的这种行为对我来说有点奇怪 在检查时,我确实意识到BufferedWriter的write()方法不适用于Long对象: BufferedWriter writer = new BufferedWriter(new FileWriter(outFile)); Long l1 = new Long(1); writer.write(l1); // <- this won't work as it is 因此,我猜测起作用的部分是+”,“部分,它实际上调用了l1.toStrin

我发现java的这种行为对我来说有点奇怪

在检查时,我确实意识到
BufferedWriter
write()
方法不适用于
Long
对象:

BufferedWriter writer = new BufferedWriter(new FileWriter(outFile));
Long l1 = new Long(1);
writer.write(l1); // <- this won't work as it is
因此,我猜测起作用的部分是
+”,“
部分,它实际上调用了
l1.toString()+”,“
,然后将其作为输入提供给
BufferedWriter

我的问题是,为什么java不将自动广播应用于
String
这些情况。我的意思是,既然
write()
期望:

  • BufferedWriter
  • 或者一个字符数组
  • 编写器
    类中的
    字符串
  • 对于期望的结果是否存在任何模糊性

    在类似的情况下(根据我的感知)
    System.out.print()
    In
    PrintStream
    可以完美地工作:

    System.out.println(l1); // <- this works fine
    
    System.out.println(l1);//
    长+字符串->字符串。

    BufferedWriter类没有任何方法来编写长代码

    可能的写入方法请参见。它清楚地表明“
    +
    ”操作符在与字符串和其他对象一起使用时,将对这些其他非字符串对象使用字符串强制。

    我(根据注释)似乎很清楚,
    编写器
    类只应编写单个字符。因此,要求它打印一个整数值(无论是长、字节、短还是其他)与类的意图相反(对于一般对象也是如此)。是的,您可以向其传递一个整数值,但该值实际上是一个
    char
    ——而不是
    int
    ——因此它将打印
    char
    值,而不是
    int

    l1+”,“
    工作的原因是编译器将其转换为
    字符串
    对象(然后
    编写器将其转换为字符数组,并通过
    字符
    写入
    字符串
    字符
    )。请注意,调用
    Writer.write((int)(l1+',)
    将产生“意外”结果)

    如果要打印字符串表示,则应将
    BufferedWriter
    包装在

    我还应该指出,如果您想非常小心,那么您应该使用并指定字符编码或字符集(这实际上对于读取文件比写入文件更重要,也就是说,您应该使用它来读取文本文件)。

    Java中没有“自动转换为
    字符串
    ”这样的东西。当在字符串上下文中使用“
    +
    ”运算符时,操作数将转换为字符串。这意味着您正在寻找的隐式转换只发生在“
    +
    ”操作符的上下文中

    Writer
    中可用的
    write()
    方法,因此
    BufferedWriter
    是:

    • void write(char[]cbuf)
      -写入字符数组
    • 无效写入(char[]cbuf,int off,int len)
      写入字符数组的一部分
    • 无效写入(int c)
      -写入单个字符
    • 无效写入(字符串str)
      -写入字符串
    • void write(字符串str、int off、int len)
      -写入字符串的一部分
    如果您想编写其他内容,它将不起作用,因为
    write()
    方法没有使用您正在寻找的变量重载

    您正在寻找的是以下内容:

    PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));
    Long l1 = new Long(1);
    writer.print(l1); // <- this works.
    
    • void print(Object o)
      -写入对象,通过调用其
      toString()
      方法将其转换为字符串,除非
      o==null
      ,在这种情况下将写入字符串
      “null”
    您可以使用包含此类方法的
    PrintWriter
    包装您的
    BufferedWriter
    ;注意名为
    print
    而不是
    write
    的方法。您可以看到,
    PrintWriter
    (就此而言,
    PrintStream
    )包含了许多用于各种类型的重载方法,因此可以打印任何内容,而不仅仅是
    String
    s和
    char
    acters

    因此,您的代码如下所示:

    PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));
    Long l1 = new Long(1);
    writer.print(l1); // <- this works.
    
    PrintWriter writer=new PrintWriter(new BufferedWriter(new FileWriter(outFile));
    长l1=新长(1);
    
    writer.print(l1);//可能重复。@Jared我这里不是问
    println
    ,而是问
    BufferedWriter
    。这只是一个示例,可以删除(示例)PrintStream确实包含
    println(long)
    重载。我理解这一点,但关键是
    System.out.println(…)
    有一个方法,其中as
    BufferedWriter
    没有
    write(Object)
    方法。为什么不呢?这我无法回答。@Jared可能是因为编写者的工作是编写文本(并让您以自己的方式将数据转换为文本),而PrintStream的工作是“方便地打印各种数据值的表示”。
    public static PrintWriter getPrintWriter(final BufferedWriter bw){
        return new PrintWriter(bw);
    }
    
    PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));
    Long l1 = new Long(1);
    writer.print(l1); // <- this works.