如何在Java中将DataInputStream转换为字符串?

12

我想询问有关Java的问题。我已经使用Java中的URLConnection来检索DataInputStream,并且我想将DataInputStream转换为Java中的String变量。我该怎么做?有人可以帮我吗?谢谢。

以下是我的代码:

URL data = new URL("http://google.com");
URLConnection dataConnection = data.openConnection();
DataInputStream dis = new DataInputStream(dataConnection.getInputStream());
String data_string;
// convent the DataInputStream to the String

4
你想将DataInputString转换为String吗,还是想从DataInputString中读取String? - jmj
@org.life.java,谢谢您的回复。 我想将DataInputStream转换为字符串,例如(data_string = dis;)。 另外,我认为这是另一个问题,所以我发布了一个新的问题,而不是我之前提出的问题。 谢谢。 :-) - Questions
@org.life.java,感谢您的回复。Google只是一个例子,我想问的是,“给你对象的字符串表示”是什么意思? - Questions
对象具有toString方法,返回对象的字符串表示形式。我认为你不是要找那个,你想通过将它转换为字符串来做什么,用例子解释一下。 - jmj
@org.life.java,谢谢。还请回复您的答案。 - Questions
显示剩余2条评论
3个回答

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

class ConnectionTest {
    public static void main(String[] args) {
        try {
            URL google = new URL("http://www.google.com/");
            URLConnection googleConnection = google.openConnection();
            DataInputStream dis = new DataInputStream(googleConnection.getInputStream());
            StringBuffer inputLine = new StringBuffer();
            String tmp; 
            while ((tmp = dis.readLine()) != null) {
                inputLine.append(tmp);
                System.out.println(tmp);
            }
            //use inputLine.toString(); here it would have whole source
            dis.close();
        } catch (MalformedURLException me) {
            System.out.println("MalformedURLException: " + me);
        } catch (IOException ioe) {
            System.out.println("IOException: " + ioe);
        }
    }
}  

这就是你想要的。


@org.life.java,感谢您的回答。我认为对问题有些误解。在“System.out.println(inputLine);”之后,inputLine变成了“null”值,而我想让inputLine="<html><head..."并在其他类中使用。所以,您能否给我另一个建议?谢谢。 - Questions
@org.life.java,非常非常非常有帮助。非常感谢你,很抱歉浪费了你的时间。 - Questions
1
我不相信这会起作用。readUTF()期望字符串数据以特定方式存储(请参见http://download.oracle.com/javase/1.3/docs/api/java/io/DataInput.html#readUTF%28%29)。如果您尝试从任意URL读取内容,则情况将不同。 - Grodriguez
@Grodriguez 谢谢你让我知道这个。我已经改回使用readLine了,我知道它已经过时了。其他的解决方案已经在这里了,比如bozho的。 - jmj
如果您使用DataInputStream.readLine(),则当您访问的URL的内容编码与纯ASCII不同时,您的解决方案将无法正常工作。这就是readLine方法被弃用的原因。请参见我回答此相同问题的方式,以读取URL的内容并考虑内容编码,而不需要借助任何外部库。 - Grodriguez

7
如果您想从一个通用的URL(如www.google.com)读取数据,那么您可能根本不需要使用DataInputStream。相反,创建一个BufferedReader对象,并通过readLine()方法逐行读取。使用URLConnection.getContentType()字段来查找内容的字符集(您需要正确地创建阅读器才能知道这个信息)。
例如:
URL data = new URL("http://google.com");
URLConnection dataConnection = data.openConnection();

// Find out charset, default to ISO-8859-1 if unknown
String charset = "ISO-8859-1";
String contentType = dataConnection.getContentType();
if (contentType != null) {
    int pos = contentType.indexOf("charset=");
    if (pos != -1) {
        charset = contentType.substring(pos + "charset=".length());
    }
}

// Create reader and read string data
BufferedReader r = new BufferedReader(
        new InputStreamReader(dataConnection.getInputStream(), charset));
String content = "";
String line;
while ((line = r.readLine()) != null) {
    content += line + "\n";
}

1
ContentEncoding头部真的包含字符集吗?根据规范,它应该包含例如gzip。你应该查看字符集。 - Kuitsi

7
您可以使用commons-ioIOUtils.toString(dataConnection.getInputStream(), encoding)来实现您的目标。 DataInputStream不适用于您想要的内容 - 即您想要将网站的内容读取为String

这并没有考虑到您正在访问的URL的内容编码。您应该使用IOUtils.toString方法的两个参数版本,以明确指定编码。 - Grodriguez
@Grodriguez 或使用 InputStreamReader。我添加了编码,这确实是一个好习惯。 - Bozho
即使您传递了一个 InputStreamReader,您仍然需要在创建 InputStreamReader 时指定编码,否则您将遇到相同的问题(将使用默认平台编码,这可能与 URL 内容的编码匹配或不匹配)。 - Grodriguez
@Grodriguez,我之前所说的InputStreamReader建议就是这个意思。(顺便说一下,我猜那个踩票可以撤销吧) - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接