bufferedreaderreadline换行符不完全卡死

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bufferedreaderreadline换行符不完全卡死相关的知识,希望对你有一定的参考价值。

bufferedreaderreadline换行符不完全卡死
问题1 Java调用python返回值一直为null
问题2 BufferedReader的readline函数无任何输出结果,进程长时间卡住
最近在做项目时,需要用到Java调用python文件并读取运行结果。一般Java调用简单的Python文件(不包含第三方库的)是没有任何问题的,但是我需要用到tensorflow、keras、numpy等第三方库,所以遇到了很多麻烦,经过各种百度查找,最终解决了问题,在这里做一个总结归纳。
问题1 Java调用python返回值一直为null
这个问题是我没有创建虚拟环境造成的,因为自己电脑上用的一直是Anaconda安装时自带的python,没有创建自己的虚拟环境,因此在Java中调用python文件时,就会找不到各种第三方库的问题。
问题2 BufferedReader的readline函数无任何输出结果,进程长时间卡住
这个问题我也找了很多方法才解决,产生这个问题的主要原因是:
命令在运行的过程中会向标准输出或者标准错误输出写出数据,但JVM又没有去读,导致缓冲区满,进而导致进程阻塞。因为我的python文件调用的tensorflow,他会输出一堆警告信息,这些警告信息属于错误流(ErrorStream),如果我们没有及时处理,就会导致缓冲区占满,从而导致进程阻塞。
Process.getInputStream()和Process.getErrorStream()分别返回Process的标准输出流和错误流,两个流如果处理不当,其缓冲区不能被及时清除而被塞满,则进程被阻塞,即使调用Process.destory()也未必能销毁被阻塞的子进程。
这个问题的解决的方法比较简单,既然问题是缓冲区满之后没有及时清理,那么只要在Java代码里去读一下数据,保证缓冲区不会满即可.
参考技术A bufferedreaderreadline换行符不完全卡死
问题1 Java调用python返回值一直为null
问题2 BufferedReader的readline函数无任何输出结果,进程长时间卡住
最近在做项目时,需要用到Java调用python文件并读取运行结果。一般Java调用简单的Python文件(不包含第三方库的)是没有任何问题的,但是我需要用到tensorflow、keras、numpy等第三方库,所以遇到了很多麻烦,经过各种百度查找,最终解决了问题,在这里做一个总结归纳。

问题1 Java调用python返回值一直为null
这个问题是我没有创建虚拟环境造成的,因为自己电脑上用的一直是Anaconda安装时自带的python,没有创建自己的虚拟环境,因此在Java中调用python文件时,就会找不到各种第三方库的问题。

问题2 BufferedReader的readline函数无任何输出结果,进程长时间卡住
这个问题我也找了很多方法才解决,产生这个问题的主要原因是:
命令在运行的过程中会向标准输出或者标准错误输出写出数据,但JVM又没有去读,导致缓冲区满,进而导致进程阻塞。因为我的python文件调用的tensorflow,他会输出一堆警告信息,这些警告信息属于错误流(ErrorStream),如果我们没有及时处理,就会导致缓冲区占满,从而导致进程阻塞。

Process.getInputStream()和Process.getErrorStream()分别返回Process的标准输出流和错误流,两个流如果处理不当,其缓冲区不能被及时清除而被塞满,则进程被阻塞,即使调用Process.destory()也未必能销毁被阻塞的子进程。

这个问题的解决的方法比较简单,既然问题是缓冲区满之后没有及时清理,那么只要在Java代码里去读一下数据,保证缓冲区不会满即可.
参考技术B “BufferedReader.readLine()”是Java语言中一个用于读取文本行的方法。它会从输入流中读取一行文本,并将其作为字符串返回。如果遇到换行符,它会停止读取,并返回已读取的字符串。如果遇到了文件结尾,它会返回null。
如果“BufferedReader.readLine()”方法不能完全读取换行符,则可能会导致程序卡死,无法继续执行。这可能是由于输入流中的文本格式有问题导致的。例如,如果文本中的换行符不是标准的换行符(即“\n”),则可能会出现这种情况。可以尝试检查

HTML JavaScript中换行符问题

为什么从input取到的字符串的换行符\n不会生效,而自己定义的字符串\n会生效,什么道理,两个都是变量类型都是字符串啊

参考技术A 输入框里输入都不会转义的,就算你在里面输入一个<div></div> 他也只是照常显示出来

如果是用js插入,可以用 \r\n 即可换行

以上是关于bufferedreaderreadline换行符不完全卡死的主要内容,如果未能解决你的问题,请参考以下文章

ABAP 中如何输出换行符?

qt去除换行符

正则替换换行符和把 br 替换成换行符

在文本区域中捕获换行符(换行符、换行符)字符

javascript 怎么替换换行符

java 换行符问题