字节流
1.字节流:
(1)字节输入流:InputStream,这个流是一个抽象类,我们在使用时使用FileInputStream类实现文件的输入
(2)字节输出流:OutputStream,这个流是一个抽象类,我们在使用时使用FileOutputStream类实现文件的输出
(3)所有流操作都是在字节流的基础上进行的,通过字节流读取到原始数据,然后交给其他流进行处理
(4)使用字节输入输出流可以操作字符文件,但比较麻烦,需要进行转码.如果操作字符文件建议使用字符流
(5)使用字节流更适合操作图片、音频、视频、压缩包等二进制文件,字符文件也可以操作但不建议
2.带有缓冲区的字节流:
(1)带有缓冲区的字节流属于包装流,对原始流的包装流
(2) Java的IO流提供了一个带有缓冲区的字节输入流(BufferedInputStream)、带有缓冲区的字节输出流(BufferedOutputStream)
(3)由于带有缓冲区的流是对原始流的包装流,所以要使用带有缓冲区的流必须在原始流的基础上使用
(4)缓冲区流是线程安全的,在并发情况可以保证数据的准确性,在缓冲流中使用synchronized同步锁实现
案例
1.字节输出流
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Scanner;
public class 字节输出流 {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
/**
* 创建字节输出流对象,并指定输出的目标文件
* 如果目标文件不存在则自动创建该文件,如果存在则替换该文件
* 当第二个参数设置为true时,表示向文件中追加内容(如果文件不存在依然会创建新文件)
*/
OutputStream outputStream = new FileOutputStream("f:/abcx.txt",true);
//循环向文件输出内容
while(true){
System.out.print("请输入内容:");
String str = scanner.next();
if(str.equals("exit")){
break;//退出
}
//将字符串转换为字节数组
byte[] buf = str.getBytes();
outputStream.write(buf);
//刷新流
outputStream.flush();
}
//释放资源
outputStream.close();
}
}
2.字节输入流
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 字节输入流实例-将磁盘上文件中的数据读入到程序中
*/
public class 字节输入流 {
public static void main(String[] args) throws IOException {
/**
* 创建输入流对象,并指定要读取的文件
*/
InputStream inputStream = new FileInputStream("f:/mysql5.7解压缩安装.txt");
//读取一个字节,该字节为一个整数
/*int num = inputStream.read();*/
//声明一个用于存储读取字节的缓冲区(字节数组)
byte[] buf = new byte[1024];
/**
* 读取数据,读取缓冲区指定大小的数据
* 返回实际读取字节的数量(长度),如果未读取到数据则返回-1
*/
int len = - 1;
//循环读取文件中的数据,当len的值为-1时表示读取结束
while((len=inputStream.read(buf,0,buf.length))!=-1){
/**
* 将字节数组中的字节转换字符串
* 指定转换的起始下标,及转换长度
*/
String str = new String(buf,0,len);
System.out.println(str);
}
inputStream.close();//关闭输入流
}
}
3.文件复制
import java.io.*;
public class 文件复制 {
public static void main(String[] args) throws IOException {
//创建文件输入流对象,并指定源文件
InputStream inputStream = new FileInputStream("e:/maven-lib.rar");
//创建文件输出流对象,并指定目标文件
OutputStream outputStream = new FileOutputStream("f:/maven-lib.rar");
/**
* 创建字节数组做为缓冲区
* 可以通过设置缓冲区的大小,提高效率,设置缓冲区时根据实际情况设置,不是越大越好
*/
byte[] buf = new byte[1024*1024*5];
//表示输入流读取的字节数
int len = -1;
//获得开始复制的毫秒数
long start = System.currentTimeMillis();
//使用while循环读取文件中的数据并写出到目标文件
while((len=inputStream.read(buf,0,buf.length)) != -1){
//将读到的数据写出到磁盘指定的文件中
outputStream.write(buf,0,len);
//刷新输出流
outputStream.flush();
}
//获得复制复制结束时的毫秒数
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start)+"毫秒");
//关闭流
inputStream.close();
outputStream.close();
}
}
4.文件复制_使用带有缓冲区的字节流实现
import java.io.*;
public class 文件复制_使用带有缓冲区的字节流实现 {
public static void main(String[] args) throws IOException {
//创建文件输入流对象,并指定源文件
InputStream inputStream = new FileInputStream("e:/maven-lib.rar");
//创建文件输出流对象,并指定目标文件
OutputStream outputStream = new FileOutputStream("f:/maven-lib.rar");
//使用BufferedInputStream和BufferedOutputStream对原始的字节输入输出流进行包装
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream,1024*1024*5);
//创建带有缓冲区的字节输出流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
/**
* 创建字节数组做为缓冲区
* 可以通过设置缓冲区的大小,提高效率,设置缓冲区时根据实际情况设置,不是越大越好
*/
byte[] buf = new byte[1024];
//表示输入流读取的字节数
int len = -1;
//获得开始复制的毫秒数
long start = System.currentTimeMillis();
//使用while循环读取文件中的数据并写出到目标文件
while((len=bufferedInputStream.read(buf,0,buf.length)) != -1){
//将读到的数据写出到磁盘指定的文件中
bufferedOutputStream.write(buf,0,len);
//刷新输出流
bufferedOutputStream.flush();
}
//获得复制复制结束时的毫秒数
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start)+"毫秒");
//关闭流
inputStream.close();
outputStream.close();
bufferedInputStream.close();
bufferedOutputStream.close();
}
}