Java 为什么可以';我不能在资源试用之外编写FileWriter吗?

Java 为什么可以';我不能在资源试用之外编写FileWriter吗?,java,file,filereader,file-handling,filewriter,Java,File,Filereader,File Handling,Filewriter,所以,我只想创建一个程序,将内容从一个文件(source1)复制到另一个文件(source2),并将其转换为小写。。。在此过程中,我提出了以下代码: try(FileWriter fr=new FileWriter("Source1.txt")){ String str="UPPER CASE"; fr.write(str); } File file=new

所以,我只想创建一个程序,将内容从一个文件(source1)复制到另一个文件(source2),并将其转换为小写。。。在此过程中,我提出了以下代码:

        try(FileWriter fr=new FileWriter("Source1.txt")){
            String str="UPPER CASE";
            fr.write(str);
        }


        File file=new File("Source1.txt");
        //FileReader fr=new FileReader("Source1.txt"); // (1)
        //FileWriter f2=new FileWriter("Source2.txt"); // (2)

        try(FileReader fr=new FileReader("Source1.txt");FileWriter f2=new FileWriter("Source2.txt")){ //If i remove 
//file Reader from here and uncomment (1) the code works fine but if i do so with FileWriter (Remove
//fileWriter from here and uncomment (2)) I can't copy the contents of the file (No error is shown... the code executes but Source2.txt just comes out as blank file.


            char x[]=new char[(int)file.length()];
            fr.read(x);
            String str=new String(x);
            System.out.println(str);
            String st=str.toLowerCase();
            f2.write(st);


        }

代码没有问题,但我只是想知道为什么它是这样工作的(请阅读代码中的注释)

如果您不使用
尝试使用资源
,您必须自己关闭资源。
这可能是将任何缓存数据写入流(刷新)所必需的,例如写入文件;也有利于释放系统资源


基本上(忽略错误处理/异常)与:

var resource = new Resource();
// statements
resource.close();
或者(更好一点)


如果添加了错误处理,这可能会变得复杂-因此最好使用
try with resource
(至少它使代码更易于阅读/理解/维护)。

如果编写器没有try with resources,则需要注意使用

f2.flush()
f2.close()
flush()刷新流。如果流已将各种write()方法中的任何字符保存在缓冲区中,它会立即将它们写入预期的目标


Try with resources隐式地做了同样的事情。

您的评论说“我无法复制文件的内容”。为什么不呢?你有编译器错误吗?运行时异常?请发布详细信息(包括任何错误消息或堆栈跟踪,如果适用)。如果您不使用try with resources,则需要自己在文件处理程序上调用
close()
。使用资源试试更好:坚持使用。@TedHopp没有显示错误。。。source2.txt将为空。。。我想输入一个空白输出是没有意义的。@khelwood我只是想知道,如果文件阅读器在try块之外,而不是在try块之外,它会起什么作用fileWriter@SomethingNice可能是因为您没有关闭filewriter,而您试图写入的部分内容仍然被缓存。这是correc。但这将给他指明错误的方向。所以我不支持这个。f2.flush()也可以工作。因此,写入的内容将保留在缓冲区中,在调用f2.close()之前不会刷新。如果我想绕过它,那么我可以使用f2.flush()而不关闭(这是不推荐的)。通常不需要调用
flush()
。调用
close()
将确保在关闭底层输出流之前刷新输出。在调用
close()
之前调用
flush()
的唯一原因是单独处理刷新流时可能出现的任何异常。调用
close()
时,这些异常会被忽略。
var resource = new Resource();
try {
    // statements
} finally {
    resource.close();
}
f2.flush()
f2.close()