1.文件字节流
FileInputStream通过字节的方式读取文件,适合读取所有类型的文件(图像、视频、文本文件等)。Java提供了FileReader专门读取文本文件。
FileOutputStream通过字节的方式写数据到文件中,适合所有类型的文件。java也提供了FileWriter专门写入文本文件。
文件字节输入流
import java.io.*;
public class FileStreamDemo {
public static void main(String[] args) {
//创建对象
FileInputStream fis = null;
try {
//创建文件字节输入流对象
fis = new FileInputStream("d:/dd.jpg");
int temp = 0;
while((temp = fis.read())!=-1) {
System.out.println(temp); //返回int值是0-255之间
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
文件字节输入流
import java.io.*;
public class FileStreamDemo {
public static void main(String[] args) {
//创建对象
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建文件字节输入流对象
fis = new FileInputStream("d:/dd.jpg");
//创建文件字节输出流对象
fos = new FileOutputStream("d:/aa.jpg");
int temp = 0;
while((temp = fis.read())!=-1) {
fos.write(temp);
//System.out.println(temp); //返回int值是0-255之间
}
//将数据从内存中写入到磁盘中
fos.flush();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
if(fos!=null) {
fos.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
2.通过缓冲区提高读写效率
上一个案例对于效率的问题有问题,读取和写入都是一个字节一个字节来,那不慢嘛,对不
那么如何提高效率呢,通过缓冲区来实现
方式一
通过创建一个指定长度的字节数组作为缓冲区,以此来提高IO流的读写效率。该方式适用于读取较大图片时的缓冲区定义。注意:缓冲区的长度一定是2的整数幂,一般情况下1024长度较为合适。
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStringBufferedDemo {
public static void main(String[] args) {
//创建对象
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建文件字节输入流对象
fis = new FileInputStream("d:/dd.jpg");
//创建文件字节输出流对象
fos = new FileOutputStream("d:/aa.jpg");
//创建一个缓冲区,提高读写效率
byte[] buff = new byte[1024];
int temp = 0;
while((temp = fis.read(buff))!=-1) { //每次装1024
fos.write(buff,0,temp);
//System.out.println(temp); //返回int值是0-255之间
}
//将数据从内存中写入到磁盘中
fos.flush();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
if(fos!=null) {
fos.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
方式二
通过创建一个字节数组作为缓冲区,数组长度是通过输入流对象的available()返回当前文件的预估长度来定义的。在读写文件时,是在一次读写操作中完成文件读写操作的。注意:如果文件过大,那么对内存的占用也是比较大的,所以大文件不建议使用该方法。
与方式一的不同在于指定数据的长度不同
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStringBuffered2Demo {
public static void main(String[] args) {
//创建对象
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建文件字节输入流对象
fis = new FileInputStream("d:/dd.jpg");
//创建文件字节输出流对象
fos = new FileOutputStream("d:/aa.jpg");
//创建一个缓冲区,提高读写效率
byte[] buff = new byte[fis.available()];
fis.read(buff);
fos.write(buff);
//将数据从内存中写入到磁盘中
fos.flush();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis!=null) {
fis.close();
}
if(fos!=null) {
fos.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
3.通过字节缓冲流提高读写效率
Java缓冲流本身并不具有IO流的读取与写入功能,只是在别的流上加上缓冲功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流。
当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能更高效的读写信息。因为缓冲流是先将数据缓存起来,然后当缓存区存满后或者手动刷新时在一次性的读取到程序或写入目的地。
因此,缓冲流还是很重要的,我们在IO操作时记得加上缓冲流来提升性能。
BufferedInputStream和BufferedOutputStream这两个流是缓冲字节流,通过内部缓存数组来提高操作流的效率。
import java.io.*;
public class FileStreamBuffed3Demo {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
fis = new FileInputStream("d:/dd.jpg");
bis = new BufferedInputStream(fis);
fos = new FileOutputStream("d:/bb.jpg");
bos = new BufferedOutputStream(fos);
//缓冲流中的byte数组长度默认是8192
int temp = 0;
while((temp = bis.read())!=-1) {
bos.write(temp);
}
bos.flush();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(bis!=null) {
bis.close();
}
if(fis!=null) {
fis.close();
}
if(bos!=null) {
bos.close();
}
if(fos!=null) {
fos.close();
}
//注意:关闭流顺序:"按照后开的先关闭"
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
4.定义文件拷贝工具类
import java.io.*;
public class FileCopyTools {
public static void main(String[] args) {
copyFile("d:/bb.jpg","d:/aaa.jpg");
}
/*
* 文件拷贝方法
*/
public static void copyFile(String src,String des) {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
fis = new FileInputStream(src);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(new FileOutputStream(des));
int temp = 0;
while((temp= bis.read())!=-1) {
bos.write(temp);
}
bos.flush();
}catch(Exception e){
e.printStackTrace();
}finally {
try {
if(bis!=null) {
bis.close();
}
if(fis!=null) {
fis.close();
}
if(bos!=null) {
bos.close();
}
if(fos!=null) {
fos.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}