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

时间:2015-05-22 10:39:13

标签: java file url

我正在读取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;
    }

请帮忙

2 个答案:

答案 0 :(得分:6)

你做错了很多事。

首先:你不要关闭所有资源;该文件的编写者在哪里关闭?

第二:您使用new 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);
}

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

答案 1 :(得分:1)

问题是您使用的是BufferedWriter而您没有关闭它。它的缓冲区中有一些内容没有写入,你就错过了。

尝试刷新缓冲区并关闭BufferedWriter

bw.flush();
bw.close();

br.close();之前包含这两行。

此外,您还可以了解BufferedWriter的工作原理here

我认为你也应该关闭FileWriter,以便取消阻止文件。

fw.close();

编辑1:

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