IO流——字节流
IO流的分类
按照流的方向分:①输入流 ②输出流
按照流中最小单位分:字节流 字符流
一、字节输入流:InputStream
概念:以内存为基准 来自磁盘文件/网络中的数据以字节的形式读取到内存中去的流称为字节输入流
常见API 的使用:
1.每次读取一个字节
public static void main(String[] args) throws Exception {
//创建一个文件字节输入流管道与源文件接通
InputStream is = new FileInputStream("File-IO-app\\src\\word.txt");//源文件的位置
// //读取一个字节返回
int b1 = is.read();
System.out.println((char) b1);
//使用循环读取
int b;
while ((b = is.read() )!= -1){
System.out.print((char) b);
}
}
2.一次读取字节数组的长度
public static void main(String[] args) throws Exception {
//创建一个文件字节输入流管道与源文件接通
InputStream is = new FileInputStream("File-IO-app\\src\\word01.txt");//源文件的位置
//定义一个字节数组 用于读取字节数组
byte[] buffer = new byte[3]; //一次读取3个字节
int len1 = is.read(buffer); //记录读取的长度
System.out.println("读取了" + len1 + "个字节");
String str1 = new String(buffer,0,len);//从0位置开始读取,读取的长度为len
System.out.println(str1);
// 使用循环进行读取,每次读取一个字节数组
byte[] buffer = new byte[3]; //每次读取3个字节
int len;//记录每次读取的字节数
while ((len= is.read(buffer)) != -1){
System.out.print(new String(buffer,0,len));
}
}
3.读取全部数组 可以避免读取中文内容乱码问题 一次读完
public static void main(String[] args) throws Exception {
//创建一个文件字节输入流管道与源文件接通
File f = new File("File-IO-app\\src\\word01.txt");
InputStream is = new FileInputStream(f);
//读取全部字节数组
byte[] buffer = is.readAllBytes();
System.out.println(new String(buffer));
}
二、字节输出流:OutputStream
概念:以内存为基准 来自磁盘文件/网络中的数据以字节的形式写入到内存中去的流称为字节输出流
常见API 的使用:
public static void main(String[] args) throws Exception{
//1.创建一个文件字节输出流管道与目标文件接通
OutputStream os = new FileOutputStream("File-IO-app\\src\\out.txt");//目标文件位置
//2.写数据出去
// public void write(int a) 写一个字节出去
// os.write('a');
// os.write(97);
// os.write(97);
// os.write('刘'); 中文会出现乱码 中文占3个字节 默认每次读取两个字节
// //public void write(byte[] buffer) 写一个字节数组出去
byte[] buffer = {'a', 97, '2', 97, 98};
os.write(buffer);
os.flush();//刷新数据生效
// os.close();//关闭输出流管道,减少内存占用
//写中文的数组进去
byte[] buffer2 = "今天天气不错".getBytes();
os.write(buffer2);
//写数组的一部分数据进去
byte[] buffer3 = {'a', 95, 95, 97, 98};
os.write(buffer3,0,3);//从位置0开始写入,长度是3个字节
// 1.字节输出流实现写出去的数据换行
// **os.write("\r\n".getBytes())**
// 2.写出去的数据刷新出来
// **os.flush()**
// 3.关闭输出流通道
// **os.close**
}
三、数据拷贝:
public static void main(String[] args) {
//1.创建一个字节输入流管道与源文件接通
try {
InputStream in = new FileInputStream("E:\\视频\\lv_0_20210607170153.mp4");//源视频路径
//2.创建一个字节输出流管道与目标文件接通
OutputStream out = new FileOutputStream("E:\\日落.mp4");//目标文件路径 可以没有文件名 会自动创建
//3.定义一个字节数组转移数据
byte[] buffer = new byte[1024];//一次传输1024字节
int len; //记录每次读取的字节数
while ((len = in.read(buffer)) != -1){
out.write(buffer,0,len);
}
System.out.println("复制完成!");
//4.用完关闭通道
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
四、资源释放:
将创建的的InputStream 和 OutputStream 放在try( )里面
//这里只能放置资源对象 用完会自动关闭 自动调取资源对象的close方法关闭资源 遇到异常也会关闭
try (
//1.创建一个字节输入流管道与源文件接通
InputStream in = new FileInputStream("E:\\视频\\lv_0_20210607170153.mp4");
//2.创建一个字节输出流管道与目标文件接通
OutputStream out = new FileOutputStream("E:\\日落.mp4");
) } catch (Exception e) {
e.printStackTrace();
}
五、字节缓冲输入流
//2.创建一个字节输入流管道与源文件接通
InputStream is = new FileInputStream("File-IO-app\\src\\word.txt")
//InputStream bin = new BufferedInputStream(InputStream in);
//a.把原始的字节输出流包装成高级的缓冲字节输入流
InputStream bin = new BufferedInputStream(is);
六、字节缓冲输出流
//2.创建一个字节输出流管道与目标文件接通
OutputStream out = new FileOutputStream("E:\\日落.mp4");//目标文件路径
//a.把原始的字节输出流包装成高级的缓冲字节输出流
OutputStream bout = new BufferedOutputStream(out);