posts - 41,  comments - 40,  trackbacks - 0

          如何只運行一個實例,網上有三種方法(單模式不算):

          1、占用端口(有效,但是有端口被挪用的缺陷)

          2、檢查文件是否存在(有效,但突然停機可能有問題)

          3、使用JNI(有效,但喪失可移植性)

          我寫的和第二個原理差不多,判斷某個文件是否被占用,并且我把記錄日志、保存日志、判斷是否運行放在一起。

          你可以轉載本Blog,但是不能篡改作者名稱。

          import java.awt.event.WindowEvent;
          import java.awt.event.WindowAdapter;

          import java.io.File;
          import java.io.IOException;
          import java.io.PrintStream;
          import java.io.FileOutputStream;
          import java.io.FileNotFoundException;

          import javax.swing.JFrame;


          /*******************************************************************************
          ?*
          ?* 只運行一個實例
          ?*
          ?* Just single instance
          ?*
          ?*
          ?* Author: NeedJava
          ?*
          ?* Modified: 2007.08.29
          ?*
          ?*
          ?* 你可以使用此程序于任何地方,但請保留程序作者及注釋的完整。如果你改進了程序,
          ?*
          ?* 請在原作者后添加姓名,如:Author: NeedJava/Jack/Mike,版本及修改時間同理。
          ?*
          ?******************************************************************************/
          public final class SingleInstance
          {
          ? /*****************************************************************************
          ?? *
          ?? * 構造函數
          ?? *
          ?? ****************************************************************************/
          ? private SingleInstance()
          ? {
          ??? this( "vab", ".vab", "vab" );
          ? }


          ? public SingleInstance( String filePrefixName, String fileSuffixName, String directoryName )
          ? {
          ??? this.init( filePrefixName, fileSuffixName, directoryName );
          ? }


          ? /*****************************************************************************
          ?? *
          ?? * 原理:
          ?? *
          ?? * 用重定向將標準錯誤輸出流定向到一個日志文件,占用它,使其不能被刪除
          ?? *
          ?? * 以后的實例試圖將存在的此日志文件改名并且另存為某個文件夾下
          ?? *
          ?? * 如果成功,說明沒有程序占用它(不排除你在用它,缺陷?),正好保存日志
          ?? *
          ?? * 如果不成功,退出、renameTo命令有一箭雙雕的作用
          ?? *
          ?? ****************************************************************************/
          ? private final void init( String filePrefixName, String fileSuffixName, String directoryName )
          ? {
          ??? if( filePrefixName==null||fileSuffixName==null||directoryName==null )
          ????? {
          ??????? exitWithWarning( "Error: Invalid file name.", 10 );
          ????? }

          ??? //We need check the fileSuffixName here? From the tail?

          ??? String fileName=filePrefixName+fileSuffixName;

          ??? try{ File error=new File( fileName );

          ???????? if( error.exists() )
          ?????????? {
          ???????????? File directory=new File( directoryName );

          ???????????? String newFileName=directoryName+File.separator+convertMillisecond2DateTime( error.lastModified() )+fileSuffixName;

          ???????????? //System.out.println( newFileName );

          ???????????? if( directory.exists() )
          ?????????????? {
          ???????????????? if( directory.isDirectory() )
          ?????????????????? {
          ???????????????????? //renameTo也是好東東,既可以改名,還可以移文件
          ???????????????????? if( !error.renameTo( new File( newFileName ) ) )
          ?????????????????????? {
          ???????????????????????? exitWithWarning( "Error: The instance already exists, I will exit.", 11 );
          ?????????????????????? }
          ?????????????????? }
          ???????????????? else{ exitWithWarning( "Error: The \'"+directoryName+"\' is not a valid directory.", 21 );
          ???????????????????? }
          ?????????????? }
          ???????????? else{ if( directory.mkdirs() )
          ???????????????????? {
          ?????????????????????? //renameTo也是好東東,既可以改名,還可以移文件
          ?????????????????????? if( !error.renameTo( new File( newFileName ) ) )
          ???????????????????????? {
          ?????????????????????????? exitWithWarning( "Error: The instance already exists, I will exit.", 11 );
          ???????????????????????? }
          ???????????????????? }
          ?????????????????? else{ exitWithWarning( "Error: Failed to create the \'"+directoryName+"\' directory.", 22 );
          ?????????????????????? }
          ???????????????? }
          ?????????? }

          ???????? //重定向標準錯誤輸出流,所有功能全靠它。來,啵一個
          ???????? System.setErr( new PrintStream( new FileOutputStream( fileName ) ) );
          ?????? }
          ??? catch( FileNotFoundException fnfe )
          ???????? {
          ?????????? //fnfe.printStackTrace();

          ?????????? exitWithWarning( fnfe.toString(), 23 );
          ???????? }
          ??? catch( IOException ioe )
          ???????? {
          ?????????? //ioe.printStackTrace();

          ?????????? exitWithWarning( ioe.toString(), 29 );
          ???????? }
          ??? catch( Exception e )
          ???????? {
          ?????????? //e.printStackTrace();

          ?????????? exitWithWarning( e.toString(), 99 );
          ???????? }
          ? }


          ? /*****************************************************************************
          ?? *
          ?? * You can change the milliseconds to the date and time string here
          ?? *
          ?? * I just return the original
          ?? *
          ?? * Don't get the same string :)
          ?? *
          ?? ****************************************************************************/
          ? private final String convertMillisecond2DateTime( long millisecond )
          ? {
          ??? return ""+millisecond;
          ? }


          ? /*****************************************************************************
          ?? *
          ?? * Return the warning and the exit code, then exit the application
          ?? *
          ?? ****************************************************************************/
          ? private final void exitWithWarning( String warning, int code )
          ? {
          ??? System.out.println( warning==null ? "" : warning );

          ??? System.exit( code );
          ? }


          ? /*****************************************************************************
          ?? *
          ?? * 主函數入口
          ?? *
          ?? ****************************************************************************/
          ? public final static void main( String[] args )
          ? {
          ??? SingleInstance si=new SingleInstance( "error", ".txt", "error" );

          ??? final JFrame frame=new JFrame( "Just single instance. By NeedJava. 2007.08.29" );

          ??? //I stay here, to make some friends happy.
          ??? frame.addWindowListener( new WindowAdapter()
          ??? {
          ????? public void windowClosing( WindowEvent we )
          ????? {
          ??????? frame.dispose();

          ??????? System.exit( 0 );
          ????? }
          ??? } );

          ??? frame.setBounds( 200, 200, 700, 70 );

          ??? frame.setVisible( true );
          ? }
          }

          posted on 2007-08-29 22:11 NeedJava 閱讀(3211) 評論(8)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 东至县| 青浦区| 周口市| 苏尼特左旗| 当阳市| 道真| 军事| 贡觉县| 吴旗县| 黎平县| 孝昌县| 綦江县| 景德镇市| 修水县| 凤山市| 遂溪县| 藁城市| 沙田区| 尤溪县| 宜兰县| 南陵县| 霍州市| 安龙县| 定襄县| 固镇县| 荥经县| 汪清县| 浦城县| 西林县| 佛学| 泰顺县| 合山市| 正镶白旗| 金湖县| 闸北区| 衢州市| 张家港市| 乌拉特中旗| 乐平市| 新巴尔虎左旗| 丽水市|