前言
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
提示:以下是本篇文章正文内容,下面案例可供参考
1. IO流概述和分类
介绍:
IO:即是Input和Output的缩写,是对数据的流入和流出的一种抽象。
流:抽象概念,对数据传输的总称。数据在设备间的传输称为流,流的本质是数据传输。
IO流:就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载。
分类:
1.按照功能划分
输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。
2.按照处理单元来划分
字节流和字符流操作的方式基本上完全相同。操作的数据单元不同。
字节流:操作的是8位的字节 InputStream/OutputStream 作为字节流的基类
字符流:操作的是16位的字符 Reader/Writer 作为字符流的基类
3.按照角色进行划分
节点流:可以直接从/向外部设备读取/写入数据的流,称之为节点流,节点流也被称之为低级流。
处理流:对于已经存在的流进行连接和封装,扩展了原来的读/写的功能。处理流也被称之为高级流。
IO流的使用场景:
- 如果操作的是纯文本文件,优先使用字符流。
- 如果操作的是图片,视频音频等二进制文件,优先使用字节流
- 如果不确定文件类型,优先使用字节流。字节流是万能的流。
2.流的操作步骤:
字节输入流:
FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件文件系统中的路径名name命名
文件字节输入流读取文件内容的步骤:
- 创建流对象
- 创建一个缓存字节的容器数组
- 定义一个变量,保存实际读取的字节数
- 循环读取数据
- 操作保存数据的数组
- 关闭流
示例代码:
public class FileInputStreamDemo{
public static void main(String[] args) throws IOException{
//创建字节输入流对象
FileInputStream fis=new FileInputStream("java\\fis.txt);
int a;
while((a=fis.read())!=-1){
System.out.println((char)a);
}
//释放资源
fis.close();
}
}
字节流抽象基类:
InputStream:这个抽象类是代表字节输入流的所有类的超类
OutputStream:这个抽象类是表示字节输出流的所有类的超类
子类名特点:子类名称都是以其父类名作为子类名的后缀。
字节输出流:
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
文件字节输出流写数据的步骤:
- 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
- 调用字节输出流对象的写数据方法
- 释放资源
示例代码:
public class FileInputStreamDemo{
public static void main(String[] args) throws IOException{
//创建字节输入流对象
FileOutputStream fos=new FileInputStream("java\\fis.txt);
//将指定的字节写入此文件输出流
fos.write(97);
//释放资源
fos.close();
}
}
3.字节流写数据的三种方式
方法:
方法名 | 说明 |
---|---|
void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 |
void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 |
void write(byte[] b, int | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 |
4.字节流写数据的要注意的两点
4.1字节流写数据如何实现换行
- windows:\r\n
- linux:\n
- mac:\r
4.2字节流写数据如何实现追加
-
public FileOutputStream(String name,boolean append)
-
创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头。
示例代码:
public class FileOutputStreamDemo{
public static void main(String[] args) throws IOException{
//创建字节输出流对象
FileOutputStream fos=new FileOutputStream("java\\fos.txt",true);
//写数据
for(int i=0;i<10;i++){
fos.write("hello".getBytes);
fos.write("\r\n".getBytes);
}
//释放资源
fos.close();
}
}
5.字节缓冲流
字节缓冲流介绍:
- IBufferOutputStream:该类实现缓冲输出流,通过设置这样的呼出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
- IBufferdInputStream:创建BufferdInputStream将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输出流中重新填充一次很多字节。
构造方法:
方法名 | 说明 |
---|---|
BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 |
BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |
示例代码:
public class BufferStream {
public static void main(String[] args) throws IOException {
//字节缓冲输出流:BufferedOutputStream(OutputStream out)
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\JAVA\\IO\\bos.txt"));
//写数据
bos.write("hello\r\n".getBytes());
bos.write("world\r\n".getBytes());
//释放资源
bos.close();
//字节缓冲输入流:BufferedInputStream(InputStream in)
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\JAVA\\IO\\bos.txt"));
//一次读取一个字节数据
// int by;
// while ((by=bis.read())!=-1) {
// System.out.print((char)by);
// }
//一次读取一个字节数组数据
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
//释放资源
bis.close();
}
}