文件输入流将文件内容读取(程序读取文件内容,暂存在内存中);
文件输出流,将程序读取到的内容写入到一个文件中;
一:FileOutputStream类常用方法介绍
构造方法:
常用方法:
●public void write(byte[] b,int off,int len):
off偏移量:从数组的第几位算起;
一般,再读写文件时:令 len = fis.read(b);
len:如果没有读到文件末尾:len的值就是实际读取的字节数;假如byte数组的长度为1024,那么开始的时候,len应该是1024;最后一次读的时候,文件快被读完了,可能byte数组离只有800个字节了,所以这时len为800;如果再继续读,因为文件已经被读完,此时len就会是-1了;
二:FileOutputStream类方法示例:
(1)write()方法演示
public class FileOutputDemo1 {
public static void main(String[] args) {
FileOutputStream fos; // 编程习惯:将字节流对象的定义放在外面。
try {
fos = new FileOutputStream("imooc.txt",true);
fos.write(50);
fos.write('c');
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
}
}
结果:经过多次测试,可以发现,字节流对于处理文档类内容显得有点拖沓和笨重,这中间涉及到各种编码方式的切换;所以,字节流更善于处理视频、图像等字节型文件,而不善于处理文档等字符型文件。
三:文件拷贝
(1)文件的拷贝流程示例:
public class FileOutputDemo2 {
public static void main(String[] args) {
// 文件拷贝:图片文件的复制粘贴,读取和写入
// (1)创建输入流对象,输出对象
FileInputStream fis;
FileOutputStream fos;
try {
// (2)实例化输入流对象指向待复制文件;实例化输出对象,参数为复制后文件的全路径;
fis = new FileInputStream("happy.jpg");
fos = new FileOutputStream("happyCopy.jpg");
// (3)n存放读方法的返回值,返回值为实际读到的数据的长度;如果为-1代表已经读到文件末尾了;
int n = 0;
// (4)定义一个字节数组,存放读取到的数据;这个数组得大一点;
byte[] b = new byte[1024];
// (5)读取内容,并同时将读取到的内容写出来;这儿是每读1024个字节就写一下,即读一点写一点,直到全部复制完;
while((n = fis.read(b))!= -1){
fos.write(b); // 将读取到的内容写到fos这个文件流对象对应的文件中去;
}
// (6)关闭输入流、输出流;
fis.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e){ // 注:这几文件的读写,IOException是必须抛出的,当成常识记住就行…
e.printStackTrace();
}
}
}
结果:
注:
(1)发现,复制后的happyCopy.jpg比happy.jpg要大:因为快读完的时候(即最后一次读的时候),文件剩余的东西,装不满1024个字节了;
解决办法:更改write方法。以保证俩文件大小是一致的;
n = fis.read(b):n的值为实际读的字节数,如果读到文件末尾,n为-1;
fos.write(b,0,n):n从偏移位置(这个是从数组的第0位开始算),写n位数据,如果n=-1,不写;
(如果没有读到文件末尾:len的值就是实际读取的字节数;假如byte数组的长度为1024,那么开始的时候,len应该是1024;最后一次读的时候,文件快被读完了,可能byte数组离只有800个字节了,所以这时len为800;如果再继续读,因为文件已经被读完,此时len就会是-1了;)
(2)上面文件复制时,如果已经有一个happyCopy.jpg文件了,其会把已有的文件干掉,然后新增本次复制的文件;