package io;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* IO流概述和分类
* IO流概述:
* 1、IO:输入/输出(Input/Output)
* 2、流:是一种抽象的概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输
* 3、IO流就是用来处理设备间数据传输问题的(如:文件上传、下载、复制等操作)
*
* IO流分类:
* 1、按照数据的流向分为:
* 输入流:读数据
* 输出流:写数据
* 2、按照数据类型来分:
* 字节流:
* 字节输入流、字节输出流
* 字符流:
* 字符输入流、字符输出流
*
* NOTE:
* 1、可以通过普通编辑器打开并编辑的文件就是字符流(如txt文件)
* 2、图像、视频等无法用普通编辑器编辑的文件就是字节流
* 3、如果不知道具体属于什么数据类型,就用字节流
* 3、字节流写入数据:
* 字节流抽象基类:
* 1、InputStream:这个抽象类是表示字节输入流的所有类的超类
* 2、OutputStream:这个抽象类是表示字节输出流的所有类的超类
* 3、字节流抽象类子类的特点:子类名称都是以其父类名作为子类名的后缀(如:FileInputStream)
* FileOutputStream:
* 1、创建文件输出流以指定的名称写入文件
* 4、字节缓冲流:
* 字节缓存流:
* BufferOutptStream:该类实现缓冲输出流,通过设置,应用可以向底层输出流写入字节,然后一次调用即可输出流的内容
* BufferedIlputStream:该类将创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据所包含的输入流中从新填充,一次很多字节
*
*/
public class IoDemo {
public static void main(String[] args) throws IOException {
/*byteBaseWrite();
byteBaseRead();
copyBase();
copyImg();*/
// buffDemo();
copyVideo();
}
/**
* 字节流的写入基本操作
* @throws IOException
*/
public static void byteBaseWrite() {
FileOutputStream fi = null;
try {
//构造方法需要指定一个资源路径
boolean append = true;//如果指定第二个参数为true 则在原文件后面追加内容
fi = new FileOutputStream("P:\\demo\\ddddd.txt",append);
//写入单个数据 注意:参数是 int 类型
fi.write(97);//注意:这是字节操作,因此97对应的是字符的a,所以文件中被写入了一个a
//换行
fi.write("\r\n".getBytes(StandardCharsets.UTF_8));
//写入多个数据 注意:参数是byte数组
byte[] bytes = "我喜欢Java".getBytes(StandardCharsets.UTF_8);//将字符串转换为byte字节
fi.write(bytes);//我喜欢Java
} catch (IOException e) {
e.printStackTrace();
} finally {
//操作完后一定要关闭资源
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 字节流的读取基本操作
*/
public static void byteBaseRead() {
FileInputStream fi = null;
try {
fi = new FileInputStream("P:\\demo\\ddddd.txt");
//一次读取一个字节
/*int read;
while ((read = fi.read()) != -1){
System.out.print(read);
}*/
//一次读取一个字节数组
byte[] bys = new byte[5];//字母和数字:一个字节, 汉字:GBK 2个字节 UTF8 3个字节
int len = fi.read(bys);//从该输入流读取最多 b.length 个字节的数据到一个字节数组
System.out.println(new String(bys,0,len));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 复制文件:
* 其实就是将一个文件的数据复制到另一个文件
*
* FileInputStream:打开文件,读取其中数据
* FileOutputStream:创建新文件,并将上面读取到的数据写入
*/
public static void copyBase() {
FileInputStream fi = null;
FileOutputStream fi1 = null;
try {
//打开文件
fi = new FileInputStream("P:\\demo\\ddddd.txt");
//创建文件
fi1 = new FileOutputStream("P:\\demo\\bbbbbbb.txt");
//读取打开的文件内容,将内容写入到新文件
int by;
while ((by = fi.read()) != -1){
fi1.write(by);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//操作完后一定要关闭资源
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fi1 != null) {
try {
fi1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 复制图片
*/
public static void copyImg() {
//打开文件
FileInputStream fi = null;
//写入文件
FileOutputStream fos = null;
try {
//打开文件
fi = new FileInputStream("C:\\Users\\admin\\Pictures\\IntelliJ IDEA 构建Java项目06.png");
//写入文件
fos = new FileOutputStream("C:\\Users\\admin\\Pictures\\ttttt.png");
//读取/写入文件 单个字节
int len;
while ((len = fi.read()) != -1) {
fos.write(len);
}
//读取/写入文件 字节数组
byte[] bys = new byte[1024];
int lens;
while ((lens = fi.read(bys)) != -1) {
fos.write(bys,0,lens);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 字节缓冲输出流和输入流
*/
public static void buffDemo() {
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try{
//创建缓冲输出流
bos = new BufferedOutputStream(new FileOutputStream("P:\\demo\\aaaaa.txt"));
//写入数据
bos.write("我喜欢Java,还喜欢Linux".getBytes(StandardCharsets.UTF_8));
//释放资源
bos.close();
//创建缓冲输入流
bis = new BufferedInputStream(new FileInputStream("P:\\demo\\aaaaa.txt"));
//读取数据
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
System.out.println(new String(bys,0,len));
}
//释放资源
bis.close();
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 复制视频
*/
public static void copyVideo() {
BufferedInputStream fis = null;
BufferedOutputStream fos = null;
try{
//打开文件
fis = new BufferedInputStream(new FileInputStream("C:\\Users\\admin\\Videos\\video_2020-12-18_17-34-09.mp4"));
//准备写入的文件
fos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\admin\\Videos\\video.mp4"));
//读取文件/写入文件
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1) {
System.out.println(len);
fos.write(bys,0,len);
}
fos.close();
fis.close();
}catch (IOException e){
e.printStackTrace();
}
}
}