【问题标题】:Saving a web page to a file in Java [closed]将网页保存到Java中的文件[关闭]
【发布时间】:2011-10-28 02:50:35
【问题描述】:

我正在尝试使用以下代码阅读html网站,请系统挂起任何提示:

package com.test;

import java.io.BufferedWriter;   
import java.io.FileWriter;   
import java.net.Socket;  
import javax.net.SocketFactory;  
import java.net.InetAddress;

public class writingFile {

    public static void main(String a[]) throws Exception {

        SocketFactory factory=SocketFactory.getDefault();
        Socket socket=new Socket(InetAddress.getByName("java.sun.com"), 80);
        BufferedWriter out=new BufferedWriter(new FileWriter("C://test.html"));
        int data;

        while((data=socket.getInputStream().read()) != -1) {
            out.write((char)data);
            out.flush();
        }
    }
}

问候, 拉杰

【问题讨论】:

  • 您遇到了什么异常?如果您告诉我们可能会更有帮助。
  • 它抛出了什么异常?在哪里?
  • 我打赌你没有java.sun.com的IP....
  • 有什么异常?您需要提供尽可能多的信息。你得到一个例外,是一个非常广泛的声明。
  • 你被否决了,因为你在问一个问题,但没有提供任何上下文。

标签: java http sockets


【解决方案1】:

首先,您需要意识到网页是通过 HTTP 而不是原始 TCP 提供的。如果你真的想使用 Socket,你将不得不自己实现一个 HTTP GET 请求。如果您愿意,我会留给您自己解决。

您也可以使用 Java 内置的 URLconnection。请注意,下面的代码远未准备好用于生产,但这应该让您大致了解如何使用 Java URL 连接。

public class WebPageSaver {
    public static void main(String args[]) throws Exception {
        OutputStream out = new FileOutputStream("c:/temp/test.html");

        URL url = new URL("http://www.oracle.com/technetwork/java/index.html");
        URLConnection conn = url.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();

        copy(is, out);
        is.close();
        out.close();
    }

    private static void copy(InputStream from, OutputStream to) throws IOException {
        byte[] buffer = new byte[4096];
        while (true) {
            int numBytes = from.read(buffer);
            if (numBytes == -1) {
                break;
            }
            to.write(buffer, 0, numBytes);
        }
    }
}

【讨论】:

  • 感谢它仅在 Socket 的帮助下解决了我的问题,
  • 如果解决了问题,请标记 Mike 的答案correct
  • @Raju Komaturi:你为什么坚持使用套接字?使用 URL 是正确的方法。
【解决方案2】:

这是HTTP。您不能只打开一个套接字并开始阅读某些内容。您必须对服务器有礼貌并先发送请求:

socket.getOutputStream().write("GET /index.html HTTP/1.0\n\n".getBytes());
socket.getOutputStream().flush();

然后读取一个 HTTP 响应,解析它,然后取回您的 html 页面。

编辑 我写了如何处理套接字只是因为它是 OP 的直接问题。正如@Mike Deck 所回答的那样,使用 URLConnection 是正确的方法。

【讨论】:

  • 使用你的提示我能够解决它,当我给出像 bbc.co.uk/news/ 这样的子上下文时,它会抛出 UnknownHostException
  • 这就是我所做的,SocketFactory socketFactory=SocketFactory.getDefault();套接字 socket=socketFactory.createSocket(InetAddress.getByName("bbc.co.uk/news"),80);
猜你喜欢
  • 2013-05-27
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2013-11-29
  • 2015-07-16
  • 2015-07-21
相关资源
最近更新 更多