以下示例演示如何使用流复制文件。
private void copyWithStreams(File aSourceFile, File aTargetFile, boolean aAppend) {
log("Copying files with streams.");
ensureTargetDirectoryExists(aTargetFile.getParentFile());
InputStream inStream = null;
OutputStream outStream = null;
try{
try {
byte[] bucket = new byte[32*1024];
inStream = new BufferedInputStream(new FileInputStream(aSourceFile));
outStream = new BufferedOutputStream(new FileOutputStream(aTargetFile, aAppend));
int bytesRead = 0;
while(bytesRead != -1){
bytesRead = inStream.read(bucket); //-1, 0, or more
if(bytesRead > 0){
outStream.write(bucket, 0, bytesRead);
}
}
}
finally {
if (inStream != null) inStream.close();
if (outStream != null) outStream.close();
}
}
catch (FileNotFoundException ex){
log("File not found: " + ex);
}
catch (IOException ex){
log(ex);
}
}
private void ensureTargetDirectoryExists(File aTargetDir){
if(!aTargetDir.exists()){
aTargetDir.mkdirs();
}
}
private static void log(Object aThing){
System.out.println(String.valueOf(aThing));
}
对于上面的代码片段,我感到困惑的有四点:
1) Bucket分配为byte[] Bucket = new byte[32*1024];有没有选择尺寸的标准,比如32*1024
2)为什么它必须“抓住”这里?编写程序时包含catch有什么规则吗?
3)我也不太清楚这里的“try”的用法。看来作者在这个程序中使用了嵌套的try。
我们假设您无法轻松地将整个文件放入内存中,因此我们一次选择一小块,对其进行处理,然后获取下一个块。在本例中,我们使用 32 KB。您可以使用更多或更少的数据,但以硬盘驱动器扇区大小(通常为 4kb)的(小)倍数工作将更加高效,并减少 IO 操作。
如果您抛出异常,或调用抛出异常的方法,则必须处理它。你可以用一个围绕它try{}
and catch{}
(or finally{}
) 语句块,或者您可以将异常向上抛出到调用此方法的任何方法。在这种情况下,你有一个try{}
声明,这样你就有了随附的catch
and finally
声明。
作者做了一些不必要的事情:他本可以使用一个try{}
,然后放置finally{}
块之后catch{}
声明。相反,内在try{}
将异常传递给外部try{}
执行后finally{}
堵塞。之后catch{}
块被激活,取决于什么类型Exception
被扔了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)