【问题标题】:What is the preferred way to read/write content from a URL in Java从 Java 中的 URL 读取/写入内容的首选方法是什么
【发布时间】:2010-05-18 20:57:34
【问题描述】:

打开与网站的连接并随后阅读该页面上的信息的首选方式是什么?似乎有很多关于不同部分的具体问题,但没有明确和简单的例子。

【问题讨论】:

    标签: java url


    【解决方案1】:

    Getting Text from a URL | Example Depot:

    try {
        // Create a URL for the desired page
        URL url = new URL("http://hostname:80/index.html");
    
        // Read all the text returned by the server
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String str;
        while ((str = in.readLine()) != null) {
            // str is one line of text; readLine() strips the newline character(s)
        }
        in.close();
    } catch (MalformedURLException e) {
    } catch (IOException e) {
    }
    

    当谈到“写入”到一个 URL 时,我想你会想要像 Sending a POST Request Using a URL | Example Depot 这样的东西。

    【讨论】:

    • 1.我建议不要使用URL.openStream 2. 这不会关闭流阅读器
    • @aioibe:查看评论中的链接。 PS。请在 catch 块中添加注释以强调异常应该被处理而不是被忽略。
    【解决方案2】:

    你可以简单地使用这个:

    InputStream stream = new URL( "http://google.com" ).openStream();
    

    【讨论】:

    【解决方案3】:

    Sun Microsystems 实际上有一个关于这个主题的tutorial on reading and writing with a URLConnection,这将是一个很好的起点。

    【讨论】:

    • 我最初对这个问题投了反对票,因为我认为您只是简单地链接到 URLConnection 的 API。这将毫无意义且懒惰,因为 jW 无疑会在他查看的其他问题中看到这一点,并且对决定首选方法没有太大贡献。我只是刚刚意识到您实际上链接到了几乎完全相同的问题上的 Sun 教程,这更有用。因此,如果您编辑答案以更清楚地表明您提供的是有用的链接,我实际上会支持它。
    • 这是一个非常糟糕的拒绝投票的借口。它表明你太懒了,没有点击链接。做得很好。
    • @SB:Lolz,因为它是 CW,我可以自己编辑它,然后点赞。我认为您对单次投反对票过于认真,尤其是因为我发表了评论,因此如果您不同意我的投反对票,您可以质疑我的理由。它只有 2 个代表!
    • 顺便说一句,回复:这个资源,通常是寻找编码标准的最佳位置是制造该技术的公司提供的那些资源。但是,在这种情况下,我不会调用使用首选方式的方法,主要是因为它们抛出异常而不是编写 try, finally 子句。
    • CW 甚至不计入代表。但最重要的是,如果理由足够好,我通常不在乎投反对票。但是,我找到了您甚至懒得点击链接的原因,这是一个相当糟糕的链接。就这样。如果您不想费心点击链接,那不值得挑战。通常,OP 想要一个他们可以剪切、粘贴和修改的示例。无论如何,感谢您的编辑 - 下次会尝试更清晰。
    【解决方案4】:

    SB 链接到的Sun Microsystems article 将是一个不错的起点。但是,我绝对不会将其称为首选方式。首先它不必要地抛出异常,然后它不会在 finally 中关闭流。此外,它使用了我不同意的url.openStream 方法,因为即使HTTP error is returned 仍然可以接收输出。

    我们写的不是url.openStream

    HttpURLConnection conn=(HttpURLConnection) url.openConnection()
    //Any response code starting with 2 is acceptable
    if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
        //Provide a nice useful exception
        throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
    InputStream rawIn=conn.getInputStream()
    OutputStream rawOut=conn.getOutputStream()
    //You may want to add buffering to reduce the number of packets sent
    BufferedInputStream bufIn=new BufferedInputStream(rawIn);
    BufferedOutputStream bufOut=new BufferedInputStream(rawOut);
    

    请勿在未处理异常或关闭流的情况下使用此代码!。这实际上很难正确地做到。如果您想了解如何正确执行此操作,请查看my answerfetching images in Android 的更具体的问题,因为我不想在这里全部重写。

    现在,当从服务器检索输入时,除非您正在编写命令行工具,否则您需要在单独的线程中运行它并显示加载对话框。 Sgarman's answer 使用基本的 Java 线程演示了这一点,而我的 an answer 使用 Android 中的 AsyncTask 类使其更整洁。 class file 没有任何 Android 依赖项,并且许可证是 Apache,因此您可以在非 Android 项目中使用它。

    【讨论】:

    • 我很好奇为什么你认为我的回答没有解决这个问题。他想要一个简单明了的例子,我提供了。您对 Android 的使用在这里无关紧要,因为他没有表示使用它。他为什么要引入一个额外的类 - 他可以打开一个连接并将其放入异步线程中,或者使用 NIO。
    • @SB:Android 类没有依赖项并且足够好,我相信值得将其拉入。或者,我还链接到 Sgarman 的答案,该答案演示了正常情况下执行此操作线程
    猜你喜欢
    • 2014-06-09
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多