Java IO
一 概念
字节流:操作任何数字,计算机中的任何数据都是以字节形式存储的
字符流:操作纯字符数据,比较方便
二 常用父类
字节流:InputStream和OutputStream
字符流:Reader和Writer
三 Stream(字节流)
1 FileInputStream
基本Method
int read(); //读取一个数据字节,(文件是以-1结尾的)。
close();
- read()为什么返回int而不是byte?
- 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111。那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型。
2 FileOutputStream
Constructor
FileOutputStream(String name);
FileOutputStream(File file);
FileOutputStream(String name,boolean append); //append=true不清空文件,false清空文件
FileOutputStream(File file,boolean append); //append=true不清空文件,false清空文件
创建字节输出流对象。如果没有就会自动创建一个目标文件,如果有这个文件,会将文件清空。不清空的需要调用构造。
基本Method
void Write(int ); //虽然写出的是个int数,但是到文件上的是一个字节,会自动去除前三个8位
void close();
字节数组拷贝一 文件代码
FileInputStream fis = new FileInputStream("34.jpg");
FileOutputStream fos = new FileOutputStream("copy.jpg");
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();
fos.close();
(每次只传输一个字节,效率低)
字节数组拷贝二 available()方法
使用到的方法
//FileInputStream
int available(); //获取文件的剩余字节数
int read(byte[] b); //输入流文件数据输入到字节数组b中,返回的是读到的有效字节个数
//FileOutputStream
void write(byte[] b); //输出数组b到文件
(一次传输过多字节,拷贝大型文件会导致内存溢出)
字节数组拷贝三 定义小数组
FileInputStream fis = new FileInputStream("xxx.txt");
FileOutputStream fos = new FileOutputStream("yyy.txt");
byte b[] = new byte[2]; //定义byte数组长度为2
int len; //录入的字节数
while ((len = fis.read(b)) != -1) { //如果len==-1,表示读到了结尾
fos.write(b,0,len); //write(byte[] b,int off,int len)方法
}
fis.close();
fos.close();
定义小数组的标准格式
byte b[] = new byte[1024 * 8]; //定义byte数组长度为1024的整数倍
int len;
while ((len = fis.read(b)) != -1) { //注意:如果read()方法中忘记加b数组,返回的不是读取字节个数,二十字节的码表值
fos.write(b,0,len);
}
BufferedInputStream&BufferedOutputStream 字节缓冲区流
constructor
BufferedInputStream(InputStream is);
BufferedOutputStream(OutputStream os);
e.g
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("xxx.mp3"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("yyy.mp3"));
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
bis.close();
bos.close();
原理
内存的读写速度比硬盘快的多。
该方法减少在硬盘的读写次数,增加内存中的读写次数。
BufferedXxxputStream对象中创建了一个长度为8192的字节数组,输入流一次性从文件中读取8192个字节存在缓冲区中,然后在内存中依次传输给输出流,输出流再将这8192个字节输出到文件中去。
在开发中字节缓冲区流和定义小数组的方法都可用。
方法flush()&close()的区别
- flush()方法
- 用来刷新缓冲区的,刷新后可以再次写出
- close()方法
- 用来关闭流释放资源的的,如果是带缓冲区的流对象的close()方法,不但会关闭流,还会再关闭流之前刷新缓冲区,关闭后不能再写出
IO流异常处理的标准代码(JDK1.7)
JDK1.7之后IO流对象实现了一个Closeable接口,实现了此接口的对象可以自动关闭
try(
FileInputStream fis = new FileInputStream("aaa.txt");
FileOutputStream fos = new FileOutputStream("bbb.txt");
MyClose mc = new MyClose();
){
int b;
while((b = fis.read()) != -1) {
fos.write(b);
}
}