Java 为什么BufferedWriter write()方法不自动广播到字符串
我发现java的这种行为对我来说有点奇怪 在检查时,我确实意识到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
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()
InPrintStream
可以完美地工作:
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(…)
有一个方法,其中asBufferedWriter
没有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.