web-dev-qa-db-ja.com

Java.net.MalformedURLExceptionの克服:プロトコル例外なし

温度データセットを含むNOAAWebサイトのURLを指定するプロパティを含むプロパティファイルがあります。 NOAAが新しい予測を生成するとURLが毎日変更されるため、このプロパティには[DATE_REPLACE]トークンが含まれています。

プロパティファイルで、次のように指定しています。

WEATHER_DATA_URL="http://weather.noaa.gov/pub/SL.us008001/DF.anf/DC.mos/DS.mex/RD.[DATE_REPLACE]/cy.00.txt"

PropertyHelperクラス(Java.util.Propertiesのラッパー)を使用して、名前としてWEATHER_DATA_URL、 "yyyyMMdd"として当日のURL文字列を生成するメソッドを宣言しました。日付形式、今日の日付。

public String getPropertyWithDateReplaceToken(String name, String dateFormat, Date dateToFormat)
{
    String value = this.properties.getProperty(name);

    if (StringHelper.isNullOrWhitespace(value) || !value.contains("[DATE_REPLACE]"))
    {
        throw new UnsupportedOperationException("The property value should specify the [DATE_REPLACE] token");
    }

    StringBuilder sb = new StringBuilder(value);
    int index = sb.indexOf("[DATE_REPLACE]");
    while (index != -1)
    {
        String replacement = StringHelper.getTodayAsDateString(dateFormat, dateToFormat);
        sb.replace(index, index + "[DATE_REPLACE]".length(), replacement);
        index += replacement.length();
        index = sb.indexOf(value, index);
    }

    return sb.toString();
}

次に、次のメソッドを使用して別のヘルパークラスを呼び出し、Webページからテキストを読み取ります。

public static List<String> readLinesFromWebPage(String urlText) throws Exception
{
    List<String> lines = new ArrayList<String>();
    if (StringHelper.isNullOrWhitespace(urlText))
    {
        throw new NullPointerException("URL text cannot be null or empty");
    }

    BufferedReader dataReader = null;
    try
    {
        System.out.println("URL = " + urlText);
        String trimmedUrlText = urlText.replaceAll("\\s", "");

        URL url = new URL(trimmedUrlText);
        dataReader = new BufferedReader(new InputStreamReader(url.openStream()));

        String inputLine;
        while((inputLine = dataReader.readLine()) != null)
        {
            lines.add(inputLine);
        }

        return lines; 
    }
    catch(Exception e)
    {
        logger.logThrow(Level.SEVERE, e, "Exception (" + e.getMessage() + ") attempting to " +
                "read data from URL (" + urlText + ")");
        throw e;
    }
}

ご覧のとおり、問題の原因であると期待して、生成されたURL文字列からスペースを削除しようとしました。 URL文字列は適切に生成されますが、次の例外が発生します。

Java.net.MalformedURLException: no protocol: "http://weather.noaa.gov/pub/SL.us008001/DF.anf/DC.mos/DS.mex/RD.20121219/cy.00.txt"

文字列を手動で設定すると、すべてが機能します...何が欠けていますか?

9
msomarr

プロパティファイルには、URLの値を二重引用符で囲んでいます。これらを削除します。

17
erickson