如何判断流是否关闭?子线程能否关闭主线程的文件流?

在公司代码整改中,有个高度重视的bug,就是我在主线程中获取了一个文件流,然后将其传入异步线程中,但是主线程中并没有有关流关闭的调用,所以被扫描出有高风险,但是我在异步线程中有进行流关闭,懵逼的我还以为这样关不掉流,故写了以下测试代码。

public static void main(String[] args) throws FileNotFoundException, InterruptedException {
        InputStream inputStream = new FileInputStream("D:\\Download\\Excel\\1619407967438.xlsx");
        Thread thread = new Thread(() -> {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        },"t1");
        thread.start();
        thread.join();
        try {
            inputStream.read();
            System.out.println("流未关闭");
        } catch (IOException e) {
            System.out.println("流已关闭");
        }
    }

 

结论:

可将其关闭

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt 中,线程文件需要注意一些问题。 首先,线程不能直接访问 GUI 线程中的 UI 控件,因为 UI 控件只能在线程中被访问。因此,在线程中进行文件操作时,应该使用信号与槽机制将文件操作的结果传递给线程,在线程中进行 UI 更新。 其次,如果在线程中打开了文件,需要在线程中进行文件的写入操作。如果在线程中打开了文件,那么在线程中进行文件的写入操作时,可能会出现 “device not open” 的错误。 下面是一个在线程中写文件的示例代码: ```cpp // MyWorkerThread.h #include <QThread> #include <QFile> class MyWorkerThread : public QThread { Q_OBJECT public: MyWorkerThread(QObject *parent = nullptr); ~MyWorkerThread(); void run() override; signals: void finished(); void error(QString err); private: QFile m_file; }; // MyWorkerThread.cpp #include "MyWorkerThread.h" MyWorkerThread::MyWorkerThread(QObject *parent) : QThread(parent) { m_file.setFileName("test.txt"); } MyWorkerThread::~MyWorkerThread() { if (m_file.isOpen()) { m_file.close(); } } void MyWorkerThread::run() { if (!m_file.open(QIODevice::WriteOnly)) { emit error("Failed to open file."); return; } QTextStream out(&m_file); out << "Hello, World!" << endl; m_file.flush(); m_file.close(); emit finished(); } ``` 在上面的示例代码中,我们在线程中创建了一个 QFile 对象,然后在 run() 函数中打开了这个文件,写入了一些数据,并在结束时关闭文件。我们还定义了两个信号:finished() 和 error(),分别用于通知线程操作完成和发生错误。 当然,你需要在线程中创建一个 MyWorkerThread 对象,并将它的 finished() 和 error() 信号连接到相应的槽函数上。另外,在启动线程之前,你需要调用 moveToThread() 函数将 MyWorkerThread 对象移到线程中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值