2014-05-14 3 views
0

이 코드는 from 및 to 인수를 취하며 USD에서 다른 20 개의 환율로 교환해야합니다. 멀리 문자열이 (변환) 대신 웹 사이트에 연결해야 할 20 번, 그것을로드 할 때마다 10-15 초 걸립니다.USD에서 20 기타 통화로 환율을 받으세요.

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package priceStrategy; 
/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

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

/** 
* 
* @author 
*/ 
public class ExchangeFinder { 

    /** 
    * The method takes 2 currency strings and return the exchange rate. 
    * 
    * @param fromCurrency String the currency to exchange from 
    * @param toCurrency String the currency to exchange to 
    * @return double the exchange rate between fromCurrency and toCurrency. If 
    * something goes wrong 100.0 will be returned. 
    * 
    * USD - DKK USD - JPY USD - GBP USD - AUD USD - EUR USD - ESP USD - GHS USD 
    * - ILS USD - KES USD - JOD USD - LKR USD - LVL USD - MAD USD - MWK USD - 
    * NOK USD - PHP USD - NOK USD - PKR USD - RUB USD - SGD 
    */ 
    public static double getExchangeRate(String fromCurrency, String toCurrency) { 
     double result = 100.0; 

     try { 
      // Open a connection to bloomberg to get exchange rates 
      URL bloombergCurrency = new URL("http://www.bloomberg.com/quote/" + fromCurrency + toCurrency + ":CUR"); 
      URLConnection bc = bloombergCurrency.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(bc.getInputStream())); 

      String inputLine; //Used to read in lines from webpage 
      boolean found = false; //Flag set true if the exchange rate is found in all the lines    
      // 1) read in line and if it's not null and the default result has not been changed... 
      while ((inputLine = in.readLine()) != null && result == 100.0) { 
       if (found) { //..2) if found == true then we have got the correct exchange rate 
        result = Double.parseDouble(inputLine); 
       } 
       //..3) looking for the exchange rate in the lines. It's right after this string 
       if (inputLine.trim().equals("<span class=\" price\">")) { 
        found = true; 
       } 
      } 
      in.close(); //DONE. Closing connection.   

      if (!found) { 
       System.out.println("Error: Never found the currency you asked for!"); 
      } //Message if currency not found 
     } catch (MalformedURLException ex) { 
      System.out.println("MalformedURLException in getExchangeRate(): Invalid URL."); 
     } catch (NumberFormatException ex) { 
      System.out.println("NumberFormatException in getExchangeRate(): Invalid response from server."); 
     } catch (IOException ex) { 
      System.out.println("IOException in getExchangeRate(): Cannot connect to server."); 
     } 

     return result; 
    } 

} 
+0

프로세스 속도를 향상시키는 가장 간단한 방법은 작업을 ExecutorService에 제출하여 병렬로 20 개의 쿼리를 보내는 것입니다. – assylias

답변

1

나는 당신이해야 할 모든 전환에 대해 다른 사람의 웹 사이트를 반복적으로 호출하지 않을 것입니다. 이는 원치 않는 트래픽을 발생시킬뿐만 아니라 실제로 사용 정책에 위배 될 수 있습니다 (특정 사례는 확인하지 않았습니다). 귀하의 IP가 서비스에 액세스하는 것을 무작위로 차단하여 응용 프로그램을 손상시킬 수 있습니다.

최상의 방법은 (이 방법으로 서비스를 사용할 수있는 경우) 대상 통화 당 bloomberg를 호출하여 자신의 "데이터베이스"(20 자리 큰 단어)를 구축하는 것입니다. 환율을 계산하고 기억하십시오. 그런 다음 데이터베이스의 데이터를 사용하여 필요한 변환을 직접 수행하십시오. 그런 다음 결정할 수있는 유일한 방법은 각 통화에 대해 bloomberg를 다시 호출하여 데이터베이스를 업데이트하는 빈도 (하루에 한 번, 일주일에 한 번?)입니다. 하지만 과도하지 않도록주의해야합니다. :)

이 방법은 데이터베이스를 구축 한 후에는 실행하는 것이 훨씬 빠를뿐만 아니라 bloomberg에 대한 귀하의 링크가 다운되거나 귀하를 차단하거나 귀하의 웹 사이트 인터페이스를 변경하십시오. 귀하의 신청서는 마지막으로 알려진 환율을 사용하게됩니다. 당신은 다른 "공급자"에게 물러서고 대신 환율을 얻을 수 있습니다.

사이드 코멘트 : 문제가 발생하면 100.0을 반환하지 않습니다. 실제로 모든 것이 제대로 된 경우 전환에 대해 올바른 결과가 반환 될 수 있습니다. 음수 또는 0 또는 기타 불가능한 환율을 사용하십시오.

+0

"* 음수 또는 0 *"=>을 사용하거나 예외를 더 잘 던져라! – assylias