从 URLConnection 读取和写入

URLConnection类包含许多方法,可让您通过网络与 URL 进行通信。 URLConnection是一个以 HTTP 为中心的类;也就是说,它的许多方法仅在使用 HTTP URL 时才有用。但是,大多数 URL 协议都允许您读取和写入连接。本节介绍这两种功能。

从 URLConnection 读取

以下程序执行与直接从 URL 读取中所示的URLReader程序相同的功能。

但是,此程序不是直接从 URL 获取 Importing 流,而是显式地检索URLConnection对象并从连接获取 Importing 流。通过调用getInputStream隐式打开连接。然后,像URLReader一样,此程序在 Importing 流上创建BufferedReader并从中读取。粗体语句突出显示了此示例与先前示例之间的区别:

import java.net.*;
import java.io.*;

public class URLConnectionReader {
    public static void main(String[] args) throws Exception {
        URL oracle = new URL("http://www.oracle.com/");
        URLConnection yc = oracle.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                                    yc.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) 
            System.out.println(inputLine);
        in.close();
    }
}

该程序的输出与直接从 URL 打开流的程序的输出相同。您可以使用任何一种方法来读取 URL。但是,从URLConnection读取而不是直接从 URL 读取可能更有用。这是因为您可以同时将URLConnection对象用于其他任务(例如写入 URL)。

同样,如果程序挂起或看到错误消息,则可能必须设置代理主机,以便程序可以找到 Oracle 服务器。

写入 URLConnection

许多 HTML 页面包含* forms *-文本字段和其他 GUI 对象,可让您 Importing 要发送到服务器的数据。键入所需的信息并通过单击按钮启动查询后,Web 浏览器将数据通过网络写入 URL。在另一端,服务器接收数据,对其进行处理,然后向您发送响应,通常以新的 HTML 页面的形式。

这些 HTML 表单中的许多表单都使用 HTTP POST METHOD 将数据发送到服务器。因此,写 URL 通常被称为*发布到 URL *。服务器识别 POST 请求并读取从 Client 端发送的数据。

为了使 Java 程序与服务器端进程进行交互,它仅必须能够写入 URL,从而向服务器提供数据。通过执行以下步骤可以做到这一点:

  • 创建一个URL

  • 检索URLConnection对象。

  • URLConnection上设置输出功能。

  • 打开与资源的连接。

  • 从连接获取输出流。

  • 写入输出流。

  • 关闭输出流。

这是一个名为ReverseServlet的小servlet(或者,如果您更喜欢cgi-bin脚本)。您可以使用此 servlet 测试以下示例程序。

运行在容器中的 servlet 从其 InputStream 读取,反转该字符串,并将其写入其 OutputStream。 Servlet 要求 Importing 格式为string=string_to_reverse,其中string_to_reverse是要以相反 Sequences 显示其字符的字符串。

这是一个示例程序,该程序通过URLConnection通过网络运行ReverseServlet

import java.io.*;
import java.net.*;

public class Reverse {
    public static void main(String[] args) throws Exception {

        if (args.length != 2) {
            System.err.println("Usage:  java Reverse "
                + "http://<location of your servlet/script>"
                + " string_to_reverse");
            System.exit(1);
        }

        String stringToReverse = URLEncoder.encode(args[1], "UTF-8");

        URL url = new URL(args[0]);
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);

        OutputStreamWriter out = new OutputStreamWriter(
                                         connection.getOutputStream());
        out.write("string=" + stringToReverse);
        out.close();

        BufferedReader in = new BufferedReader(
                                    new InputStreamReader(
                                    connection.getInputStream()));
        String decodedString;
        while ((decodedString = in.readLine()) != null) {
            System.out.println(decodedString);
        }
        in.close();
    }
}

让我们检查一下程序,看看它是如何工作的。首先,程序处理其命令行参数:

if (args.length != 2) {
    System.err.println("Usage:  java Reverse "
        + "http://<location of your servlet/script>"
        + " string_to_reverse");
    System.exit(1);
}       

String stringToReverse = URLEncoder.encode(args[1], "UTF-8");

这些语句确保用户为程序提供两个且仅两个命令行参数。命令行参数是ReverseServlet的位置以及将被反转的字符串。它可能包含空格或其他非字母数字字符。这些字符必须进行编码,因为字符串 是在到达服务器的过程中处理的。 URLEncoder类方法对字符进行编码。

接下来,程序创建URL对象,并设置连接以便可以对其进行写入:

URL url = new URL(args[0]);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);

然后,程序在连接上创建一个输出流,并在其上打开一个OutputStreamWriter

OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());

如果 URL 不支持输出,则getOutputStream方法将引发UnknownServiceException。如果 URL 确实支持输出,则此方法返回一个输出流,该输出流连接到服务器端 URL 的 Importing 流-Client 端的输出是服务器的 Importing。

接下来,程序将所需的信息写入输出流并关闭该流:

out.write("string=" + stringToReverse);
out.close();

此代码使用write方法写入输出流。因此,您可以看到将数据写入 URL 就像将数据写入流一样容易。写入 Client 端输出流的数据是服务器端 servlet 的 Importing。 Reverse程序通过将string=放在要反转的编码字符串 之前,以脚本所需的形式构造 Importing。

Servlet 读取您编写的信息,对字符串 值执行相反的操作,然后将其发送回给您。现在,您需要读取服务器已发送回的字符串。 Reverse程序这样做是这样的:

BufferedReader in = new BufferedReader(
                            new InputStreamReader(
                            connection.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {
    System.out.println(decodedString);
}
in.close();

如果ReverseServlet位于http://example.com/servlet/ReverseServlet,则当您使用Reverse程序运行时

http://example.com/servlet/ReverseServlet "Reverse Me"

作为参数(包括 Double 引号),您应该看到以下输出:

Reverse Me
 reversed is: 
eM esreveR