1.IO流的概念
是一种抽象概念,是对数据传输的总称,也就是说数据在设备之间的传输称为流,流的本质是数据传输。
IO流就是用来处理设备之间的传输问题:
常见的应用:文件传输,文件复制,文件下载
2.缓冲的概念
比如视频卡,需要暂停,加载缓冲一下。IO流的本质就是堆电脑的文件进行读和写的。
计算机通过CPU内存读取磁盘上面的文件数据,一次读取1字节。但是可以加上缓冲的概念,每次读取4kb。
3.IO流的分类
1.从磁盘读取数据到内存(Java代码)输入流
2.从内存(Java代码)写入数据到磁盘 输出流
1:
input:输入 从磁盘读取数据到内存
输入流分为两种:
1.字节输入流 2.字符输入流
输出流分为两种:
1.字节输出流 2.字符输出流
3.1字节输入流
字节输入流:磁盘上有一个1.txt文件,现在要将1.txt文件中的内容读取到内存(Java中)
Java给咱们封装好了类:FileInputStream文件输入流(字节输入流)。
import java.io.*;
public class Demo1 {
public static void main(String[] args) throws IOException {
//1.创建File对象,是咱们本地磁盘文件的一个File对象
File file = new File("D:/aaa/bbb/1.txt");
//2.创建文件字节输入流对象,来操作2.txt
FileInputStream fis = new FileInputStream(file);
//3.fileInputStream 这个流不具备缓冲的效果。
BufferedInputStream bis = new BufferedInputStream(fis);
//使用字节缓冲流操作咱们的2.txt
int length =-1;
//5.创建一个缓冲区的数组 byte 为啥是byte类型的数组
byte[] bytes = new byte[4 * 1024];
//6.读取数据
while ((length = bis.read(bytes)) != -1){
System.out.println(new String(bytes,0,length));
}
bis.close();
fis.close();
}
}
3.2字节输出流
将Java数据写入到磁盘上面
内存=》磁盘 输出流
import java.io.*;
public class Demo2 {
public static void main(String[] args) throws IOException {
//将Java代码中的一个字符串写入到咱们的磁盘的某一个文件中
//1.创建File对象,文件路径对象 告知编译器要把数据写到哪个文件中
File file = new File("D:/aaa/bbb/2.txt");
//2.实例化字节输出流对象
FileOutputStream fos = new FileOutputStream(file);
//3.对FileOutputStream 加上缓冲的效果
BufferedOutputStream bos = new BufferedOutputStream(fos);
//4.将一个字符串写入到磁盘中
String str = "但使龙城飞将在,不教胡马度阴山。";
byte[] bytes = str.getBytes();
bos.write(bytes);
//5.写完以后一定要刷新流然后关闭流
bos.flush();
//6.关闭流
bos.close();
fos.close();
}
}
案例:
将D:/aaa文件夹下面一个视频 (源文件) 复制到D:/aaa/bbb文件夹下面
import java.io.*;
public class Demo3 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("D:/aaa/QQ.mp4")));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/aaa/bbb/copy.mp4")));
int length = -1;
byte[] bytes = new byte[4*1024];
while ((length = bis.read(bytes)) != -1){
bos.write(bytes,0,length);
}
bos.close();
bis.close();
}
}
3.3字符输入流
也是输入流,将磁盘的某一个文件读取到内存。
FileReader:
是一个阅读字符文件的便利类,是专门处理字符文件的,比如txt文件。音频视频图片
不能使用这个流。
package com.qfedu.d_FileReader;
import java.io.*;
public class Demo1 {
public static void main(String[] args) throws IOException {
//将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
//和字节流一模一样
//1.新建一个File对象
File file = new File("c:/aaa/1.txt");
//2.新建FileReader 对象 字符输入流
FileReader fr = new FileReader(file);
//3.FileRFeader没有缓冲的效果,可以加上缓冲的效果
//杂加?BufferedReader
BufferedReader br = new BufferedReader(fr);
//4.字节的缓冲数组 是字节
//字符的缓冲数组 是字符
char[] cbuf = new char[4];//缓冲区是4个字符
//这个方法是用的!!!
//5. read(char[] cbuf) 将文件内容读取到字符数组中(缓冲区)
int length = -1;
while ((length = br.read(cbuf)) != -1) {
System.out.println(length);
//6.将数组展示到控制台
System.out.println(new String(cbuf, 0, length));
}
//7.关闭流
br.close();
fr.close();
}
}
3.4字符输出流
将一个字符串类型的数据写入到磁盘中
FileWriter
写字符文件一个便利类
package com.qfedu.e_fileWriter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class Demo1 {
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();
}
}
一次只读一行
public class Demo4 {
public static void main(String[] args) throws IOException {
//将c盘下面的aaa文件夹下面的1.txt文件的内容 读取到Java内存中
//和字节流一模一样
//1.新建一个File对象
File file = new File("c:/aaa/1.txt");
//2.新建FileReader 对象 字符输入流
FileReader fr = new FileReader(file);
//3.FileRFeader没有缓冲的效果,可以加上缓冲的效果
//杂加?BufferedReader
BufferedReader br = new BufferedReader(fr);
//一次读取一行数据,r如果到达行的末尾就返回就是一个null
// String s = br.readLine();
// System.out.println(s);
// String s1 = br.readLine();
// System.out.println(s1);
String str;
//有可能会用的
while ((str = br.readLine()) != null) {
System.out.println(str);
}
//7.关闭流
br.close();
fr.close();
}
}
综合案例:
复制一本小说到另外一个盘符下面
package com.qfedu.e_fileWriter;
import java.io.*;
public class Demo4 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(new File("c:/bbb/DiBa.txt")));
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("c:/aaa/sb1.txt")));
int length = -1;
char[] cbuf = new char[4 * 1024];
while ((length = br.read(cbuf)) != -1) {
bw.write(cbuf, 0, length);
}
bw.close();
br.close();
}
}