IO篇之FileOutputStream
这篇文章主要对该类作为字节输出流的代表进行学习理解。与FileInputStream有一点区别
输入流最后一定要close,输出流最后一定要flush。
因此输出流的两个最为重要的方法是wirte(),以及flush(),wirte方法中即可以传1个ASCI码值,也可以传入byte数组,也能够自定义传入byte数组的长度。
具体例子:在a.txt文件中写入abcd。
import java.io.FileOutputStream;
/**
* @author cz
* @date 2020/6/12/012
* 文件字节输出流,负责写
**/
public class FileOutputStreamTest {
public static void main(String[] args) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("F:\\a.txt");
//如果传入的文件不存在,会自动新建
// fileOutputStream.write(97); // 传入字节的ASCI值,会将原文件的内容请空,只写入a
byte[] b = {'a','b',99,100}; //abcd,即使写数字会当做ASCI值进行处理
fileOutputStream.write(b);
// fileOutputStream.write(b,0,2); 会写入ab
// 写完之后一定要进行刷新
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:这三种写入方式,都会将原文件的内容进行清空!谨慎使用。
在创建fileOutputStream对象时,有多种构造方法,源码中该类存在private final boolean append;实现是否追加。只使用文件名进行创建对象时,默认append属性为false。即内容不以追加的方式进行添加。
而如果不希望清空,而是以在文件内容的末尾进行追加的方式,也很简单。 fileOutputStream = new FileOutputStream(“F:\a.txt”,true);
只输入abc也不符合常用使用规范,现在输入字符串“我是中国人”。
只需要将String转为btye数组即可。
String s = "我是中国人";
byte[] b = s.getBytes();
fileOutputStream.write(b);
// 写完之后一定要进行刷新
fileOutputStream.flush();
当对fileInputStream以及fileOutputStream 有一定的理解后,就可以进行文件的拷贝工作。这个还是比较有意思的功能实现点
要点有三:
1.使用字节流进行拷贝,这样就不受文件类型限制,声音、视频、文本、等等都可以。
2.当拷贝完,输出流一定要flush。
3.两个流应该分开关闭,这样当某一流出现异常时,另一流还能正常关闭。
4.这里只能拷贝一个文件,不能进行文件目录的拷贝。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author cz
* @date 2020/6/12/012
* 文件拷贝
* 使用FileInput以及FileOutput相结合完成文件拷贝
* 拷贝的过程其实相当于一边读,一边写。
* 使用字节流进行拷贝时,文件的类型不容易受到限制
**/
public class FileOutputStreamTest {
public static void main(String[] args) {
FileOutputStream fileOutputStream = null;
FileInputStream fileInputStream = null;
try {
// 创建一个输入流对象
fileInputStream = new FileInputStream("F:\\javastudy\\32\\part01-基础(1-25天)\\WEB01_HTML\\WEB01_HTML\\视频\\01_javaWEB课程体系结构介绍_.flv");
// 创建一个输出流对象
fileOutputStream = new FileOutputStream("F:\\01_javaWEB课程体系结构介绍_.flv",true);
// 一次最多拷贝一兆,一边读取,一边写
byte[] bytes = new byte[1024*1024];
int read = 0; // 当read等于-1时,证明该文件已经被全部读取完毕
while ((read=fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,read); //读多少就写多少
}
//注意刷新
fileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
// 输出、输出流的try catch要分开,不应该一起trycatch,防止一个流出现异常时,另一个流无法关闭
if (fileInputStream!=null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}if (fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
如果对您有用欢迎点赞、留言,发表看法。
转发请注明出处。