直接从URL读取并写入文件-Java

直接从URL读取并写入文件-Java,java,file,url,Java,File,Url,我正在读取URL的内容并编写一个文件。问题是,我无法编写文件中的所有内容,也不知道我做错了什么 我的代码 try { URL url = new URL(sourceUri); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(

我正在读取URL的内容并编写一个文件。问题是,我无法编写文件中的所有内容,也不知道我做错了什么

我的代码

try {
            URL url = new URL(sourceUri);
            URLConnection conn = url.openConnection();

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));


            file.getParentFile().mkdirs();
            file.createNewFile();

            FileWriter fw = new FileWriter(file);
            BufferedWriter bw  = new BufferedWriter(fw);

            while ((inputLine = br.readLine()) != null) {
                bw.write(inputLine + System.getProperty("line.separator"));
            }

            br.close();

            System.out.println("DONE");

        }catch (IOException ioe){
            ioe.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }

        return ontologies;
    }

请帮助

问题是您使用的是
缓冲写入程序
,而您没有关闭它。它的缓冲区中有一些内容没有写入,而您丢失了

尝试刷新缓冲区并关闭
BufferedWriter

bw.flush();
bw.close();
br.close()之前的后面包括这两行

您还可以阅读
BufferedWriter
的工作原理

我认为您也应该关闭
FileWriter
,以便解除对文件的阻止

fw.close();
编辑1:


关闭
BufferedWriter
将为您刷新缓冲区。您只需关闭它。

问题是您使用的是
缓冲写入程序,而您没有关闭它。它的缓冲区中有一些内容没有写入,而您丢失了

尝试刷新缓冲区并关闭
BufferedWriter

bw.flush();
bw.close();
br.close()之前的后面包括这两行

您还可以阅读
BufferedWriter
的工作原理

我认为您也应该关闭
FileWriter
,以便解除对文件的阻止

fw.close();
编辑1:


关闭
BufferedWriter
将为您刷新缓冲区。您只需关闭它。

您做的很多事情都不正确

第一:你没有关闭所有的资源;文件的写入程序在哪里关闭

第二:使用
新InputStreamReader(…)
而不指定编码。是什么说另一端的编码是JVM/OS组合的编码

最后但并非最不重要,事实上,这是最重要的,您应该使用java.nio.file。毕竟,这是2015年

简单解决方案:

final Path path = file.toPath(); // or rather use Path directly
Files.createDirectories(path.getParent());

try (
    final InputStream in = conn.getInputStream();
) {
    Files.copy(in, path);
}

完成,独立编码,关闭所有资源。

您做的很多事情都不正确

第一:你没有关闭所有的资源;文件的写入程序在哪里关闭

第二:使用
新InputStreamReader(…)
而不指定编码。是什么说另一端的编码是JVM/OS组合的编码

最后但并非最不重要,事实上,这是最重要的,您应该使用java.nio.file。毕竟,这是2015年

简单解决方案:

final Path path = file.toPath(); // or rather use Path directly
Files.createDirectories(path.getParent());

try (
    final InputStream in = conn.getInputStream();
) {
    Files.copy(in, path);
}

完成,独立编码,关闭所有资源。

第一件事:使用java.nio.file。第二:你绝对确定这是一个文本文件吗?为什么不直接复制
InputStream
?@aioobe不能重复;这个答案使用了一个过时的API。2015年,当您有java.nio.file时,请参阅我的答案。@fge,我在链接的问题中没有看到任何提到过时API的内容。(当然,有些答案使用的是过时的API,但正确的做法是发布该问题的答案,并将其作为dup关闭。)@aioobe提示:
文件
@fge,我仍然没有在问题中看到任何
文件
。答案过时并不意味着应该发布新问题。第二:你绝对确定这是一个文本文件吗?为什么不直接复制
InputStream
?@aioobe不能重复;这个答案使用了一个过时的API。2015年,当您有java.nio.file时,请参阅我的答案。@fge,我在链接的问题中没有看到任何提到过时API的内容。(当然,有些答案使用的是过时的API,但正确的做法是发布该问题的答案,并将其作为dup关闭。)@aioobe提示:
文件
@fge,我仍然没有在问题中看到任何
文件
。答案过时并不意味着应该发布新问题。你是对的,经过编辑。谢谢你做得很好。你是对的,经过编辑。谢谢你做得很好。看起来文件有问题。复制看起来文件有问题。复制