IO流对象
File类
- 文件:计算机存储的(音乐,电影)
- 目录:Directory 计算机中的文件夹,文件夹中不能存储数据,用来保存文件的容器
- 路径:文件和目录所在计算机的位置
java.io.File类
:文件和目录以及路径,变成对象.File类的方法,操作对象
File类,具有平台无关性
File类的构造方法
URI:统一资源标识符,包含URL,包含非网址 tentent://, mailTo://,thrunder://
URL:统一资源定位符,就是所谓的互联网网络地址 协议://域名 http://www.baidu.com
File(String path)
字符串参数必须是路径,字符串路径变成File对象File(string parent,string child)
parent字符串类型的父路径, child字符串子路径- 绝对路径:路径在计算机中具有唯一性C:\Java\jdk1.8.0_221\bin
- 相对路径:相对路径:C:\Java\jdk1.81\bin, jdk1.8为参照路径
- c:\java是参照路径的父路径(上一级的文件夹)唯一性
- bin是参照路径上的子路径(下一级文件夹)可以多个
File(File parent, String child)
parent是File类型的父路径,child字符串子路径
File类的静态成员变量
static String separator
与系统有关的默认分隔符 \windows操作系统static String pathSeparator
与系统有关的路径分隔符";"一个路径结束了
File类的创建方法
boolean createNewFile()
创建新文件,成功返回true,文件的路径和文件名在File的构造方法中- 如果文件存在,不会创建
boolean mkdirs()
创建文件夹,成功返回true,如果文件存在,不会创建
public class FileDemo {
public static void main(String[] args) throws IOException {
method();
}
//创建文件
public static void method() throws IOException {
File file=new File("d:\\abc.txt");
boolean b=file.createNewFile();
System.out.println(b);
}
//创建文件夹
public static void method1() {
File file =new File("d:\\abc");
boolean b=file.mkdir();
System.out.println(b);
}
}
File类的删除方法
boolean delete()
删除文件或者文件夹
public static void method2() {
File file =new File("d:\\abc");
boolean b=file.delete();
System.out.println(b);
}
File类的判断方法
Boolean exists()
判断File构造方法中的路径,是否真的存在,存在返回true
public static void method3() {
File file =new File("d:\\abc");
boolean b=file.exists();
System.out.println(b);
}
boolean isDirectory()
判断File构造方法中的路径,是不是一个文件夹,是文件夹返回true
public static void method4() {
File file =new File("d:\\abc");
boolean b=file.isDirectory();
System.out.println(b);
}
boolean isFile()
判断File构造方法中的路径,是不是一个文件,是文件返回true
public static void method4() {
File file =new File("d:\\abc");
if(file.exists())//判断文件是否存在 {
boolean b=file.isFile();
System.out.println(b);
}
File类的获取
String getName()
返回File构造方法中,路径的名字,可能是文件夹名字,也可能是文件名String getPath()
返回路径名的字符串形态File getAbsoluteFile()
返回绝对路径,返回值是File对象File getParentFile()
返回路径的父路径,返回值是File对象
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
method6();
}
public static void method() throws IOException {
File file=new File("C:\\Users\\lj\\Desktop\\abc");
boolean b=file.exists();
System.out.println(b);
}
public static void method2() {
File file =new File("C:\\Users\\lj\\Desktop\\abc");
boolean b=file.isDirectory();
System.out.println(b);
}
public static void method3() {
File file=new File("C:\\Users\\lj\\Desktop\\abc");
String name=file.getName();
System.out.println(name);
}
public static void method4() {
File file=new File("C:\\Users\\lj","Desktop");
String path=file.getPath();
System.out.println(path);
}
/*
* File类获取方法,getAbsoluteFile()获取绝对路径
* eclipse环境,获取的绝对路径,是当前工程的路径
*
* */
public static void method5() {
File file =new File("abc");
File file2=file.getAbsoluteFile();
System.out.println(file2);
}
/*
* File类的获取方法,getParentFile()获取父路径的
* */
public static void method6() {
File file=new File("C:\\Users\\lj\\Desktop\\abc");
File parentFile=file.getParentFile();
System.out.println(parentFile);
}
File类的list开头的方法
long length()
获取到文件的字节数,文件夹没有字节数File[] 1istFiles()
获取构造方法中路径,里面的所有文件列表(文件夹)- 文件夹遍历
static File[] listRoots()
获取当前计算机中所有的根目录
public static void main(String[] args) {
method2();
}
/*
* File类方法,length()文件的字节数
*/
public static void method() {
File file =new File("D:\\eclipse\\eclipse\\configuration");
long length=file.length();
System.out.println(length);
}
/*
* File类方法,listFiles()遍历文件夹
*/
public static void method1() {
File file=new File("D:\\eclipse\\eclipse\\configuration");
File[] files=file.listFiles();
for(File f:files) {
System.out.println(f);
}
System.out.println(files.length);
}
/*
* File类方法,listRoots(()静态
*/
public static void method2() {
File[] files=File.listRoots();
for(File f:files) {
System.out.println(f);
}
}
文件过滤器
需求 :目录d:/abc里面有很多文件,File类的方法listFiles()获取abc目录下的文件,只需要java文件,其他类型都不需要
java.io.FileFilter
接口,文件过滤器接口,对获取的文件进行过滤- 此接口的实现类,可以传递给方法listFiles()
- 抽象方法boolean accept(File f)自定义实现类
Fiile[] listFiles( FileFilter filter )
传递文件过滤器的接口
public class FileListDemo03 {
public static void main(String[] args) {
File file =new File("d:/abc");
//遍历abc目录,方法传递文件过滤器实现类对象
File[] files = file.listFiles(new MyFiler());
for(File f : files) {
System.out.println(f);
}
}
}
//定义文件过滤接口的实现类
class MyFiler implements FileFilter{
public boolean accept(File pathname) {
//判断pathnam路径表示的文件是不是.java文件
//文件后缀名是不是.java String类方法endswith忽略大小写
return pathname.getName().toLowerCase().endsWith(".java");
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fvqvm45e-1595593846972)(C:\Users\15272\Desktop\笔记\笔记照片\文件过滤器.png)]
目录遍历
在遍历一个目录的时候,如果发现还有子目录,进去自己遍历
public static void main(String[] args) {
iteratorDir(new File("d:/abc"));
}
/*
* 目录的遍历:遍历那个目录,传递参数
*/
public static void iteratorDir(File dir) {
//File对象方法listFiles()目录的遍历
File[] files=dir.listFiles();
for(File f:files) {
//判断f是不是目录,如果还是 继续遍历 iteratorDir()就是接收目录,遍历目录
//在定义相同代码的方法,没有必要 ,我自己调用我自己
if (f.isDirectory()) {
iteratorDir(f);
}else {
System.out.println(f);
}
}
}
方法递归调用
递归是一种编写代码上的一种技巧,方法的自身调用,方法自己调用自己
适合:方法的主体功能不变,但是功能在执行的时候,参数会改变
方法递归注意事项
- 方法运行,自己调用自己秒回频繁进入栈内存
- 内存溢出:方法进入栈内存,内存已满
- 使用递归:一定要有方法的出口,递归不能太深入
- 方法递归计算1+2+3+…+100
- 方法功能不变,求和,每次就和数据是变化的
public static void main(String[] args) {
System.out.println(getsum(18180));
}
public static int getsum(int n) {
if (n==1)
return 1;
return n+getsum(n-1);
}
IO流对象
l : lnput 输入
o: Output输出
流对象︰数据流,数据从一个设备流入另一个设备
例子:文档从硬盘中流入到内存中,文档从内存中,流入到硬盘中
文档从硬盘中,流入到移动硬盘中
可以从一台机器,流到另一台机器
一切都是字节
任何数据,在文件中的形态都是字节(文本,图片,音乐)互联网传输
IO流的分类
- 按照数据的流向分
- 输入流 input
- 输出流 output
- 按照操作的数据类型分
- 字节流 字节流可以操作任意类型的数据
- 字符流 字符流只能操作文本类型的数据
- 什么是文本类型数据:使用文本工具(记事本,Notepad++)打开后,人可以直接阅读的
- 分类的合并
- 字节输入流
- 顶层的抽象基类:
java.io.IutputStream
- 顶层的抽象基类:
- 字节输出流
- 顶层的抽象基类:
java.io.OutputStream
- 顶层的抽象基类:
- 字符输入流
- 顶层的抽象基类:
java.io.Reader
- 顶层的抽象基类:
- 字符输出流
- 顶层的抽象基类:
java.io.Witer
- 顶层的抽象基类:
- 字节输入流
字节输出流
可以操作任意类型的数据,从Java的程序中.输出Output,又称为写入
OutputStream类的方法:都是写入数据的方法write
void write(int b)
写入单个字节void write(byte[] b)
写入字节数组void write(byte[] b int off,int len)
写入字节数组的一部分,开始索引,写入个数close()
关闭此流,释放资源
OutputStream类的子类
IO流对象的命名非常有可读性,前缀+后缀
前缀:这个流能干啥
后缀:这个流属于哪个分类
子类FileOutputStream:
- 构造方法
FileOutputStream(String name)
传递字符串的文件名(数据目的)FileOutputStream(File file)
/*
* io流写入文件的数据
* 字节输出流类FileOutputStream
* 流对象的使用公共步骤
* 1创建流对象
2调用流对象的方法,读取,写
3 释放资源
*/
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException{
method();
}
/*
* FileOutputStream写入当个字节
*/
public static void method() throws IOException{
//创建流对象,构造方法绑定数据目的
FileOutputStream fos=new FileOutputStream("D:/1.txt");
//流对象的方法write写入数据
fos.write(100);
//释放资源
fos.close();
}
/*
* FileOutputStream写入字节数组
*/
public static void method2() throws IOException{
//创建流对象,构造方法绑定数据目的
FileOutputStream fos=new FileOutputStream("D:/1.txt");
//创建字节数组
byte[] butes="asdasda".getBytes();
//字节流写入字节数组
fos.write(butes);
//写入字节数组的一部分
//开始索引,写入个数
fos.write(butes,3,2);
fos.close();
}
IO流对象,write方法,没有实现写入的功能,调用操作系统的功能,实现的写入,释放操作系统的资源
文件的追加和续写
FileOurputStream(String name,boolean append)
第二个参数是ture,追加写入
/*
* FileOutputStream追加写入
*/
public static void method3() throws IOException{
//创建流对象,构造方法绑定数据目的
FileOutputStream fos=new FileOutputStream("D:/1.txt",true);
//字节流写入字节数组
fos.write(111);
//写入字节数组的一部分
//开始索引,写入个数
fos.close();
}
- 换行写需要使用换行符\r\n
/*
* FileOutputStream换行写
* 上一行末尾下一行也行
* \r\n
*/
public static void method3() throws IOException{
//创建流对象,构造方法绑定数据目的
FileOutputStream fos=new FileOutputStream("D:/1.txt");
//字节流写入字节数组
fos.write("abc\n".getBytes());
fos.write("dfg".getBytes());
fos.close();
}
IO流的异常处理
import java.io.FileOutputStream;
import java.io.IOException;
/*
* IO流对象的异常处理:标准写法
* 资源释放,写在finally无论文件是否写入成功,资源必须释放
*/
public class FileOutputStreamDemo02 {
public static void main(String[] args) {
FileOutputStream fos=null;
try {
fos=new FileOutputStream("a.txt");
fos.write(97);
} catch (IOException e) {
e.printStackTrace();
}finally {
//fos创建失败,导致空指针异常,判断
if(fos!=null)
try {
fos.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}