java IO

本文详细介绍了Java中的文件操作方法,包括使用File类进行的基本文件和目录操作,如创建、删除、重命名等,以及如何利用FilenameFilter进行文件过滤。此外,还深入探讨了Java IO流的概念及其实现方式,涵盖字节流与字符流的区别、输入流与输出流的应用,并提供了具体的代码示例。

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

1.File

Flie类是java.io 包下代表与平台无关的文件和目录,也就是说,如果需要在程序中操作文件和目录,都可以通过File完成

1.1File相关方法

String getName() 返回此File对象的文件名或者路径名(如果是路径名,则返回最后一级路径名)
String getPath() 返回此File对象对应的路径名
File getAbsoluteFile() 返回File对象的绝对路径
String getAbsolutePath() 返回File对象对应的绝对路径名
String getParent() 返回File对象所对应目录的父目录名
Boolean renameTo(File newName)File重命名,成功返回true,失败返回false
boolean exists() 判断File对象对应的文件或者目录是否存在
boolean canWrite() 判断file对象什么能写
boolean canRead() 判断file对象是否能读
boolean isFile() 判断File是否是文件而不是目录
boolean isDirectory() 判断File对应的是否是目录,而不是文件
boolean isAbsolute() 判断File对应的文件或目录是否是绝对路径
long lastModified() 返回文件最后修改时间
long lenght() 返回文件内容长度
boolean createNewFile() 如果File对应的文件不存在时,则去创建一个新的文件
boolean delete() 删除File对象
boolean mkdir() 创建一个File对应的目录
String[] list() 列出File对象所有的子文件名和路径名
Flie[] listFiles() 列出File对象的所有子文件和路径
static File[] listRoots() 列出系统所有的根路径.

1.2 FilenameFilter 文件过滤器

在File类中的list()方法中可以接收一个FilenameFilter参数,通过参数可以列出符合条件的文件.

返回当前路径下所有的.java文件和文件夹
		String[] list = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".java") || new File(name).isDirectory();
            }
        });

2 IO流

2.1 流的分类

字节流和字符流的区别只是单位不同

输入流:只能从中读取数据,不能向其写入数据 InputStream/Reader :所有输入流的基类,前者为字节输入流,后者为字符输入流
输出流:只能向其写入数据,不能从中读取数据 OutputStream/Writer :所有输出流的基类,前者为字节输出流,后者为字符输出流

2.2 输入流

InputStream 和 Reader:他俩是所有输入流的抽象基类,本身并不能用来创建实例来输入.但是他们的方法所有的输入流都能用

InputStream
int read() 从输入流中读取单个字节,返回所读取的字节数据
int read(byte[] b):从输入流中读取最多b.lenght个字节的数据,
并将其存储在字节数组b中,返回实际的读取字节数
int read(byte[] b,int off,int len) 从输入流中最多读取len个字节是数据,
存在b中,并不是从起点开始,从off位置开始[b的off位置]
Reader
int read() 从输入流中读取单个字符,返回所读取的字节数据
int read(char[] b):从输入流中读取最多b.lenght个字符的数据,
并将其存储在字符数组b中,返回实际的读取字符数
int read(char[] b,int off,int len) 从输入流中最多读取len个字符是数据,
存在b中,并不是从起点开始,从off位置开始[b的off位置]

由于InputStream只是抽象类,不能创造实例,但是有一个用户读取文件的输入流,FlieInputStream,

		try {
		//获取storage/emulatd/0/Android/包名/flies/java.txt 文件
            File file = new File(getExternalFilesDir(null), "java.txt");
            FileInputStream fileInputStreanm = new FileInputStream(file);
            //获取文件大小设置容器大小就刚刚好
            byte[] bytes = new byte[(int) file.length()];
            int hasRead = 0;
            while ((hasRead=fileInputStreanm.read(bytes))>0){
                Log.d("==========",new String(bytes, 0, hasRead));
            }
            fileInputStreanm.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

FileReader同理.
大概的流程图就是这样的,FlieInputStream循环的从数据源中读取数据到指定的byte[]中
在这里插入图片描述

2.3 输出流

OutputStream和Writer也非常相似

OutputStream
void write(int c) 将指定的字节/字符输出到输出流中
void write(byte[]/char[] c):将指定的字节/字符数组输出到输出流中
并将其存储在字节数组b中,返回实际的读取字节数
void write(byte[]/char[] b,int off,int len) 
将字节数组/字符数组从off位置开始,长度为len的字节/字符输出到输出流中
Reader
void write(String c):将指定的字符串输出到输出流中
并将其存储在字节数组b中,返回实际的读取字节数
void write(String  b,int off,int len) 
将字符串从off位置开始,长度为len的字节/字符输出到输出流中
Reader

在上面FileInputStream的基础上实现一下FileOutStream

		try {
            File file = new File(getExternalFilesDir(null), "java.txt");
            new FileOutputStream(xxx,boolean)第二个参数如果是true,内容是追加类型的,false是覆盖类型默认false
            FileOutputStream fileOutputStream = new FileOutputStream(new File(getExternalFilesDir(null), "javas.txt"));
            FileInputStream fileInputStreanm = new FileInputStream(file);
            byte[] bytes = new byte[(int) file.length()];
            int hasRead = 0;
            while ((hasRead=fileInputStreanm.read(bytes))>0){
                fileOutputStream.write(bytes,0,hasRead);
            }
            fileInputStreanm.close();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值