Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭BufferedReader将导致在Junit中关闭流_Java_Junit - Fatal编程技术网

Java 关闭BufferedReader将导致在Junit中关闭流

Java 关闭BufferedReader将导致在Junit中关闭流,java,junit,Java,Junit,我有几个JUnit测试,它们都调用同一个类(使用不同的输入),并检查该类的返回值 类本身有一个使用BufferedReader的代码,该代码在读取结束时关闭。 第一个测试通过了,但是在它抛出流之后的每个测试都关闭了 我在每个测试中创建一个新的类实例,在读取的代码中创建一个新的BufferReader 测试不应该包含在内吗?新实例不应该解决此问题吗 我的示例测试(省略了在每个测试中为可读性生成不同参数的代码) 在myClass中,我有以下代码(INPUT_STREAM是我的项目资源中的一个txt文

我有几个JUnit测试,它们都调用同一个类(使用不同的输入),并检查该类的返回值

类本身有一个使用
BufferedReader
的代码,该代码在读取结束时关闭。 第一个测试通过了,但是在它抛出
流之后的每个测试都关闭了

我在每个测试中创建一个新的类实例,在读取的代码中创建一个新的
BufferReader

测试不应该包含在内吗?新实例不应该解决此问题吗

我的示例测试(省略了在每个测试中为可读性生成不同参数的代码)

在myClass中,我有以下代码(INPUT_STREAM是我的项目资源中的一个txt文件,对于每个测试都是相同的)

___编辑_________

我获取输入流的方式是: 我在班上名列前茅

private static InputStream INPUT_STREAM= initializeInputStream();

private static InputStream initializeInputStream() { InputStream inputStream = System.class.getResourceAsStream("textFile.txt"); return inputStream; }
___结束编辑_____

ReadInputsClass
构造函数正在调用以下代码

private ArrayList<SomeClass> readStream(InputStream inputStream) {
    ArrayList<SomeClass> ret = new ArrayList<SomeClass>();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(inputStream));
        String line = br.readLine();
        while (line != null) {
            // do some stuff on the line just read
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)
                br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return ret;
}
private ArrayList readStream(InputStream-InputStream){
ArrayList ret=新的ArrayList();
BufferedReader br=null;
试一试{
br=新的BufferedReader(新的InputStreamReader(inputStream));
String line=br.readLine();
while(行!=null){
//在线上做些事情,读一读
line=br.readLine();
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
如果(br!=null)
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回ret;
}
显然,问题来自此代码中的
br.close

当我放置一个断点时,第二个测试是获取设置为null的br,创建一个新的br,当它到达br.readLine()时,它将关闭流


我不明白为什么?新的br=new BufferedReader不是应该重新开始吗?

您正在代码中嵌套流:

br = new BufferedReader(new InputStreamReader(inputStream));
在Java中,如果关闭最外层的流,则链中的所有其他流也将关闭。这意味着如果调用br.close(),则会调用InputStreamReader上的close()方法,而该方法又会调用inputStream变量上的close方法


如果您将输入_流初始化为静态变量并重新使用它,这意味着使用INPUT\u STREAM变量的后续测试将使用一个已经关闭的流。

您需要在每个测试中重新打开INPUT\u流-可能此InputStream是一个单例,并且由第一个
BufferedReader关闭
这部分代码不是新的InputStreamReader(InputStream)吗不,不是:这只会围绕相同的
inputStream
实例创建一个新的包装器,这也是我传递输入流的方式
private static inputStream initializeInputStream(){inputStream inputStream=System.class.getResourceAsStream(“textFile.txt”);return inputStream;}
如何将其传递给
ReadInputsClass
?:如果
INPUT\u STREAM
是一个存储的变量,请删除它并使用
new ReadInputsClass(initializeinputsclass())
而不是如何知道INPUT\u STREAM是一个静态变量?您的回答只是重新表述了其他人在评论中所做的分析,而没有明确知道此假设是否正确。不幸的是,我正在处理的代码全部使用静态(我正在维护的代码,因此删除所有这些静态不是一个选项)重新创建输入流的好方法是什么?我建议@wero在您的问题下面的评论中提到的方法,即使用
new ReadInputsClass(initializeInputStream())
创建ReadInputsClass,而不是引用静态输入流变量。
private ArrayList<SomeClass> readStream(InputStream inputStream) {
    ArrayList<SomeClass> ret = new ArrayList<SomeClass>();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new InputStreamReader(inputStream));
        String line = br.readLine();
        while (line != null) {
            // do some stuff on the line just read
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null)
                br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return ret;
}
br = new BufferedReader(new InputStreamReader(inputStream));