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 閱讀(3219) 評論(8)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 丰顺县| 巴林左旗| 肃宁县| 邓州市| 中牟县| 五莲县| 宁陕县| 扬中市| 博白县| 洞头县| 余干县| 峨山| 琼中| 普洱| 神木县| 富川| 旬邑县| 马龙县| 儋州市| 资兴市| 泗洪县| 阜平县| 中江县| 靖江市| 呼图壁县| 凤庆县| 郎溪县| 疏附县| 鹤壁市| 密山市| 云阳县| 淮阳县| 合作市| 绥宁县| 长武县| 额尔古纳市| 甘洛县| 蒲江县| 高台县| 阿克陶县| 平乡县|