从java中的网页读取数据时出错?

时间:2012-02-21 09:29:32

标签: java latex ioexception

我正在使用此代码从网页中读取数据:

public class ReadLatex {
public static void main(String[] args) throws IOException {
    String urltext = "http://chart.apis.google.com/chart?cht=tx&chl=1+2%20\frac{3}{4}";
    URL url = new URL(urltext);
    BufferedReader in = new BufferedReader(new InputStreamReader(url
            .openStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) {
        // Process each line.
        System.out.println(inputLine);
    }
    in.close();
   }
}

网页为URL中的乳胶代码提供图像。

我得到了这个例外:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: http://chart.apis.google.com/chart?
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at ReadLatex.main(ReadLatex.java:11)

任何人都可以告诉我为什么会遇到这个问题以及解决方案应该是什么?

3 个答案:

答案 0 :(得分:2)

尝试使用org.apache.commons.lang.StringEscapeUtils

之类的东西进行转义

答案 1 :(得分:1)

我认为您应该考虑转义URL中的反斜杠。我是Java,反斜杠必须在String中转义 它应该成为

String urltext =
            "http://chart.apis.google.com/chart?cht=tx&chl=1+2%20\\frac{3}{4}";

这是纯粹的java启动。 似乎这个网址与我的浏览器一起使用,但是,正如其他答案中所建议的那样,我认为最好还要逃避所有特殊字符,例如反斜杠,鞋带...

答案 2 :(得分:1)

你的问题是你在一个字符串中使用\(反斜杠),在Java中它是一个转义字符。要获得一个实际的\你需要在你的字符串中有两个。所以:

Wanted text: part1\part2

你需要

String theString = "part1\\part2";

所以你真的想要

String urltext = "http://chart.apis.google.com/chart?cht=tx&chl=1+2%20\\frac{3}{4}";

此外,当您成功完成请求后,您将获得一个图像(png),该图像不应该使用读取器读取,该读取器将尝试使用某些编码将字节解释为字符,这将破坏图像数据。而是使用输入流并将内容(字节)写入文件。

没有错误处理的简单示例

public static void main(String[] args) throws IOException {
    String urltext = "http://chart.apis.google.com/chart?cht=tx&chl=1+2%20\\frac{3}{4}";
    URL url = new URL(urltext);

    InputStream in = url.openStream();
    FileOutputStream out = new FileOutputStream("TheImage.png");

    byte[] buffer = new byte[8*1024];
    int readSize;
    while ( (readSize = in.read(buffer)) != -1) {
        out.write(buffer, 0, readSize);
    }
    out.close();
    in.close();
}