我是Java的新手,我将我的一个C ++库移植到Java作为学习实验。这不是家庭作业(从我的代码看起来应该很明显)。关于ESRI形状文件阅读器的构造函数的以下代码,我有几个问题。
import java.io.*;
/**
*
* @author Bill
*/
public class ShapeFileReader {
public FileInputStream inStream;
/*
* @param fileName File name string. Must not be null or zero length.
* @throws Exception if file specified by fileName fails to open
*/
public ShapeFileReader(String fileName) throws IOException {
if(fileName == null)
throw new NullPointerException("fileName was null");
if(fileName.length() == 0)
throw new IllegalArgumentException("fileName string length was zero");
File fi = new File(fileName);
if(fi.exists() == false)
throw new IOException("File does not exist: " + fileName);
// Catch-or-specify (this method already throws IOException)
inStream = new FileInputStream(fileName);
}
}
在参数验证和存在期间,我应该抛出如图所示的异常吗?验证会抛出未经检查的异常,并且存在会抛出已检查的异常。我假设FileInputStream
构造函数也会抛出IOException
,但我在方法throws
子句中指定了它。
我正在考虑将文件的开头重构为单独的函数,但我认为在构造函数中执行此操作会更有用和简单,并且还学习如何在此处控制错误。此外,该对象的任何实例都不具有关闭/打开状态。所有这些对象都严格保留用于仅读取文件,因此它们是根据文件的需要创建的。我将单独提供close()
方法。
另外,从可扩展性的角度来看,是否很难适应使用FileInputStream
使用当前构造函数通过网络读取文件?或者我应该使用不同的类和多个构造函数吗?
感谢您提供的所有输入。
答案 0 :(得分:1)
我不打扰异常,FileInputStream会为你抛出异常,你不会在代码中添加除了杂乱之外的任何东西。
要使其与网络协同工作,而不仅仅是您修改的文件:
public class ShapeFileReader {
private final InputStream inStream;
public ShapeFileReader(InputStream inStream) {
this.inStream = inStream;
}
/*
* @param fileName File name string. Must not be null or zero length.
* @throws Exception if file specified by fileName fails to open
*/
public ShapeFileReader(String fileName) throws IOException {
this(new FileInputStream(fileName));
}
由于这已经被接受为我正在编辑的答案,因为Roland(在评论中)是非常正确的,这不是我如何解决问题。
public class ShapeReader {
public static Shape readShape(InputStream inStream) {
... do the work
}
/*
* @param fileName File name string. Must not be null or zero length.
* @throws Exception if file specified by fileName fails to open
*/
public static Shape readShape(String fileName) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
try {
return readShape(fis);
} finally {
fis.close();
}
}
}