0

我有这种方法可以从 yahoo Finance 下载 .csv 文件并将它们保存在本地。它在循环期间被访问,因此它从列表中下载许多文件。但是,有时符号输入错误、不再存在或连接超时。如何修改此方法,以便重试连接超时并跳过不正确的符号(意味着 url 不起作用)而不结束程序?

public static void get_file(String symbol){

    OutputStream outStream = null;
    URLConnection  uCon = null;
    InputStream is = null;

    String finance_url = "http://ichart.finance.yahoo.com/table.csv?s="+symbol;
    String destination = "C:/"+symbol+"_table.csv";

    try {
        URL Url;
        byte[] buf;
        int ByteRead,ByteWritten=0;
        Url= new URL(finance_url);

        outStream = new BufferedOutputStream(new FileOutputStream(destination));

        uCon = Url.openConnection();
        is = uCon.getInputStream();         
        buf = new byte[size];

        while ((ByteRead = is.read(buf)) != -1) {
            outStream.write(buf, 0, ByteRead);
            ByteWritten += ByteRead;
        }

    }catch (Exception e) {
        System.out.println("Error while downloading "+symbol);
        e.printStackTrace();
    }finally {
        try {
            is.close();
            outStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4

1 回答 1

1

抛出异常时为什么不再次调用该方法。您可以缩小异常类型以指示何时应启动重试。

public static void get_file(String symbol){

    OutputStream outStream = null;
    URLConnection  uCon = null;
    InputStream is = null;

    String finance_url = "http://ichart.finance.yahoo.com/table.csv?s="+symbol;
    String destination = "C:/"+symbol+"_table.csv";

    try {
        URL Url;
        byte[] buf;
        int ByteRead,ByteWritten=0;
        Url= new URL(finance_url);

        outStream = new BufferedOutputStream(new FileOutputStream(destination));

        uCon = Url.openConnection();
        is = uCon.getInputStream();         
        buf = new byte[size];

        while ((ByteRead = is.read(buf)) != -1) {
            outStream.write(buf, 0, ByteRead);
            ByteWritten += ByteRead;
        }

    }catch (Exception e) {
      getFile(symbol);
    }finally {
        try {
            is.close();
            outStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
于 2012-01-16T15:59:12.453 回答