我做了个小的查询软件,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);
}
}
}
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);
}
}
}
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文件,如果文件正在访问说明有一个实例正在运行,不过不能激活窗口
怎么觉得你这个方法,肯定会返回false啊?
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");
} }
}
改造成这样了,但是窗体退出后,钩子无效。请高手看看吧
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");
}
}
}
弄了一个无窗体的,你看看吧。