1: IO流概述
在研究字节流前,我们先来了解一下什么是IO流
流:流的本质是对数据有方向的一个传输,字节的一个集合;其作用就是在数据源和程序之间建立一个通道。
IO流则用来处理设备之间的数据传输。
IO分类:
1:按流分类:输入流,输出流。
2: 按处理单元分:字节流,字符流。
3:按流的角色分:节点流,处理流。
2:字节流概述
字节流,是IO流中以处理数据单位分类的两种类别之一(另一种为字符流)。
字节流一般用来处理图像,视频,音频,PPT等类型的文件。
3: 字节流的使用---FileInputStream,FileOutputStream
public static void main(String[] args) throws IOException {
// 创建字节输出流对象
// FileOutStream,创建文件输出流以指定的名称写入文件
FileOutputStream fos=new FileOutputStream("D:\file\javaop.txt");
//将指定文件写入文件输出流
fos.write(Integer.parseInt("97"));
// 释放资源
// 关闭文件输出流并释放与此流相关联的任何系统资源
fos.close();
}
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis=new FileInputStream("D:\op.txt");
// 调用字节输入流对象的数据方法
// 第一次读取数据
// int red = fis.read();
// System.out.println(red);
// 强制转换
// System.out.println((char)red);
// red = fis.read();
// System.out.println(red);
// 强制转换
// System.out.println((char)red);
// 如果文件里没有数据后再单次读取,则返回-1;
//
// 循环改进读取数据
// int r = fis.read();
// while (r!=-1){
// System.out.print((char)r);
// r = fis.read();
// 优化上面的程序
int by;
while ((by=fis.read())!=-1){
System.out.println((char)by);
}
}
事实上,这两种方法读取大文件的效率太低了,为了解决这一问题,我们需要引入缓冲字节流
4:缓冲字节流
缓冲字节流是为了高效率而设计的,但是真正的读写还是要靠FileOutStream和FileInputStream,所以靠他们来实例化。
public static void main(String[] args) throws IOException {
// 创建字节缓冲输出流
FileOutputStream fos = new FileOutputStream("D:\opp.txt");
BufferedOutputStream bus = new BufferedOutputStream(fos);
// 写数据
bus.write("hello".getBytes());
bus.write("world".getBytes());
//释放资源
bus.close();
// 字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\OPP.TXT"));
// 读数据
// 一次读取一个字节数据
int bye;
while ((bye = bis.read()) != -1) {
System.out.println((char) bye);
}
// 一次读取一个字节数组的数据
byte[] by=new byte[1024];
int len;
while ((len=bis.read(by))!=-1){
System.out.println(new String(by,0,len));
}
bis.close();
字节流读写数据的方法已经包含在上诉例子中,所以我不再过多赘述。
通俗点来说,缓冲流减少了读写的次数,进而提高了效率。
5:字节流写数据的两个小问题
1:不同系统的换行符是不同的,因此数据读入的时候,可能会导致字节错位。
2:追加写入
public static void main(String[] args) throws IOException {
// 创建字节输出字节流对象
// FileOutputStream ll=new FileOutputStream("D:\op.txt");
// 写数据
// for (int i = 0; i <10 ; i++) {
// ll.write("hello".getBytes());
//// 换行符,不同系统之间的换行符不同
// ll.write("\n".getBytes());
// 追加写入
// 如果第二个参数为true,则字节将写入文件的末尾而不是开头
FileOutputStream ll=new FileOutputStream("D:\op.txt",true);
// 写数据
for (int i = 0; i <10 ; i++) {
ll.write("hello".getBytes());
// 换行符,不同系统之间的换行符不同
ll.write("\n".getBytes());
}
// 释放资源
ll.close();
}