IO流
字节流
文件字节输出流

一般用与源文件路径接通

java
package com.itheima.fileoutputstream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class FileOutputStreamDemo1 {
public static void main(String[] args) throws Exception {
//目标:学会使用文件字节流输出
//1.创建文件字节输出流管道与目标文件接通
//OutputStream fos = new FileOutputStream("day03-file-io\\src\\lll05");//多态 写数据到文件它会自动创建,不需要事先创建。 覆盖管道
OutputStream fos = new FileOutputStream("day03-file-io\\src\\lll05",true);//多态 写数据到文件它会自动创建,不需要事先创建。 追加管道
//2、写入数据
fos.write(97);//写入一个字节数据
fos.write('a');
//fos.write('林');
fos.write("\r\n".getBytes());//\r\n换行兼容性好
//3、写一个字节数组
byte[] bytes = {97,98,99,100,101};
fos.write(bytes);
fos.write("\r\n".getBytes());
//4、写一个字节数组的一部分出去
fos.write(bytes,0,3);
fos.write("\r\n".getBytes());
//5、用完流都得关掉,关闭管道
fos.close();
//解释:内存与磁盘中有一条线,内存速度较快,磁盘速度较慢,用完之后要关闭流释放这条线
}
}
文件字节输出流小结

文件复制

java
package com.itheima.demo6copy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyDemo1 {
public static void main(String[] args) throws Exception {
//目标:使用字节流完成文件的复制操作
//源文件:D:\照片\yy.png
//目标文件:C:\照片\yy.png(复制过去的时候必须带文件名,无法自动生成文件名)
copyFile("D:\\照片\\yy.png","C:\\照片\\yy.png");
}
//复制文件
public static void copyFile(String srcPath,String destPath) throws Exception{
//1、创建一个文件字节输入流管道与源文件接通
InputStream fis = new FileInputStream(srcPath);
//2、创建一个文件字节输出流管道与目标文件接通
OutputStream fos = new FileOutputStream(destPath);
//3、定义一个字节数组,用于存取数据
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
//4、把读取到的数据,写入到输出流中,一桶(1024个字节)一桶写
fos.write(buffer, 0, len);
}
System.out.println("复制完毕");
fos.close();
fis.close();
}
}
字节流非常适合做文件的复制操作
任何文件的底层都是字节,字节流做复制,是一字不漏的转移完全部字节,只要复制后的文件格式一致就没问题
资源释放问题
快捷键:ctrl+Alt+t

基于该资源释放方案修改前面的图片复制代码
缺点:臃肿
java
package com.itheima.demo6copy;
import java.io.*;
public class CopyDemo1 {
public static void main(String[] args) throws Exception {
//目标:使用字节流完成文件的复制操作
//源文件:D:\照片\yy.png
//目标文件:C:\照片\yy.png(复制过去的时候必须带文件名,无法自动生成文件名)
copyFile("D:\\照片\\yy.png","C:\\照片\\yy.png");
}
//复制文件
public static void copyFile(String srcPath,String destPath) throws Exception{
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//即便这里出现了异常,那么fos和fis也会被关闭
//1、创建一个文件字节输入流管道与源文件接通
fis = new FileInputStream(srcPath);
//2、创建一个文件字节输出流管道与目标文件接通
fos = new FileOutputStream(destPath);
//3、定义一个字节数组,用于存取数据
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
//4、把读取到的数据,写入到输出流中,一桶(1024个字节)一桶写
fos.write(buffer, 0, len);
}
System.out.println("复制完毕");
} catch (IOException e) {
e.printStackTrace();
} finally {
//最后一定会执行一次,即便程序出现异常
try {
if(fos !=null)fos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
if(fis !=null)fis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
新方法
1、什么是资源?
资源一般指的是最终实现了AutoCloseable接口
2、try()里面只能放置资源对象,用完后,最终会自动调用其close方法关闭

使用最新方法关闭流
java
package com.itheima.demo6copy;
import java.io.*;
public class CopyDemo1 {
public static void main(String[] args) throws Exception {
//目标:掌握资源的新方式
//源文件:D:\照片\yy.png
//目标文件:C:\照片\yy.png(复制过去的时候必须带文件名,无法自动生成文件名)
copyFile("D:\\照片\\yy.png","C:\\照片\\yy.png");
}
//复制文件
public static void copyFile(String srcPath,String destPath) throws Exception{
try (
//这里只能放置资源对象,用完后,最终会自动调用其close方法关闭
//1、创建一个文件字节输入流管道与源文件接通
FileInputStream fis = new FileInputStream(srcPath);
//2、创建一个文件字节输出流管道与目标文件接通
FileOutputStream fos = new FileOutputStream(destPath);
)
{
//3、定义一个字节数组,用于存取数据
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
//4、把读取到的数据,写入到输出流中,一桶(1024个字节)一桶写
fos.write(buffer, 0, len);
}
System.out.println("复制完毕");
} catch (IOException e) {
e.printStackTrace();
}
}
}