当前位置: 代码迷 >> java >> 如何正确地将 InputStream 传递给另一个构造函数? (爪哇)
  详细解决方案

如何正确地将 InputStream 传递给另一个构造函数? (爪哇)

热度:107   发布时间:2023-07-17 20:43:24.0

在下面的代码中,我尝试访问采用 InputStream 的其他构造函数...但是我需要以某种方式关闭此流以避免资源泄漏。 如果我尝试使用 try catch,它会抱怨构造函数调用不是第一个语句。 有什么方法可以在没有任何潜在风险的情况下传递这个 InputStream 吗?

public Input(File source) throws FileNotFoundException {
    this(new FileInputStream(source));
}

你需要让这个类实现AutoClosable并确保你在 try-with-resource 中使用它:

public class Input extends SomeClass implements AutoCloseable {
    public Input(File source) throws FileNotFoundException {
        this(new FileInputStream(source));
    }
    @Override 
    public void close() {
        someMethodThatClosesInnerResource();
    }
}

然后,您可以像这样使用该对象:

try (Input input = new Input(source)) {
    ...
}

如果您担心超级构造函数会抛出异常,那么您可能需要添加一个构建器方法来防止早期异常:

public class Input extends SomeClass implements AutoCloseable {
    public static Input createInput(File source) throws Exception {
        FileInputStream inputstream = new FileInputStream(source);
        try {
            return new Input(inputstream);
        } catch (Exception e) {
            inputstream.close();
            throw e;
        }
    }
    private Input(FileInputStream source)  {
        this(source);
    }
    @Override 
    public void close() {
        someMethodThatClosesInnerResource();
    }
}

然后,您仍应将其用作 try-with-resource:

try (Input input = Input.createInput(source)) {
    ...
}

请注意,在 builder 方法中,您必须防止所有异常……这不是很好的做法,因为现在您必须使方法抛出一般异常……或使用实用程序静默抛出。 您可以通过不让构造函数创建FileInputStream来避免此问题。 相反,只需将FileInputStream注入您的类并在 try-with-resource 中创建它。 这将允许在发生 ctor 异常时安全地关闭两个对象:

try (
    FileInputStream stream = new FileInputStream(source);
    Input input = new Input(stream)
) {
    ...
}
  相关解决方案