java Process 流导致的错误

来源:互联网 发布:ipad专业视频剪辑软件 编辑:程序博客网 时间:2024/06/08 06:09

java 开发中 Process 流输出导致的 内存泄漏

首先来看个试例:

1.让其程序无限流输出。

public class OutStream {    public static void main(String[] args) {        while (true){            System.out.println("out print");//输出普通流 (InputStream)            System.err.println("err print");//输出错误流 (ErrorStream)            try {                Thread.sleep(50);//让其慢一点 也可以省略            } catch (InterruptedException e) {            }        }    }}
把上面的程序 弄成bat可以执行文件,jar文件也可以 代码如下:
@echo off
java -cp %上面java文件classes所在地% OutStream &*
我们存为outStream.bat文件。
2.在写一个 执行此文件的方法。
public class OutStreamTest {    public static void main(String[] args) {//        final Path path = Paths.get("C:\\outStream.bat");        String cmd = "cmd /c cd C: && outStream.bat";        try {            final Process process = Runtime.getRuntime().exec(cmd);            final InputStream inputStream = process.getInputStream();            new Thread(()->{                try {                    try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){                        while (true){                            String line = br.readLine();                            if(line == null) break;                            System.out.println(line);                        }                    }                } catch (IOException e) {                    e.printStackTrace();                }            }).start();        } catch (Exception e) {            e.printStackTrace();        }    }}
这个时候你会发现 打印几秒后就不再打印了。而此时内存会一直增加...导致内存泄漏。
3.在其中加入接收错误流后。
public class OutStreamTest {    public static void main(String[] args) {//        final Path path = Paths.get("C:\\outStream.bat");        String cmd = "cmd /c cd C: && outStream.bat";        try {            final Process process = Runtime.getRuntime().exec(cmd);            final InputStream inputStream = process.getInputStream();            new Thread(()->{                try {                    try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){                        while (true){                            String line = br.readLine();                            if(line == null) break;                            System.out.println(line);                        }                    }                } catch (IOException e) {                    e.printStackTrace();                }            }).start();            final InputStream errorStream = process.getErrorStream();            new Thread(()->{                try {                    try(BufferedReader br = new BufferedReader(new InputStreamReader(errorStream))){                        while (true){                            String line = br.readLine();                            if(line == null) break;                            System.out.println(line);                        }                    }                } catch (IOException e) {                    e.printStackTrace();                }            }).start();        } catch (Exception e) {            e.printStackTrace();        }    }}
你会发现会一直 执行。
这是因为流需要接管(是否如此?可以来探讨)。否则会导致内存泄漏。
1 0
原创粉丝点击