Java输入输出流——字节输出流FileOutputStream
FileOutputStream概述
FileOutputStream作用
将数据写入文件中。
FileOutputStream的构造方法
注:这里的FileOutputStream(File file, boolean append)
方法中的append如果为true,那么就表示从文件的末尾加入数据。
FileOutputStream的常用方法简介
方法名 | 描述 |
---|---|
public void write(int b) | 将指定字节写入此文件输出流 |
public void write(byte[] b) | 将b.length个字节从指定byte数组写入此文件输出流中 |
public void write(byte[] b, int off, int len) | 将指定byte数组中从偏移量off开始的len个字节写入此文件输出流 |
public void close() | 关闭此文件输出流并释放与此流有关的所有系统资源 |
案例
FileOutputStream(File file)、write(int b)、write(byte[] b)
package com.study.myfile;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo {
public static void main(String[] args) {
FileOutputStream fos;
FileInputStream fis;
try {
fos = new FileOutputStream("study.txt");
fis = new FileInputStream("study.txt");
fos.write(50);
fos.write('a');
System.out.println(fis.read());
System.out.println((char)fis.read());
fos.close();
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
50
a
此时study.txt文件中的内容为:
2a
注:这里由于编码的原因,可能导致存进去的数据并不是我们想要的,例如这里存的是50,但是文件里存的是2。通过read()方法可以看出,存的是50。
FileOutputStream(File file, boolean append)
try {
fos = new FileOutputStream("study.txt",true);
fis = new FileInputStream("study.txt");
fos.write(50);
fos.write('a');
System.out.println(fis.read());
System.out.println((char)fis.read());
fos.close();
fis.close();
}
运行结果:
50
a
此时study.txt文件中的内容为:
2a2a
这说明方法中的append如果为true,那么就表示从文件的末尾加入数据。
从以上案例可以看出,字节流不适合做字符相关内容的,存储时会发生意想不到的结果。
读取和写入图片文件
前置条件
在D:\学习\eclipse_studyspace\IOProj
下存储两个文件:happy.jpg和happy.gif。
对图片的复制粘贴
package com.study.myfile;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputDemo1 {
public static void main(String[] args) {
// 文件拷贝
try {
FileInputStream fis=new FileInputStream("happy.gif");
FileOutputStream fos=new FileOutputStream("happycopy.gif");
int n=0; //存储读方法的返回值,n=-1表示读到文件末尾了
byte[] b=new byte[1024];
while((n=fis.read(b))!=-1){
fos.write(b);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}
注:
(1) 这里可以将gif换成jpg,以达到拷贝不同类型图片的目的。
(2) 这里发现,happy.jpg大小为25K,而拷贝后的happycopy.jpg大小为26K,happy.gif大小为246K,而拷贝后的happycopy.gif大小为247K,这是因为如果最后一次读数据时不够1024个字节,这时再把数据写入新文件,那么新文件大小肯定要比之前的文件大,因为最后一次数据写多了。
public void write(byte[] b, int off, int len)
如果将 fos.write(b);
改为fos.write(b,0,n);
,那么两个文件的大小就是一致的。这是因为public void write(byte[] b, int off, int len)是将指定byte数组中从偏移量off开始的len个字节写入此文件输出流,这里n就是1024,因此文件大小相等。