Java:从URL下载

时间:2012-01-16 17:12:21

标签: java url

有人可以尝试我的代码吗?它在几天前工作,现在不是。我没有修改任何东西,所以我怀疑那边的网站管理员阻止了我。有人可以帮我查一下吗?这是我学校项目的一部分。

public class Cost extends TimerTask{

public void run() {
  Calendar rightNow = Calendar.getInstance();
  Integer hour = rightNow.get(Calendar.HOUR_OF_DAY);

  if (hour==1) {
    try {
      URL tariff = new URL("http://www.emcsg.com/MarketData/PriceInformation?downloadRealtime=true");
      ReadableByteChannel tar = Channels.newChannel(tariff.openStream());
      FileOutputStream fos = new FileOutputStream("test.csv");
      fos.getChannel().transferFrom(tar, 0, 1<<24);

    } catch (IOException ex) {
      Logger.getLogger(Cost.class.getName()).log(Level.SEVERE, null, ex);
    } 
  }

  else {

  }
}
}

2 个答案:

答案 0 :(得分:3)

首先,清理您的IO异常,因为这可能会使问题变得模糊 - 请检查您是否可以写入D:。

如果您因用户代理标头而被网站阻止:

这将显示您的用户代理标头:http://pgl.yoyo.org/http/browser-headers.php。然后,Setting user agent of a java URLConnection的答案会告诉您如何设置标题。

您需要在实例化URL和打开流之间添加一个步骤:

URL tariff = new URL("http://www.emcsg.com/MarketData/PriceInformation?downloadRealtime=true");
java.net.URLConnection c = tariff.openConnection();
c.setRequestProperty("User-Agent", " USER AGENT STRING HERE ");
ReadableByteChannel tar = Channels.newChannel(c.getInputStream());

或者您可以尝试这样做:

System.setProperty("http.agent", " USER AGENT STRING HERE ");

在您致电openStream()之前的某个时间。

编辑:这对我有用。你可以尝试运行它并让我们知道输出:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

    public class TestURL {

        public static void main(String[] args) {
            try {
              URL tariff = new URL("http://www.emcsg.com/MarketData/PriceInformation?downloadRealtime=true");
              URLConnection c = tariff.openConnection();
              BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
              System.out.println(br.readLine());
            } catch (IOException ex) {
              ex.printStackTrace();
            }
        }
    }

答案 1 :(得分:0)

我检查了你的代码并运行它我没有问题,一切正常。 你是在代理人背后工作吗?

在这种情况下,你必须配置它:

System.setProperty("http.proxyHost", "my.proxy.name");
System.setProperty("http.proxyPort", "8080");