我做了个小的查询软件,swing、access,我想让这个程序在一台电脑上只运行一个,再启动程序的话并不会新开一个,而是会把最小化的程序激活。我查了很多资料,有端口法和锁定文件法,端口的我试了2天也不行,pass了,现在是锁定文件的方法我没调明白,下面是我写的一个小示例程序,直接可以运行,但是没有效果,可以执行多个,我很纳闷,请高手指教!
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;import javax.swing.JFrame;
import javax.swing.JOptionPane;import ccpsic.test7;public class TestSQL extends JFrame{
        public TestSQL(){
                super("只运行一个");
        }
        private static boolean lockInstance(final String lockFile) { 
            try { 
                final File file = new File(lockFile); 
                final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); 
                final FileLock fileLock = randomAccessFile.getChannel().tryLock(); 
                if (fileLock != null) { 
                    Runtime.getRuntime().addShutdownHook(new Thread() { 
                        public void run() { 
                            try { 
                                fileLock.release(); 
                                randomAccessFile.close(); 
                                file.delete(); 
                            } catch (Exception e) { 
                                System.out.println("出错了1");
                            } 
                        } 
                    }); 
                    return false; 
                } 
            } catch (Exception e) { 
                    System.out.println("出错了2");
            } 
            return true; 
        } 
        public static void main(String a[]){
                if(lockInstance("11")){
                        TestSQL t1=new TestSQL();
                        t1.setVisible(true);
                }
                else{
                        JOptionPane.showMessageDialog(null,"不好使!","关于",JOptionPane.INFORMATION_MESSAGE); 
                        System.exit(0);
                }
                        
                
                
        }
}

解决方案 »

  1.   

    换种思路:两种方法结合。把第一次打开的java程序变成一个服务器,监听某个端口。第二次打开的程序,连接成功的话就退出,同时发送一个消息到第一个打开的程序,让他激活。至于怎么把第一个变成服务器,第二个变成客户端呢,这个,用文件来配置。试试看。我没试过。
      

  2.   

    java code:
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;public class Main {    private static File  = new File("test.txt");    public static void main(String[] args) throws IOException {// 如果标记文件存在且不可删除,表示有其他的程序正在运行,程序退出
            if (.exists() && !.delete()) {
                System.out.println("the program is already running...");
                System.exit(0);
            }
            createfile();
            dosomething();
        }    private static void dosomething() {
            System.out.println("do my own work...");
            try {
                Thread.sleep(100000);
            } catch (InterruptedException ex) {
            }
        }    /** * 打开一个文件,并以写入的方式打开文件,运行时一直保持此文件不关闭, * 程序退出时再关掉文件。 */
        private static void createfile() {
            try {
                final FileOutputStream out = new FileOutputStream();
                Runtime.getRuntime().addShutdownHook(new Thread() {                @Override
                    public void run() {
                        try {
                            out.close();
                        } catch (IOException ex) {
                        }
                    }
                });
                out.write("".getBytes());
            } catch (IOException ex) {
            }
        }
    }Netbeans开发工具就是类型这种功能,他会的你的用户目录下生成一个.netbeans文件,如果文件正在访问说明有一个实例正在运行,不过不能激活窗口
      

  3.   

    FileLock不懂,addShutdownHook不懂。
    怎么觉得你这个方法,肯定会返回false啊?
      

  4.   

    package com.xuz.csdn.worldcup.day11;import java.io.File;import javax.swing.JFrame;public class TestSQL extends JFrame{
    private static final long serialVersionUID = 1L; public TestSQL() {
    super("只运行一个");
    } private static boolean lockInstance(final String lockFile) {
    try {
    final File file = new File(lockFile);
    if (file.exists()) {
    return false;
    } else {
    Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
    try {
    file.delete();
    } catch (Exception e) {
    System.out.println("出错了1");
    }
    }
    });
    file.createNewFile();
    }
    } catch (Exception e) {
    System.out.println("出错了2");
    }
    return true;
    } public static void main(String a[]) {
    if (lockInstance("d:/1.txt")) {
    TestSQL t1 = new TestSQL();
    t1.setVisible(true);
    } else {
    System.out.println("fail");
    } }
    }
    改造成这样了,但是窗体退出后,钩子无效。请高手看看吧
      

  5.   

    package com.xuz.csdn.worldcup.day11;import java.io.File;public class TestSQL { public TestSQL() {
    System.out.println("只运行一个");
    } private static boolean lockInstance(final String lockFile) {
    try {
    final File file = new File(lockFile);
    if (file.exists()) {
    return false;
    } else {
    Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
    try {
    file.delete();
    } catch (Exception e) {
    System.out.println("出错了1");
    }
    }
    });
    file.createNewFile();
    }
    } catch (Exception e) {
    System.out.println("出错了2");
    }
    return true;
    } public static void main(String a[]) {
    if (lockInstance("d:/1.txt")) {
    while(true){

    }
    } else {
    System.out.println("fail");
    }
    }
    }
    弄了一个无窗体的,你看看吧。