Java中的输入输出操作是由Stream(流)来实现的。这个C#,C++这些OO语言是一样的。
Stream是一种很形象的说法。数据在进行IO操作时就像水一样 由这一端流向另一端。 我们在API Docs中可以看到java.io包里面有许多这样名称以Stream结尾的流类。
文件复制源文件
//
Coding by zhaohongliang
import java.io. * ;
public class FileCopy ... {
public static void main(String[] args) ...{
String usage = "Usage:SourceFile DestinationFile";
if(args.length != 2) ...{
System.out.println(usage);
System.exit(-1);
}
FileInputStream is = null;
FileOutputStream os = null;
try ...{
//Stream Construction
is = new FileInputStream(args[0]);
os = new FileOutputStream(args[1]);
}
catch (FileNotFoundException e) ...{
System.out.println("Error:File not found");
System.out.println(usage);
System.exit(-1);
}
int temp;
//Stream operation
try ...{
while ((temp=is.read()) != -1) ...{
os.write(temp);
}
is.close();
os.close();
}
catch (IOException e) ...{
System.out.println("Error:File copy failed.");
System.out.println(usage);
System.exit(-1);
}
System.out.println("Copy Complete.");
}
}
import java.io. * ;
public class FileCopy ... {
public static void main(String[] args) ...{
String usage = "Usage:SourceFile DestinationFile";
if(args.length != 2) ...{
System.out.println(usage);
System.exit(-1);
}
FileInputStream is = null;
FileOutputStream os = null;
try ...{
//Stream Construction
is = new FileInputStream(args[0]);
os = new FileOutputStream(args[1]);
}
catch (FileNotFoundException e) ...{
System.out.println("Error:File not found");
System.out.println(usage);
System.exit(-1);
}
int temp;
//Stream operation
try ...{
while ((temp=is.read()) != -1) ...{
os.write(temp);
}
is.close();
os.close();
}
catch (IOException e) ...{
System.out.println("Error:File copy failed.");
System.out.println(usage);
System.exit(-1);
}
System.out.println("Copy Complete.");
}
}
这里有一个问题,CPU处理速度远大于IO速度,以上程序中CPU每处理一个字节就要进行一次IO操作,这样降低了系统效率,而且过于频繁的IO操作对外存储器是一种严峻的考验。所以引入buffer缓冲区是很有必要的。缓冲区就是一段内存空间,当读入Stream时,并没有直接对其进行处理,而是先把Stream数据放入buffer中,等到buffer满后或是进行flush操作再一次性进行处理。这样就大大减少了IO操作的次数。我们在API Docs看到的Buffered开头的Stream类就是带缓冲区Buffer的类。
改造后的代码:
//
Coding by nyzhl
import java.io. * ;
public class FileCopy ... {
public static void main(String[] args) ...{
String usage = "Usage:SourceFile DestinationFile";
if(args.length != 2) ...{
System.out.println(usage);
System.exit(-1);
}
//Stream defination
BufferedInputStream is = null;
BufferedOutputStream os = null;
try ...{
//Stream construction
FileInputStream fis = new FileInputStream(args[0]);
FileOutputStream fos = new FileOutputStream(args[1]);
is = new BufferedInputStream(fis);
os = new BufferedOutputStream(fos);
}
catch (FileNotFoundException e) ...{
System.out.println("Error:File not found");
System.out.println(usage);
System.exit(-1);
}
int temp;
//Stream operation
try ...{
while ((temp=is.read()) != -1) ...{
os.write(temp);
}
is.close();
os.close();
}
catch (IOException e) ...{
System.out.println("Error:File copy failed.");
System.out.println(usage);
System.exit(-1);
}
System.out.println("Copy Complete.");
}
}
import java.io. * ;
public class FileCopy ... {
public static void main(String[] args) ...{
String usage = "Usage:SourceFile DestinationFile";
if(args.length != 2) ...{
System.out.println(usage);
System.exit(-1);
}
//Stream defination
BufferedInputStream is = null;
BufferedOutputStream os = null;
try ...{
//Stream construction
FileInputStream fis = new FileInputStream(args[0]);
FileOutputStream fos = new FileOutputStream(args[1]);
is = new BufferedInputStream(fis);
os = new BufferedOutputStream(fos);
}
catch (FileNotFoundException e) ...{
System.out.println("Error:File not found");
System.out.println(usage);
System.exit(-1);
}
int temp;
//Stream operation
try ...{
while ((temp=is.read()) != -1) ...{
os.write(temp);
}
is.close();
os.close();
}
catch (IOException e) ...{
System.out.println("Error:File copy failed.");
System.out.println(usage);
System.exit(-1);
}
System.out.println("Copy Complete.");
}
}