首页 > 编程语言 >java.io.FileInputStream#read(byte[]) 阻塞导致没办法继续执行的问题处理

java.io.FileInputStream#read(byte[]) 阻塞导致没办法继续执行的问题处理

时间:2023-12-20 10:46:53浏览次数:39  
标签:fosto java read fosfrom IOException io catch new

在对设备节点进行操作的时候,发现读的时候进入阻塞状态(可能是设备节点异常),导致没办法继续执行后面的代码

 

查看了一下,文件的方式读,是没办法配置超时的自动报异常的

设计了一段代码,针对读阻塞做异常处理

 

    public static String  sendCmdToFile(String fromFile, String cmd) {
        byte bt[] = new byte[1024];
        int c=0;
        AtomicBoolean isGetCode=new AtomicBoolean(false);
        OutputStream fosto=null;
        try {
            fosto = new FileOutputStream(fromFile);
            LogPrint.d("fosto.write(cmd.getBytes()) "+cmd.getBytes());
            fosto.write(cmd.getBytes());

           Thread mThread= new  Thread(new Runnable() {
                @Override
                public void run() {
                    FileInputStream fosfrom=null ;
                    try {
                        int byteLength=0;
                        byte temp[] = new byte[100];
                        int len=0;
                        fosfrom = new FileInputStream(fromFile);
                        isGetCode.set(false);
                        while(-1!=(len =fosfrom.read(temp))){

                            System.arraycopy(temp,0,bt,byteLength,len);
                            byteLength=+len;
                        }
                        LogPrint.d(" fosfrom.read "+DataTypeChangeUtil.getByteBylength(bt,byteLength));
                        if(fosfrom!=null) {
                            fosfrom.close();
                        }
                        //Thread.sleep(50);
                        isGetCode.set(true);
                    } catch (ClosedByInterruptException e) {
                        LogPrint.d(" fosfrom.read  ee "+e.getMessage().toString());
                       if(fosfrom!=null){
                           try {
                               fosfrom.close();
                           } catch (IOException ioException) {
                               ioException.printStackTrace();
                           }
                       }
                        e.printStackTrace();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            mThread.start();
            try {
                mThread.join(30); //等待30毫秒
                if(!isGetCode.get()){
                    mThread.interrupt(); //如果线程阻塞,会报异常
                   throw new IOException();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LogPrint.d("fosto.read(cmd.getBytes()) ok");

            if(fosto!=null) {
                fosto.close();
            }
            return "ok";

        } catch (IOException ex) {
            LogPrint.d("IOException fosto "+ex.getMessage());
            if(fosto!=null) {
                try {
                    fosto.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return "";
                }
            }
            return "";
        }
    }

 

标签:fosto,java,read,fosfrom,IOException,io,catch,new
From: https://www.cnblogs.com/baldermurphy/p/17915947.html

相关文章

  • KingIOServer连接S7-200 SMART PLC
    硬件:西门子200SMARTPLCSR30软件环境:1,PLC编程软件Step7Micro/WINSMART2,组态王KingIOServer具体步骤:1,打开KingIOServer工程设计器,然后新建应用/工程,输入应用名称,然后确定2,左侧项目树,设备-右键 3,左侧项目树,变量-右键,新建变量4,编译,运行 5,在弹出的窗口中,启动......
  • JavaScript中的类
    作用类是用于创建对象的模板用法声明(具名和匿名两种。函数声明和类声明之间的一个重要区别在于,函数声明会提升,类声明不会。)原型方法(constructor():一个类只能一个,实例对象的时候会执行,如果没有定义,会自动生成)静态方法(关键字为static,通常用于为一个应用程序创建工具函......
  • iTOP-RK3568开发板实时系统编译,Preemption系统/Xenomai系统编译,获取Linux源码包
    1获取Linux源码包编译环境说明:本手册使用的是迅为提供的编译环境ubuntu20.04,在网盘资料“iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\05_NPU开发配套资料\03_RKNN_Toolkit2环境搭建\01课程用到的资料\01_初始Ubuntu20虚拟机”路径下。这里的ubuntu20默认开发......
  • Class 'Thread' not found in
    Class'Thread'notfoundinFatalerror:UncaughtError:Class'Thread'notfoundinC:\wamp\www\demo_test.php:解决办法1)浏览器打开http://127.0.0.1/?phpinfo=-1查看info信息查看VC版本Example:InfoPHPVersion:5.6.31Compiler:MSVC11(VisualC++......
  • QLabel显示图片,QPixmap.scaled Qt::KeepAspectRatio不起作用
    一、问题描述以及解决办法Qt中QLabel可以显示图片。如下:QLabel*label=newQLabel(this);label->setPixmap(QPixmap)其中QPixmap可以缩放图片Pixmappixmap;pixmap.scaled(QSize(width,height),Qt::KeepAspectRatio);//按比例缩放以适应目标矩形,超出部分会被裁......
  • Newtonsoft.Json.JsonReaderException:“Bad JSON escape sequence: \*. Path '****'
    测试Json字符串msg:{"field1":"\\\9527\","field2":"\\\\\data\\","field3":"\r\n\\\G\\\d\\\","field4":"TESTTEST\\1TEST\\\GTEST\\\\GTEST2\\\\\TEST3\\......
  • 神经网络优化篇:为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitti
    为什么正则化有利于预防过拟合呢?通过两个例子来直观体会一下。左图是高偏差,右图是高方差,中间是JustRight。现在来看下这个庞大的深度拟合神经网络。知道这张图不够大,深度也不够,但可以想象这是一个过拟合的神经网络。这是的代价函数\(J\),含有参数\(W\),\(b\)。添加正则项,它可......
  • javascript Pipe方法执行流
    pipe的概念很简单,就是将n个函数组合起来,他是一个从左到右的流,每个函数执行的时候都传入之前函数的结果。下面写一个返回一个人名字的函数:getName=(person)=>person.name;getName({name:"Buckethead"})//返回"Buckethead"接下来写一个将字符串大写的函数uppercase=(......
  • mysql union all、union、join
    union和join是需要联合多张表时常见的关联词,join:两张表做交连后里面条件相同的部分记录产生一个记录集,union:union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集。二者区别:join和union的主要区别就一条,join是将拼接内容变成一行(左右拼接),根据共同字段将数据拼接成......
  • TripleDES在java与c#中的区别
        C#下TripleDES默认支持16位和24位的秘钥,而Java下的DESedeKeySpec就只支持24位,其实怎么说呢,按3DES规范要求,的确其秘钥应该是24位而不是16位的,但16位秘钥可以按前8位+后8位+前8位的规则来升级成24位的秘钥,所以我们只需要简单的通过数组的Copy就可以将16位秘钥升级为24......