HTML内の見出し一覧を取得する

import java.io.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

public class HTMLIndexMaker {
 public static void main(String[] args) {
  // ファイルを選択する
  File file = selectFile(null);
  if (file == null || file.isDirectory() || !file.canRead()) {
   // ファイルが選択されなかった・読み込めなかった
   System.exit(0);
  }

  // 選択したファイルを読み込む
  String html = getHTML(file);
  // 正規表現を用い、見出し要素を取り出す
  List<String> list = getList(html);
  // 取り出した要素を表示
  showList(list);
  // 実行終了
  System.out.println("finish..." + list.size() + "個の見出しを検出しました");
 }

 /**
  * ダイアログを開きファイルを選択する
  * 参照->http://www.javadrive.jp/tutorial/jfilechooser/index.html
  * @return 選択したファイル(非選択時はnull)
  */
 private static File selectFile(final JFrame frame) {
  JFileChooser fileChooser = new JFileChooser();
  fileChooser.setMultiSelectionEnabled(false);
  FileNameExtensionFilter filter = new FileNameExtensionFilter("HTMLファイル", "html", "htm");
  fileChooser.addChoosableFileFilter(filter);

  if (fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
   return fileChooser.getSelectedFile();
  } else {
   return null;
  }
 }

 /**
  * HTMLファイルの内容(テキスト)をStringに読み込む
  * HTMLファイルはシフトJIS(MS932)であること
  * 参考->http://www.ne.jp/asahi/hishidama/home/tech/java/file.html
  */
 private static String getHTML(final File file) {
  StringBuffer sb = new StringBuffer();
  InputStream is = null;
  Reader r = null;
  BufferedReader br = null;
  try {
   is = new FileInputStream(file);
   r = new InputStreamReader(is, "MS932");
   br = new BufferedReader(r);
   while (br.ready()) {
    sb.append(br.readLine());
   }
  } catch (Exception e) {
   throw new RuntimeException(e);
  } finally {
   if (br != null) {
    try {
     br.close();
    } catch (IOException e) {
    }
   }
   if (r != null) {
    try {
     r.close();
    } catch (IOException e) {
    }
   }
   if (is != null) {
    try {
     is.close();
    } catch (IOException e) {
    }
   }
  }
  return sb.toString();
 }

 /**
  * Stringを検索し、見出し一覧を作成する
  * 
  * @param html 検索するHTML
  * @return 見出し一覧
  */
 private static List<String> getList(final String html) {
  List<String> list = new ArrayList<String>();
  Pattern pattern = Pattern.compile("<h[1-6].+?</h[1-6]>");
  Matcher matcher = pattern.matcher(html);
  while (matcher.find()) {
   list.add(matcher.group());
  }
  return list;
 }

 /**
  * リストを表示する(デバッグ用)
  * 
  * @param list 見出し一覧
  */
 private static void showList(final List<String> list) {
  ListIterator li = list.listIterator();
  while (li.hasNext()) {
   System.out.println(li.next().toString());
  }
 }
}