posts - 41,  comments - 40,  trackbacks - 0

          如何只運(yùn)行一個(gè)實(shí)例,網(wǎng)上有三種方法(單模式不算):

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

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

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

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

          你可以轉(zhuǎn)載本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;


          /*******************************************************************************
          ?*
          ?* 只運(yùn)行一個(gè)實(shí)例
          ?*
          ?* Just single instance
          ?*
          ?*
          ?* Author: NeedJava
          ?*
          ?* Modified: 2007.08.29
          ?*
          ?*
          ?* 你可以使用此程序于任何地方,但請(qǐng)保留程序作者及注釋的完整。如果你改進(jìn)了程序,
          ?*
          ?* 請(qǐng)?jiān)谠髡吆筇砑有彰纾篈uthor: NeedJava/Jack/Mike,版本及修改時(shí)間同理。
          ?*
          ?******************************************************************************/
          public final class SingleInstance
          {
          ? /*****************************************************************************
          ?? *
          ?? * 構(gòu)造函數(shù)
          ?? *
          ?? ****************************************************************************/
          ? private SingleInstance()
          ? {
          ??? this( "vab", ".vab", "vab" );
          ? }


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


          ? /*****************************************************************************
          ?? *
          ?? * 原理:
          ?? *
          ?? * 用重定向?qū)?biāo)準(zhǔn)錯(cuò)誤輸出流定向到一個(gè)日志文件,占用它,使其不能被刪除
          ?? *
          ?? * 以后的實(shí)例試圖將存在的此日志文件改名并且另存為某個(gè)文件夾下
          ?? *
          ?? * 如果成功,說明沒有程序占用它(不排除你在用它,缺陷?),正好保存日志
          ?? *
          ?? * 如果不成功,退出、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 );
          ?????????????????????? }
          ???????????????? }
          ?????????? }

          ???????? //重定向標(biāo)準(zhǔn)錯(cuò)誤輸出流,所有功能全靠它。來,啵一個(gè)
          ???????? 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 );
          ? }


          ? /*****************************************************************************
          ?? *
          ?? * 主函數(shù)入口
          ?? *
          ?? ****************************************************************************/
          ? 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) 評(píng)論(8)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阳原县| 泾川县| 乐亭县| 大冶市| 浦江县| 防城港市| 霞浦县| 墨脱县| 临清市| 连州市| 开远市| 娱乐| 定西市| 吉木萨尔县| 龙游县| 上虞市| 赤城县| 奇台县| 岑巩县| 富顺县| 招远市| 拜泉县| 共和县| 博白县| 宝应县| 镇沅| 德格县| 凉城县| 精河县| 祁阳县| 华容县| 印江| 双柏县| 时尚| 文登市| 昌江| 大宁县| 土默特右旗| 社旗县| 蕉岭县| 唐海县|