请教各位达人一个问题。
有一段从文件恢复数据进SQL Server的程序。一般情况下都是正常的,但在偶尔一些环境的机器上,会出现如下的错误。java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:194)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:408)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:450)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:182)
at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:131)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:117)
at java.io.InputStreamReader.read(InputStreamReader.java:151)问题怪就怪在绝大多数的环境,机器都是好的,只有一小部分机器,偶尔出现这种情况。跟代码发现是下面红色字体报的错,还有大侠知道原因的?谢谢。
private boolean bcpFileToDB(String tablename) {
String execStr = null;
File tmpFile = null;
String tmpData = null;
BufferedReader bufferedReader = null;
Process process = null;
String[] tmp = getDbUserPassWord();
String user = tmp[0];
String password = tmp[1];
try {
StringBuffer buffer = new StringBuffer();
// add for crdcr00162256 备份恢复中增加UEP的表
if (authflag == DB_CAF3GCM_FLAG) {
if (tablename.equalsIgnoreCase("CSP_R_RESASSIGN")
|| tablename.equalsIgnoreCase("CSP_R_AREA")) {
dbName = "uep";
boolean ueprestoreFlag = uepTablenamerestore();
return ueprestoreFlag;
} else
dbName = "CAF3G_CMP_DB";
}
// end
buffer.append("bcp \"").append(dbName).append(".dbo.");
buffer.append(tablename).append("\" in \"");
buffer.append(getBakPath(nodetype)).append(
BAKRES_RESTORE_TMPRESFILE);
buffer.append("\" -c -t\u001B  -q -U\"").append(user);
buffer.append("\" -P\"").append(password);
buffer.append("\" -S \"").append(serverIp).append("\" -E");
execStr = buffer.toString();
tmpFile = new File(getBakPath(nodetype) + BAKRES_RESTORE_TMPRESFILE);
if (!tmpFile.isFile()) {
debugPrn.error("error:temp file not exist! " + tablename);
return false;
}
process = Runtime.getRuntime().exec(execStr);
bufferedReader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
while ((tmpData = bufferedReader.readLine()) != null) {
Thread.sleep(20);
if (tmpData.startsWith("Error")) {
excForLog = new Exception(tmpData);
debugPrn.error("error:restore bcp error  " + tmpData);
return false;
}
}
return true;
} catch (Exception e) {
excForLog = e;
CmFunction.debugPrint(this.getClass().getName(), e.getMessage(),
CmFunction.INFO);
return false;
} finally {
try {
process = null;
tmpData = null;
tmpFile = null;
if (bufferedReader != null) {
bufferedReader.close();
bufferedReader = null;
}
} catch (IOException ioe) {
debugPrn.error(ioe);
} }
}