前言
大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包里,称为IO(输入输出)流
例如文件的拷贝就需要通过输入输出流来实现,以下案例可供参考
一、步骤
在eclipse中新建Java项目命名为FileCopy,并在当前目录下创建文件夹source和target,然后在source文件夹中存放一个文件。案例中我存放的是“Booty Music.mp3”文件。如下图:
下一步就开始写代码,新建class文件,类名File_copy
二、有关代码
1.导入使用到的包
代码如下:
2.文件的读取
创建一个字节输入流,用于读取当前目录下source文件夹中的mp3文件
InputStream in =new FileInputStream("source\\Booty Music.mp3");
3.数据的写入
创建一个文件字节输出流,用于将读取的数据写入target目录下的文件中
OutputStream out=new FileOutputStream("target\\booty music.mp3");
4.完整代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class File_copy {
public static void main(String[] args) throws Exception {
InputStream in =new FileInputStream("source\\Booty Music.mp3");
OutputStream out=new FileOutputStream("target\\booty music.mp3");
int len; //定义整型变量len,记住每次读取的一个字节
long begintime=System.currentTimeMillis(); //获取拷贝文件前的系统时间
while((len=in.read())!=-1) { //读取一个字节,并判断是否读到文件末尾
out.write(len); //将读到的字节写入文件
}
long endtime=System.currentTimeMillis(); //获取文件拷贝结束时的系统时间
System.out.println("文件拷贝所消耗的时间是:"+(endtime-begintime)+"毫秒");
in.close();
out.close();
}
}
通过while()循环将字节逐个进行拷贝。每循环一次,就通过FileInputStream的read()方法读取一个字节,并通过FileOutputStream的write()方法将该字节写入指定文件,循环往复,直到len的值为-1,表示读到了文件的末尾,结束循环,完成文件的拷贝。
三、运行结果截图
如下图,程序拷贝mp3文件共消耗了132593毫秒。在拷贝文件时,由于计算机性能等各方面的原因,会导致拷贝文件所消耗的时间不确定,因此每次运行程序结果未必相同。
此时可以看到命令行窗口已经打印拷贝文件所消耗的时间,但target文件夹好像并没有拷贝到的文件,童鞋们不要着急,鼠标右键刷新(Refresh)或者直接点击键盘上的F5就可以显示出拷贝到的文件啦。
在项目的路径中同样能找到拷贝的文件,如图
四、总结
需要注意的是,在定义文件路径时使用了\\。这是因为在Windows中的目录符号为反斜线\,但是反斜线\在Java中是特殊字符,表示转义符,所以在使用反斜线\时,前面应该再添加一个反斜线,即为\\。此外,目录符号也能用正斜线/表示,比如 source/Booty Music.mp3。