从 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