目录
1. IO流
1.1 缓冲的概念
1.2 IO流的分类
2. 读取文件
2.1 字节输入流
2.2 字节输出流
2.3 字符输入流
2.4 字符输出流
3. 对文件的复制
在读取的时候,会将文件(图片,音频,视频等)变成流的形式 ,一点一点来处理拆解开出来的。
IO流 的本质就是对电脑的文件进行读和写的。
计算机通过CPU内存读取磁盘上面的文件数据,一次读取1字节。但是可以加上缓冲的概念,每次读取固定大小。效率会提高。
输入流分为两种:
1.字节输入流 FileInputStream
2.字符输入流 FileReader
输出流分为两种:
1.字节输出流 FileOutputStream
2.字符输出流 FileWriter
例:磁盘上面有一个1.txt文件,现在要将1.txt文件中的内容读取到内存(Java代码中)。
Java封装好了类: FileInputStream 文件输入流(字节输入流)。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException {
// 将磁盘上面的c:/aaa/1.txt文件这个数据读取到内存(Java)中
// 创建File对象,是本地磁盘文件的一个File对象
File file = new File("c:/aaa/1.txt");
// 创建文件字节输入流对象,来操作1.txt
// 将c:/aaa/1.txt文件转为字节输入流的形式,之后可以按照流的形式读取到内存中
FileInputStream fis = new FileInputStream(file);
// BufferedInputStream为另一个输入流添加了功能,即缓冲输入
// FileInputStream就具备了缓冲的功能
BufferedInputStream bis = new BufferedInputStream(fis);
// 当创建BufferedInputStream时
// 将创建一个内部缓冲区数组,这个数组的数据类型是byte
// 当缓冲数组是几个字节的时候,每次读取的时候存到缓冲数组中,就只存几个字节
byte[] buf = new byte[1024 * 4];//缓冲区4096字节
// 现在数组是空的
// public int read(byte[] b) throws IOException
// 从输入流读取一些字节数,并将它们存储到缓冲区b,实际读取的字节数作为整数返回
// 将1.txt文件的内容 读取到缓冲数组buf里面
// 如果没有字节可用,因为流在文件末尾,则返回值-1
int length = -1;
//如果length=-1 那么就会到达流的末尾 就证明后面没有数据
//循环结束,不会再读了
while ((length = bis.read(buf)) != -1) {
System.out.println(new String(buf));
}
// 流是需要关闭的
bis.close();
fis.close();
}
}
将Java中数据写入到磁盘上面。
例:如Java代码中有一个字符串 String str = "我就是我";将这个字符串写入磁盘某一个文件中
Java封装好了类: FileOutputStream文件输入流(字节输入流)。
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException {
// 将Java代码中的一个字符串写入到磁盘的某一个文件中
// 创建File对象,文件路径对象,告知编译器要把数据写到哪个文件中
File file = new File("c:/aaa/2.txt");
// 实例化字节输出流对象
FileOutputStream fos = new FileOutputStream(file);
// 对FileOutputStream加上缓冲的效果
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 将一个字符串写入到磁盘中
String str = "我就是我";
// 将str字符串转为字节数组
byte[] bytes = str.getBytes();
bos.write(bytes);
bos.flush();// 没有实际的意义,可以不写的
// 关闭流
// 在输入流的时候一定是先开的后关,后开的先关
bos.close();
fos.close();
}
}
也是输入流,将磁盘的某一个文件读取到内存。
FileReader是一个阅读字符文件的便利类,是专门处理字符文件的。比如txt文件。音频视频图片不能使用这个流。
FileReader是从字节流到字符流的桥:它读取字节,并使用指定的charset
将其解码为字符 。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
牵涉到解码,底层是字节流,但是会解码为字符。如果解码失败就意味着咱们读取失败了
一般不会使用字符流操作图片 音频 视频等,因为牵涉到解码。
开发一般使用字节流!!!
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException {
// 将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
// 新建一个File对象
File file = new File("c:/aaa/1.txt");
// 新建字符输入流FileReader对象
FileReader fr = new FileReader(file);
// FileRFeader没有缓冲的效果,可以加上缓冲的效果
BufferedReader br = new BufferedReader(fr);
// 字符的缓冲数组是字符
char[] cbuf = new char[4];//缓冲区是4个字符
// read(char[] cbuf) 将文件内容读取到字符数组中(缓冲区)
int length = -1;
while ((length = br.read(cbuf)) != -1) {
// 将数组展示到控制台
System.out.println(new String(cbuf, 0, length));
}
// 关闭流
br.close();
fr.close();
}
}
例:将一个字符串类型的数据写入到磁盘中
FileWriter写字符文件一个便利类。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo3 {
public static void main(String[] args) throws IOException {
// 从内存写入数据到磁盘的文件中
File file = new File("c:/aaa/2.txt");
FileWriter fw = new FileWriter(file);
// 加缓冲流
BufferedWriter bw = new BufferedWriter(fw);
// viod writer(char[] cbuf, int off, int length);
String str = "今天的天气真的太热了";
// 将字符串转为char数组
char[] chars = str.toCharArray();
// 将chars数组中 从0 开始 取3个字符写入到缓冲流中
bw.write(chars, 3, 3);
// 关闭流
bw.close();
fw.close();
}
}
import java.io.*;
public class Demo3 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("D:/桌面/aaa/斗破苍穹.txt")));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/桌面/aaa/bbb/斗破苍穹.txt")));
byte[] buf = new byte[4 * 1024];
int length = -1;
while ((length = bis.read(buf)) != -1) {
bos.write(buf, 0, length);
}
bos.close();
bis.close();
}
}