You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java循环检测CAD文件打开状态及跨类访问布尔值问题求助

我来帮你搞定这个问题,咱们一步步重构代码,实现循环检测CAD文件状态、支持跨类访问的需求:

核心问题分析

你当前的代码是单次检测,而且状态变量logical只在main方法里有效,没法被其他类访问。我们需要把检测逻辑封装成可复用的类,用成员变量保存状态,同时实现循环检测的逻辑。

重构后的完整代码

1. 封装检测逻辑的AutoCadCheck类

这个类负责CAD文件的状态检测、循环监控,并提供状态访问的接口:

import java.io.InputStream;
import java.util.Scanner;

public class AutoCadCheck {
    // 用更直观的命名:true表示CAD文件未打开,false表示已打开
    private volatile boolean isCadFileClosed;
    // 目标CAD文件名称,可根据需求修改
    private final String targetDwg = "123-4567.dwg";
    // tasklist命令返回的"无匹配"提示文本
    private final String noMatchMessage = "INFO: No tasks are running which match the specified criteria";

    public AutoCadCheck() {
        // 初始化时先做一次检测
        this.isCadFileClosed = checkCadStatus();
    }

    // 单次检测CAD文件状态的私有方法
    private boolean checkCadStatus() {
        // 补全命令末尾的双引号,避免语法错误
        String command = String.format("tasklist /fi \"windowtitle eq Autodesk AutoCAD 2017 - [%s]\"", targetDwg);
        
        // 用try-with-resources自动关闭流,避免资源泄漏
        try (InputStream inputStream = Runtime.getRuntime().exec(command).getInputStream();
             Scanner scanner = new Scanner(inputStream)) {

            StringBuilder output = new StringBuilder();
            while (scanner.hasNextLine()) {
                output.append(scanner.nextLine()).append(System.lineSeparator());
            }
            return output.toString().contains(noMatchMessage);
        } catch (Exception e) {
            e.printStackTrace();
            // 出现异常时默认认为文件未打开(可根据需求调整)
            return true;
        }
    }

    // 启动循环检测:放在独立线程中,避免阻塞主线程
    public void startContinuousCheck() {
        new Thread(() -> {
            while (isCadFileClosed) {
                // 每隔2秒检测一次,可根据需求调整间隔
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
                // 更新状态
                isCadFileClosed = checkCadStatus();
                // 可选:打印检测日志
                if (isCadFileClosed) {
                    System.out.println("DWG未打开,继续检测...");
                } else {
                    System.out.println("DWG已打开!");
                }
            }
        }).start();
    }

    // 给其他类提供状态访问的getter方法
    public boolean isCadFileClosed() {
        return isCadFileClosed;
    }

    // 测试用的main入口
    public static void main(String[] args) {
        AutoCadCheck cadChecker = new AutoCadCheck();
        cadChecker.startContinuousCheck();

        // 模拟另一个类的访问逻辑
        AnotherClass anotherClass = new AnotherClass(cadChecker);
        anotherClass.startMonitoring();
    }
}

2. 访问状态的另一个类AnotherClass

这个类通过持有AutoCadCheck的实例,实时获取CAD文件状态:

public class AnotherClass {
    private final AutoCadCheck cadChecker;

    public AnotherClass(AutoCadCheck cadChecker) {
        this.cadChecker = cadChecker;
    }

    // 启动状态监控
    public void startMonitoring() {
        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
                // 检测CAD是否已打开(即isCadFileClosed为false)
                if (!cadChecker.isCadFileClosed()) {
                    System.out.println("AnotherClass检测到:DWG已打开!执行指定操作...");
                    // 这里写你需要执行的逻辑
                    break; // 执行完后退出循环,也可以根据需求持续监控
                }
            }
        }).start();
    }
}

关键细节说明

  • volatile关键字:修饰isCadFileClosed,确保多线程下状态的可见性(检测线程和访问线程能实时同步状态)。
  • 资源自动管理:用try-with-resources自动关闭输入流,比手动close更安全,避免资源泄漏。
  • 线程隔离:循环检测和跨类监控都放在独立线程中,不会阻塞主线程,保证程序的响应性。
  • 命名可读性:把模糊的logical改成isCadFileClosed,让代码含义更清晰。

内容的提问来源于stack exchange,提问作者Moist Carrot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:14