Java扫描程序不读取特定文件

时间:2017-04-20 12:39:50

标签: java yahoo-finance

我有一个java软件,它要求雅虎财务公司提供当前和历史股票价格。

如其他帖子所述,雅虎可以将价格写入文件,扫描仪可以读取。 要请求亚马逊的当前价格我打电话: http://finance.yahoo.com/d/quotes.csv?s=AMZ.DE&f=snl1t1c4

要在过去5年内要求亚马逊价格,我打电话: http://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs

如果我在浏览器中访问这两个链接,它会下载一个.csv文件,其中包含每个链接的预期数据。

在java中,相应的.csv文件应该通过folling方法读取:

private static List<String> requestStockData(String request) throws IOException {
    Scanner scanner = null;
    List<String> answer = new ArrayList();
    try {
        scanner = new Scanner(new URL(request).openStream());//no exception here
    } catch (FileNotFoundException e) {
        Tools.printDebugMessage("Received null-answer for request " + request);
        return answer;
    }
    while (scanner.hasNextLine()) {//scanner.hasNextLine() returns false
        String value = scanner.nextLine();
        answer.add(value);
        Tools.printDebugMessage("received answer from YAHOO! Finance: " + value);
    }
    scanner.close();
    return answer;
}

其中request是上述链接之一。

我使用这个软件已经有几个星期了,它运行得很好。 但是最后几天它不再适用于历史数据,但它适用于当前的数据。

使用历史数据的链接,扫描仪将正常打开并且不会引发异常,但scanner .hasNextLine()将立即返回false,但是使用我的浏览器下载的.csv文件有1305行。 / p>

你是否有人理解为什么扫描仪不再接受历史数据的.csv文件但接受当前的数据?

2 个答案:

答案 0 :(得分:1)

使用&#34; https&#34;更新您的网址然后再试一次。

old:http://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs

新:https://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs

received answer from YAHOO! Finance: Date,Open,High,Low,Close,Volume,Adj Close
received answer from YAHOO! Finance: 2017-04-19,844.95,849.35,842.90,847.90,1700,847.90
received answer from YAHOO! Finance: 2017-04-18,849.50,851.00,841.25,845.00,3100,845.00
received answer from YAHOO! Finance: 2017-04-17,839.90,839.90,839.90,839.90,000,839.90

答案 1 :(得分:1)

原因是当您调用http://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs时,浏览器会重定向到https://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs(即您返回代码301),但从旧URL生成的输入流将为空。如果您想模拟浏览器的功能,则必须发送HTTP get请求,例如像这样:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;

public class Main {
    public static void main(String [] args){
        String request = "http://ichart.finance.yahoo.com/table.csv?s=AMZ.DE&d=3&e=20&f=2017&a=3&b=20&c=2012&g=d&ignore=.cvs";
        try {
            HttpGet httpget = new HttpGet(request);         
            HttpResponse response = HttpClients.createDefault().execute(httpget);
            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
            String filePath = "output.csv";
            FileOutputStream fos = new FileOutputStream(new File(filePath));
            int inByte;
            while((inByte = is.read()) != -1)
                 fos.write(inByte);
            is.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}