2012年8月12日日曜日

正規表現:基本

^ 行の先頭 
  
  
[ ]指定内の任意の表現
[ab]

aまたはbにマッチする

 

 
 メタ文字
\s任意の空白文字(スペース、タブ、改行、復帰)1文字にマッチします。
[^\\s]

先頭の空白文字位置文字にマッチする。
 
*直前にある文字が0回以上繰り返された文字列にマッチします。0回でも可なので直前の文字が存在しなくてもマッチする。

2012年8月2日木曜日

ライブ配信送信側のJavaプログラム:JMF


受信側プログラムはJMStudioを利用

import javax.media.*;
import javax.media.control.*;
import javax.media.protocol.*;
import javax.media.format.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class TransmitterTest extends JFrame {

    private MediaLocator mediaLocator = null;
    private DataSink dataSink = null;
    private Processor mediaProcessor = null;
    private Format[] formats = new Format[] {
        new VideoFormat( VideoFormat.JPEG_RTP ) };
    private ContentDescriptor descriptor = 
        new ContentDescriptor( ContentDescriptor.RAW_RTP );
    private InputPanel ipanel;
    private static final int PORT=22224;
    private Component ctrl;

  /** Creates a new transmitter frame. */
    public TransmitterTest() {

        super( "Video Transmitter" );
        ipanel = new InputPanel();
        getContentPane().add( ipanel, "Center" );
        pack();
        show();
    }

  /** set locator from Capture Device */
    public void setLocator() {
        try {
            MediaLocator deviceLocator = searchCaptureDevice();
            DataSource source
                = Manager.createDataSource( deviceLocator );
            mediaLocator
             = new MediaLocator( "rtp://" + ipanel.host.getText()
                                  + ":" + PORT + "/video" );
            mediaProcessor = Manager.createRealizedProcessor(
                new ProcessorModel( source, formats, descriptor ) );
            dataSink = Manager.createDataSink(
                   mediaProcessor.getDataOutput(), mediaLocator );

            setControlPanel();
            startTransmitting();
                
        } catch (Exception e) {
            System.err.println( e.toString() );
        }
    }

  /** Search Capture Device for Video */
    public static MediaLocator searchCaptureDevice() {

         Vector list = CaptureDeviceManager.getDeviceList(
                       new VideoFormat( VideoFormat.YUV ) );
         if( list.size() > 0 ) {
             CaptureDeviceInfo info
               = (CaptureDeviceInfo)list.elementAt( 0 );
             return  info.getLocator();
         }
         System.err.println( "No Capture Device" );
         return null;
    }

  /** set Control */
    public void setControlPanel() {

        ctrl = mediaProcessor.getControlPanelComponent();
        getContentPane().add( ctrl, "South" );
        pack();
    }

  /** Starts transmitting the media. */
    public void startTransmitting() throws IOException {

        mediaProcessor.start();
        dataSink.open();
        dataSink.start();
    }

  /** start here */
    public static void main(String[] args) {

        TransmitterTest transmitter = new TransmitterTest();
    }

  /** Input receive host name, port number */
    class InputPanel extends JPanel implements ActionListener {

         public JLabel label = new JLabel( "Receiver Adress:" );
         public JTextField host = new JTextField( "", 16 );
         public JButton transmit = new JButton( "Transmit" );

         InputPanel() {
              add( label );
              add( host );
              add( transmit );
              transmit.addActionListener( this );
         }

      /** Event Processing */
         public void actionPerformed( ActionEvent evt ) {

              if( evt.getSource() instanceof JButton ) {
                  if( (JButton)(evt.getSource()) == transmit ) {
                      setLocator();
                  }
              }
         }
    }
}

2012年7月11日水曜日

末尾の改行コード削除

正規表現で末尾の文字列を削除する。
  Pattern pattern = Pattern.compile("\n$");
  
  Matcher matcher = pattern.matcher("Hello World. Hello World.\n");
  
  String strResult = matcher.replaceAll("");
  
  System.out.println(strResult);

SyntaxHighlighter のバージョンアップ

SyntaxHighlighter を Version: 1.5.1 から version 3.0.83 にバージョンアップしてみる。
どちらのバージョンからの文法でも動くようにする。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>dp.SyntaxHighlighter Tests</title>
  <script type="text/javascript" src="scripts3/shCore.js"></script>
  <script type="text/javascript" src="scripts3/shLegacy.js"></script>
  <script type="text/javascript" src="scripts3/shBrushJava.js"></script>
  <link type="text/css" rel="stylesheet" href="styles3/shCoreDefault.css"/>
 </head>
 <body>
  <pre name="code" class="java">
function helloSyntaxHighlighter()
{
 return "hi!";
}
</pre>

  <pre class="brush: java;">
function helloSyntaxHighlighter()
{
 return "hi!";
}
</pre>


  <script type="text/javascript">
   SyntaxHighlighter.all();
   dp.SyntaxHighlighter.HighlightAll('code');

  </script>
 </body>
</html>

function helloSyntaxHighlighter()
{
 return "hi!";
}

function helloSyntaxHighlighter()
{
 return "hi!";
}


2012年7月3日火曜日

ライブ配信受信側のJavaプログラム:JMF

送信側は JMStudio を使って、USBカメラの映像を送信する。
送信の設定は ライブ配信テスト:JMF で確認。

import javax.media.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

/** Media Frame */
public class ReceiverTest extends JFrame {

    private Player player = null;
    private InputPanel ipanel;
    private Component canvas;
    private Component panel;
    private static final int PORT = 22224;

    public ReceiverTest() {

        super( "RTP Receiver" );
        ipanel = new InputPanel();
        getContentPane().add( ipanel, "North" );
        pack();
    }

  /** start play */
    public void startPlayer() {
        try {
            MediaLocator locator
              = new MediaLocator( "rtp://" + ipanel.host.getText()
                         + ":" + PORT + "/video" );
            player = Manager.createRealizedPlayer( locator );
            canvas = player.getVisualComponent();
            if ( canvas != null) {
                 getContentPane().add( canvas, "Center" );
            }
            panel = player.getControlPanelComponent();
            if ( panel != null) {
                 getContentPane().add( panel, "South" );
            }
            pack();
            player.start();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

  /** start here */
    public static void main(String[] args) {
        try {
            ReceiverTest frame = new ReceiverTest(); 
            frame.show();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

  /** Input receive host name, port number */
    class InputPanel extends JPanel implements ActionListener {

         public JLabel label = new JLabel( "Transmitter Adress:" );
         public JTextField host = new JTextField( "", 16 );
         public JButton receive = new JButton( "Receive" );

         InputPanel() {

              add( label );
              add( host );
              add( receive );
              receive.addActionListener( this );
         }

      /** Event Processing */
         public void actionPerformed( ActionEvent evt ) {

              if( evt.getSource() instanceof JButton ) {
                  if( (JButton)(evt.getSource()) == receive ) {
                      startPlayer();
                  }
              }
          }
     }
}



ライブ配信テスト:JMF

JMF をインストールしたときに入っている、JMStudio でライブ配信テストをやってみる。

怒涛のめもめもリンク集
JMF: JMStudioでRTP試し に詳しく解説してある。

JMStudio で送信側と受信側のテストが出来る。

一台のパソコンで送信側と受信側のテストをしてみる。

送信側の設定
JMStudio を起動させて、File から Transmit.. を選択する。


Caputure..をクリックする。
OK をクリックする
Next>> をクリックする。


Next>> をクリックする。

Finish をクリックする。

送信を確認する画面が表示される。


受信側の設定
JMStudio をもう一回起動させる。
File から Open RTP Session..をクリックする。


アドレスを入力して Open をクリックする。

送られた画像が表示された。

javaでUSBカメラを使う:JMF

JMF をインストールしたときに入っている、JMStudio でUSBカメラが利用できるか確認してみる。

JMStudio を起動させる。

ファイルから Cupture を選択する

OKをクリックする。

USBカメラの映像が表示される

USBカメラが利用出来る事が確認できたので、今度はJava プログラムから利用してみる。

import javax.media.*;
import javax.swing.*;

public class jmf {
    public static void main(String args[]) throws Exception {
        JFrame frame = new JFrame("ImageView");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Player player = Manager.createRealizedPlayer(new MediaLocator("vfw://0"));
        frame.setBounds(100, 100, 640, 480);
        frame.getContentPane().add(player.getVisualComponent());
        frame.setVisible(true);
        player.start();
    }
}

Eclipseにjar追加 C:\Program Files (x86)\JMF2.1.1e\lib の中のjar ファイルをEclipseの メニューのプロジェクト->プロパティー->Java のビルド・パス->ライブラリの外部Jarの追加ボタンから追加する。

プログラムを実行すると、カメラ映像が表示される。


2012年7月1日日曜日

JMFをWindows 7,64bit,Eclipseでインストール

1.jdk 32bit版のインストール
すでに64bit版がインストールしている場合でも、インストールする。

2.JMFをダウンロードしてくる。
ダウンロードサイト:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#7372-jmf-2.1.1e-oth-JPR

ダウンロードしたファイル:jmf-2_1_1e-windows-i586.exe


ダウンロードしたファイルをダブルクリックしてインストール。
解凍からインストールに進まない場合は、jdk 32bitのインストールが完了していない場合があります。

インストールが完了したらデスクトップにJMStudioのアイコンが表示される。




3.Eclipseにjar追加
C:\Program Files (x86)\JMF2.1.1e\lib の中のjar ファイルをEclipseの
メニューのプロジェクト->プロパティー->Java のビルド・パス->ライブラリの外部Jarの追加ボタンから追加する。

2012年6月13日水曜日

テーブルの作成:Java Sqlite

//テーブルを作成
stmt.execute( "create table data( id INTEGER )" );

//テーブルが無い場合に作成
stmt.execute("create table if not exists data ( id INTEGER )");

2012年6月12日火曜日

サーバソケット

import java.io.*;
import java.net.*;

public class echoServer {
    public static void main(String args[]) {
        // ソケットや入出力用のストリームの宣言
        ServerSocket echoServer = null;
        Socket clientSocket = null;
        
        String line;
        BufferedReader is;
        PrintStream os;
        
        // ポート9999番を開く
        try {
         //待ち受けポートを指定して新しいサーバソケットを生成しています。
            echoServer = new ServerSocket(9999);
            System.out.println("EchoServerが起動しました(port=" + echoServer.getLocalPort() + ")");
            
            //acceptメソッドを呼び出し、クライアントからの接続待機状態に入ります。クライアントからの接続要求があると、socketにはクライアントとの通信に利用できるSocketのインスタンスが代入されます。
            clientSocket = echoServer.accept();
            System.out.println("接続されました "+ clientSocket.getRemoteSocketAddress() );
            
            is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            os = new PrintStream(clientSocket.getOutputStream());

            // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
            while ( (line = is.readLine()) != null ) {
                System.out.println("受信: " + line);
                os.println(line);
                System.out.println("送信: " + line);
              }
        }
        catch (IOException e) {
            System.out.println(e);
        }
        
    }
}
import java.io.*;
import java.net.*;

public class echoClient {
    public static void main(String[] args) {
        // ソケットや入出力用のストリームの宣言
        Socket echoSocket = null;
        DataOutputStream os = null;
        BufferedReader is = null;

        // ポート9999番を開く
        try {
            echoSocket = new Socket("localhost", 9999);
            os = new DataOutputStream(echoSocket.getOutputStream());
            is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: localhost");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: localhost");
        }

        // サーバーにメッセージを送る
        if (echoSocket != null && os != null && is != null) {
            try {
                // メッセージを送ります
                os.writeBytes("HELLO\n");

                // サーバーからのメッセージを受け取り画面に表示します
                String responseLine;
                if ((responseLine = is.readLine()) != null) {
                    System.out.println("Server: " + responseLine);
                }

                // 開いたソケットなどをクローズ
                os.close();
                is.close();
                echoSocket.close();
            } catch (UnknownHostException e) {
                System.err.println("Trying to connect to unknown host: " + e);
            } catch (IOException e) {
                System.err.println("IOException: " + e);
            }
        }
    }
}

2012年5月26日土曜日

SQLlite:グループ化

検索対象データベース

集計関数
MAX 最大値
MIN 最小値
AVG 平均値
COUNT データの個数

合計(Sum)
name別にpriceの合計を計算して表示
ResultSet rs = stmt.executeQuery("SELECT name,Sum(name) FROM data GROUP BY name "); 

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("price = " + rs.getInt(2));
}

結果:
name = いちご
price = 110
name = りんご
price = 201

データの個数(Count)
ResultSet rs = stmt.executeQuery("SELECT name,Count(name) FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("count = " + rs.getInt(2));
}

結果:
name = いちご
count= 1
name = りんご
count= 2


複数の集計関数を指定
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price),Avg(price) FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt(2));
 System.out.println("平均 = " + rs.getFloat(3));
}

結果:
name = いちご
合計 = 110
平均 = 110.0
name = りんご
合計 = 201
平均 = 100.5

列名の指定(AS)
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price) AS '合計' FROM data GROUP BY name ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt("合計"));
}

特定の集計行のみの表示(HAVING)
ResultSet rs = stmt.executeQuery("SELECT name,Sum(price) AS '合計' FROM data GROUP BY name HAVING Sum(price) > 200 ");

while (rs.next()) {
 System.out.println("name = " + rs.getString("name"));
 System.out.println("合計 = " + rs.getInt("合計"));
}

結果:
name = りんご
合計 = 201

SQLlite:並べ替え

ORDER BY句
カラム名を指定して並べ替え
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101
id = 2
date = 5/24
name = いちご
price = 110


ORDER BY句 昇順
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price ASC ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101
id = 2
date = 5/24
name = いちご
price = 110


ORDER BY句 降順
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price DESC ");

結果:
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101
id = 1
date = 5/25
name = りんご
price = 100

ORDER BY句 複数カラムの指定
ResultSet rs = stmt.executeQuery("SELECT * FROM data ORDER BY price,id ");

指定を省略した場合は昇順
text型とimage型の列は指定できない。


2012年5月25日金曜日

SQLlite:検索

検索対象のデータベース


テーブルのデータ表示
ResultSet rs = stmt.executeQuery( "select * from data" );

表示:
Class.forName("org.sqlite.JDBC");
Connection connection = null;
// データベースに接続 なければ作成される
String databaseFullPass = "jdbc:sqlite:" + "E:/yamato/tvData/test.db";

connection = DriverManager.getConnection( databaseFullPass );
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( "select * from data");

while( rs.next() ) {
    System.out.println("id = " + rs.getInt("id"));
    System.out.println("date = " + rs.getString("date"));
    System.out.println("name = " + rs.getString("name"));
  System.out.println("price = " + rs.getInt("price"));
}

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101

WHERE句の使い方
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご'");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+AND
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price = '101'");

結果:
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+OR
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' OR price = '110'");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110
id = 3
date = 5/23
name = りんご
price = 101

WHERE句+NOT
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE NOT name = 'りんご' ");

結果:
id = 2
date = 5/24
name = いちご
price = 110

WHERE句+比較演算子
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price = '100'  ");

priceが50以上101未満のデータを抽出
priceのデータ型がINTEGERでないと範囲指定できない。
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name = 'りんご' AND price > 50 and price < 101 ");

結果:
id = 1
date = 5/25
name = りんご
price = 100

WHERE句+BETWEEN条件
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE price BETWEEN 50 and 100 ");

結果:
id = 1
date = 5/25
name = りんご
price = 100

IN条件
指定した値のリストにマッチするか
ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE price IN ( 100 , 110) ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 2
date = 5/24
name = いちご
price = 110

LIKE条件
文字の検索条件を指定する。
%は「任意の文字数の任意の文字」
_は「1文字の任意の文字」,_は一文字にマッチ

__ 2文字の任意の文字列
a__b aで始まりbで終わる4文字の文字列


例:
name LIKE 'a%'は、nameがaで始まる任意の長さの文字列
name LIKE 'a%b'は、nameがaで始まりbで終わる任意の長さの文字列

name LIKE 'a_'は、nameがaで始まる2文字の文字列
name LIKE 'a_%b'は、nameが aで始まりbで終わる3文字以上の任意の長さの文字列

ResultSet rs = stmt.executeQuery("SELECT * FROM data WHERE name LIKE 'り%' ");

結果:
id = 1
date = 5/25
name = りんご
price = 100
id = 3
date = 5/23
name = りんご
price = 101


2012年5月24日木曜日

javacコマンドで文字コード指定


D:\lab\Java> javac -encoding UTF-8 Test.java


:16: エラー: この文字は、エンコーディングMS932にマップできません
               // TODO 閾ェ蜍慕函謌舌&繧後◆ catch 繝悶Ο繝?け

2012年5月22日火曜日

カッコで囲まれている文字の取得

String regex = "\\((.+?)\\)";//正規表現で指定
String target = "(abc)def(ghi)jkl";
List<String> omaewamoshindeiru = new ArrayList<String>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(target);
while (matcher.find()) {
    omaewamoshindeiru.add(matcher.group(1));
}
System.out.println( omaewamoshindeiru.get(0) );//abc

2012年5月17日木曜日

WebDriver:特定のリンクアドレスを取得する

gooで始まるリンクアドレスを取得する。

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  // 検索結果のURLを取得
  WebElement link = driver.findElement(By.partialLinkText("goo"));
  System.out.println(link.getAttribute("href"));
 }
}


検索結果:
https://www.google.co.jp/

WebDriver:ページのリンクを取得する

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  // Aタグを取得
  List<WebElement> cheese = driver.findElements(By.tagName("a"));

  // 取得した要素の0番目のリンクアドレス
  System.out.println(cheese.get(0).getAttribute("href"));
  
  // 取得した要素の0番目のリンクテキスト
  System.out.println(cheese.get(0).getText());
 }
}

WebDriver:IDを指定してテキストを取得する

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  // ブラウザ(Firefox)を起動
  // WebDriver driver = new FirefoxDriver();
  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  WebElement addDynamicElement = driver.findElement(By.id("add"));

  String actual = addDynamicElement.getText();
  
  System.out.println( actual );

 }
}

WebDriver:ページのタイトル取得

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class firefoxTest {

 public static void main(String[] args) {

  // ブラウザ(Firefox)を起動
  // WebDriver driver = new FirefoxDriver();
  WebDriver driver = new HtmlUnitDriver();

  // URLを開く
  driver.get("http://127.0.0.1/~yamato/fx7/WebDriverTest/index.html");

  System.out.println(driver.getTitle());

 }
}

WebDriver 準備

selenium-java-2.21.0.zip をダウンロードする。

解凍する。
selenium-java-2.21.0.jar と
libs フォルダのの中のファイルをプロジェクトのjavaビルドパスに追加する。

参考
その他のhtmlテストツール
HtmlUnit
HttpUnit::Httpプロトコルのテストを重視した作り


2012年1月21日土曜日

名前の一括変更


名前の一括変更 : Alt + Shift + R

HTMLEditorKit 基本情報

一行ずつ処理するのに便利

http://java.sun.com/j2se/1.3/ja/docs/ja/api/javax/swing/text/html/HTMLEditorKit.html


クラス HTMLEditorKit.ParserCallback
handleStartTag  は、開始タグと終了タグを持つタグを取得する。
handleEndTag   は、開始タグと終了タグを持つタグを取得する。
handleSimpleTag は、終了タグを持たないタグを取得する。
handleText    は、HTMLの文字列の取得・処理を行います。
handleComment  は、コメントを取得する。
handleEndOfLineString は、ストリームの末尾を取得する。
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.ParserDelegator;
import java.io.*;

public class HtmlParser{

 public static void main(String[] args){
  HtmlParser p = new HtmlParser();
  p.exec();
 }

 public void exec() {
  Reader reader;
  try {

   FileInputStream is = new FileInputStream("E:/html/text.html");
   InputStreamReader in = new InputStreamReader(is, "SJIS");

   reader = new BufferedReader(in);

   MyParserCallback cb = new MyParserCallback();
   ParserDelegator pd = new ParserDelegator();
   pd.parse(reader, cb, true);
   reader.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 class MyParserCallback extends HTMLEditorKit.ParserCallback {
  public void handleStartTag(HTML.Tag tag, MutableAttributeSet attr, int pos){
   System.out.println("スタートタグが呼ばれました");

  }
  public void handleText(char[] data, int pos) {
   System.out.println( new String(data) );
        }

  public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet attr,int pos) {
   System.out.println("--------------  終了タグを持たないタグが呼ばれました");
  }
 }

}