简介
-
什么是流
流是一种抽象概念,它代表了数据的无结构化传递。按照“流”的方式进行输入输出,数据被当成无结构的字节序或字符序列。
流的用途最重要的是可以把东西从一个地方“运”到另一个地方,比如水、电,而对电脑来说,这个“东西”本质就是字节(byte),把一系列字节从一个地方“运”到另一个地方(从网络下载文件、从文件读取内容发送到网络、从一块内存到另一块内存等)。 -
什么是IO流
IO流就是以流的方式进行输入输出
在Java 语言中,IO流的抽象定义是 Input与Output。IO涉及的范围比较大,这里主要对文件内容的读写 -
计算机的存储单位:
0 1 = 一位
8位 = 一字节
规定:
1个字母 = 8位 = 一字节
1个汉字 = 16位 = 二字节
- IO流的分类
根据文件中 “数据的类型” 进行划分为两大类:
字节流 Byte
字符流 Char
字节流有两个抽象类:InputStream OutputStream
其对应子类有FileInputStream和FileOutputStream实现文件读写
BufferedInputStream和BufferedOutputStream提供缓冲区功能
同样,字符流有两个抽象类:Writer Reader
其对应子类FileWriter和FileReader可实现文件的读写操作
BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率
四大抽象类:
(类型) | (字节流) | (字符流)
---------------------------------------------
输入流 | InputStream | Reader
---------------------------------------------
输出流 | OutputStream | Writer
- 什么时候该使用字符流,什么时候又该使用字节流呢?
其实仔细想想就应该知道,所谓字符流,肯定是用于操作类似文本文件或者带有字符文件的场合比较多
而字节流则是操作那些无法直接获取文本信息的二进制文件,比如图片,mp3,视频文件等
其实所有数据在电脑上(硬盘)都是以字节存储的,只不过字符流在操作文本上面更方便一点而已
此外,为什么要利用缓冲区呢?
我们知道,像迅雷等下载软件都有个缓存的功能,硬盘本身也有缓冲区
试想一下,如果一有数据,不论大小就开始读写,势必会给硬盘造成很大负担,并且能提高下载体验
文件操作常用方法
read(b) 调用重载read(byte[] b) 读取字节存储于数组中,并返回 b 的有效长度
os.write() 写出去,写到调用的输出流中。
new String(b, 0, len) 重载构造器,把 b 转换成String,从 0 开始,len结束
readLine() 一行一行读
newLine(); 创建新行
flush()-强制清空缓冲区:强制把缓冲区转到目的地,避免因程序中断出现未读取的情况
示例:把a文件的内容写到b文件上
电脑上的a文件 ——> Java程序——> 电脑上的b文件
package com.example.demo.examination2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
public class Test {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("C:/a.txt");
fos = new FileOutputStream("D:/b.txt");
byte[] b = new byte[1024];
int end = 0;
while ((end = fis.read(b)) != -1) {
System.out.println(new String(b, 0, end));
fos.write(b, 0, end);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (!Objects.isNull(fis)) {
fis.close();
}
if (!Objects.isNull(fos)) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
示例:缓冲流
选择字节流完成图片文件的复制
public void test() {
// 3 包装——将创建的节点流转递给缓冲流构造器中
BufferedInputStream bis = null;
BufferedOutputStream bos=null;
try {
// 1. 创建 FileInputStream 的实例,同时打开指定文件
FileInputStream fis = null;
// 2. 创建 FileOutputStream 的实例,同时打开指定文件
FileOutputStream fos = null;
fis = new FileInputStream("C:\\Users\\99462\\Desktop\\1.jpg");
fos = new FileOutputStream("C:\\Users\\99462\\Desktop\\2.jpg");
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
// 4. 读取指定文件的内容
byte[] b = new byte[1024];
int len = 0;
while ((len = bis.read(b)) != -1) {
// 5. 将文件的内容写到目标地点
bos.write(b, 0, len);
}
//bos.flush(); //强制清空缓冲区,降低效率
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 6. 关闭
try {
if (bos != null) {
bos.close();
}
if (bis != null) {
bis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
选择字符流进行文本文件的复制
public void test3(){
copyTextFile("1.txt", "5.txt");
}
public void copyTextFile(String src, String dest){
BufferedReader br = null;
BufferedWriter bw = null;
try {
FileReader fr = new FileReader(src);
br = new BufferedReader(fr);
FileWriter fw = new FileWriter(dest);
bw = new BufferedWriter(fw);
String str = null;
while((str = br.readLine()) != null){
bw.write(str);
bw.newLine();// bw.write(str + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bw != null){
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
网友评论