IO 流

本文详细介绍了Java中的File类及其常用方法,涵盖了File流的操作步骤,包括字节流与字符流的区别与使用,以及如何通过流进行文件复制。深入理解了IO流、节点流和功能流的概念,重点展示了如何创建和管理输入输出流,以及处理异常和流的关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO流

File

文件或者目录的抽象表现形式

只能操作文件外部的内容,无法操作文件内部内容的读写

File仅表示一个联系,可能文件存在,也可能不存在,可以是文件,也可以是文件夹

File常用方法

File file  = new File("D://test.txt");

1、标记此抽象路径名指定的文件或目录,以便仅允许读取操作。

file.setReadOnly() 

2、测试应用程序是否可以修改此抽象路径名表示的文件。

file.canWrite()

3、当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件

​ 注意: 不能创建文件夹,只能创建文件

file.createNewFile()

4、删除此抽象路径名表示的文件或目录。

file.delete()

5、测试此抽象路径名与给定对象的相等性。

file.equals(file1)

6、测试此抽象路径名表示的文件或目录是否存在

file.createNewFile()

7、返回此抽象路径名的绝对形式

​ 返回此抽象路径名的绝对路径名字符串。 相对路径:默认相对于项目

file.getAbsolutePath()
file.getAbsoluteFile()

8、通过此抽象路径名返回分区名中未分配的字节数

file.getFreeSpace()

9、通过此抽象路径名返回分区名的大小

file.getTotalSpace()

10、返回此抽象路径名表示的文件或目录的名称

file.getName()

11、返回此抽象路径名父项的路径名字符串,如果此路径名未指定父目录,则返回 null 。
返回此抽象路径名父项的抽象路径名,如果此路径名未指定父目录,则返回 null 。

file.getParent()
file.getParentFile() 

12、测试此抽象路径名是否为绝对路径
测试此抽象路径名表示的文件是否为目录
测试此抽象路径名表示的文件是否为普通文件
测试此抽象路径名指定的文件是否为隐藏文件

file.isAbsolute()
file.isDirectory()
file.isFile()
filr.isHidden()

13、返回上次修改此抽象路径名表示的文件的时间

file.lastModified() 

14、返回此抽象路径名表示的文件的长度

file.length()

15、返回一个抽象路径名数组,表示此抽象路径名表示的目录中的文件。

file.listFiles()

16、返回一个字符串数组,用于命名此抽象路径名表示的目录中的文件和目录。

file.list()

17、创建此抽象路径名指定的目录

​ 创建此抽象路径名指定的目录,包括任何必需但不存在的父目录

file.mkdir()
file.mkdirs()

18、重命名此抽象路径名表示的文件。

file.renameTo(new File(""))

流(Stream)

数据以先入先出的顺序进行传输,流就是管道,就是用来传输数据的

数据源:数据从数据源写出

目的地:从目的地中把数据读出来

数据源 ——> 数据 ——> 目的地

IO流

输入输出流

分类

1、流向分:以程序为中心

输入流 :从节点到java内存

输出流 :从java内存到节点

2、操作单位分:

字节流 :万能流—>管道中的数据以字节为单位

**字符流 **:以字符为单位

3、功能分:

节点流 :能够实现读写能力的

功能流 :增强节点功能与性能的流

字节流 | 节点流

字节输入流:InputStream -> 输入字节流的父类 -> 抽象父类 -> 不能实例化

​ 文件字节输入流 FileInputStream -> 具体的类 -> 可以实例化

字节输出流 OutputStream -> 抽象父类 -> 不能实例化

​ 文件字节输出流 FileOutputStream -> 具体子类 -> 可以实例化

注意:

写出内容默认覆盖源文件内容

目标文件不存在系统会默认构建

目标文件所在的路径不存在,系统就不会创建

操作步骤

1、创建输入输出流

输入流:

FileInputStream(String name)	//name为数据源文件的路径字符串
FileInputStream(String file)	//file为目的地路径file对象
FileInputStream(String name, boolean append) 
//参数append是否追加数据,默认不追加覆盖,true->追加
InputStream is = new FileInputStream("D://test.txt",true);

输出流:

FileOutputStream(String name)	//name为数据源文件的路径
FileOutputStream(String file)	//file为目的地路径file对象
FileOutputStream(String name, boolean append) 
//参数append是否追加数据,默认不追加覆盖,true->追加
OutputStream os = new FileOutputStream("D://test.txt",true);

2、读入写出数据

读入:已经到达文件末尾没有读到数据时返回 -1

int read()	//从此输入流中读取一个字节的数据。

写出:

void write(int b) 将指定的字节写入此文件输出流。

3、刷出(输出时使用)

os.flush();

4、关闭流(释放内存)

is.close();
//或
os.close();

注意:

读入时可以每次读入一组数据(字节数组),重复读入:int read(byte[] b)

会出现FileNotFoundException和IOException异常,可以使用try…catch捕获

通过字节流流进行文件拷贝

文件拷贝流程:

1源文件
2输入流
3程序(中转站)
4输出流
5目的地新文件

注意:关闭流时后打开的先关闭

public class ByteCopyFile {
    public static void main(String[] args) {
        //1.定义输入输出流
        InputStream is = null;
        OutputStream os = null;
        //捕获异常
        try {
            is = new FileInputStream("D://test1.txt");
            os = new FileOutputStream("D://test2.txt");
            //2.读入写出
            //准备字符数组(长度建议1024整数倍)
            byte[] b = new byte[1024];
            int len = -1;
            //循环打印
            while ((len=is.read(b)) != -1){
                os.write(b,0,len);
            }
            //3.刷出
            os.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

字符流 | 节点流

字符输入流 Reader

​ 文件字符输入流 FileReader

字符输出流 Writer

文件字符输出流  FileWriter

注意:

子类无新增方法需要使用,可以多态指向

读入数据的时候如果出现乱码问题,注意字符编码格式统一

文件:
字节流 -> 万能流
字符流 -> 纯文本文件

1、创建输入输出流

输入流:

Reader rd = new FileReader("D://test.txt");

输出流:

Writer wt = new FileWriter("D://test.txt");

2、读入写出

读入:

(char)(rd.read());  //每次读入一个字符数据
rd.read(char[] cbuf) //将字符读入数组。

写出:

String msg = "Hello IOStream!!!";
wt.write(msg);

3、刷出

wt.flush();

4、关闭

rd.close();
//或
wt.close();

通过字符流实现文件拷贝

public class CharCopyFile {
    public static void main(String[] args) {
        //1.构建流
        Reader rd = null;
        Writer rt = null;
        try {
            rd = new FileReader("D://haha.txt");
            rt = new FileWriter("D://haha2.txt");
            //2.拷贝
            char[] car = new char[1024];
            int len = -1;
            while((len = rd.read(car))!=-1){
                rt.write(car,0,len);
            }
            //3.刷出
            rt.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭
            if(rt!=null){
                try {
                    rt.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(rd!=null){
                try {
                    rd.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
         if(rt!=null){
                try {
                    rt.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(rd!=null){
                try {
                    rd.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值