Обработка ошибок для URLConnection - PullRequest
0 голосов
/ 16 января 2012

У меня есть этот метод, который загружает файлы .csv из Yahoo Finance и сохраняет их локально. Доступ к нему осуществляется во время цикла, поэтому он загружает много файлов из списка. Однако иногда символ вводится неправильно, больше не существует или время соединения истекло. Как я могу изменить этот метод так, чтобы тайм-ауты соединения повторялись, и неправильные символы (то есть, 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();
        }
    }
}

1 Ответ

1 голос
/ 16 января 2012

Почему бы не вызвать метод снова, когда выдается исключение. Вы можете сузить тип исключения, чтобы указать, когда следует инициировать повторную попытку.

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();
        }
    }
}
...