Javaで簡易的にHTTPアクセスするならURLクラスとHttpURLConnectionを使えば簡単にできます。ただし、URLクラスのコンストラクタがJava 20で非推奨になったためURIクラスを経由することになります。URLAccessSampleというファイルを作り以下の内容で保存し、コンパイルして実行すると私のブログのRSSフィードが表示されるはずです。URLからopenConnectionまでの流れで例外が発生するのと、そのあとのgetInputStreamでまた例外が発生するので1つのtry文で囲えばいいのですがgetInputStreamのところでtry-with-resouces文を使いたかったのでtryがネストしています。
import java.net.URI; import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.io.IOException; import java.net.MalformedURLException; public class URLAccessSample{ public static void main(String... args){ try{ var url = URI.create("https://d-kami.hatenablog.com/rss").toURL(); var connection = url.openConnection(); try(var reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))){ reader.lines().forEach(System.out::println); }catch(IOException e){ System.out.println("Webページのアクセス中にエラーが発生しました。"); e.printStackTrace(); } }catch(MalformedURLException e){ System.out.println("URLの形式が間違っています"); e.printStackTrace(); }catch(IOException e){ System.out.println("コネクションに失敗しました。"); e.printStackTrace(); } } }
試しにJava Stream APIで絞り込みや加工をしてみましょう。Java Stream APIに関してはJava Stream APIをいまさら入門 #java8 – Qiitaが参考になります。
import java.net.URI; import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.io.IOException; import java.net.MalformedURLException; public class URLAccessSample{ public static void main(String... args){ try{ var url = URI.create("https://d-kami.hatenablog.com/rss").toURL(); var connection = url.openConnection(); try(var reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))){ reader.lines().filter(s -> s.indexOf("<title>") > -1).map(s -> s.replaceAll("</?title>", "").trim()).forEach(System.out::println); }catch(IOException e){ System.out.println("Webページのアクセス中にエラーが発生しました。"); e.printStackTrace(); } }catch(MalformedURLException e){ System.out.println("URLの形式が間違っています"); e.printStackTrace(); }catch(IOException e){ System.out.println("コネクションに失敗しました。"); e.printStackTrace(); } } }
このソースコードではまず、filterで<title>を含んでいる行だけを抽出してmapで<title>もしくは</title>をreplaceAllで除外してからtrimで空白を取り除いています。あとはforEachで表示させるだけです。