[Java进阶] File类和IO流

本文详细介绍了Java中的File类,包括构造方法和常用方法,如获取绝对路径、判断文件属性、创建与删除文件等。同时,文章还深入探讨了IO流的分类,如字节流与字符流,以及各种构造方法和读写方法,如FileOutputStream、FileInputStream、缓冲流等,旨在帮助读者更好地理解和操作文件及流操作。
摘要由CSDN通过智能技术生成

目录

File类

构造

常用方法

IO流

分类

字节输出流

构造方法

写入方法

字节输入流

构造方法(类比输出流)

读取方法

缓冲字节输出流

构造方法

缓冲字节输入流

构造方法

字符输出流(转换流)

构造方法

常用方法

字符输入流

构造方法

常用方法 

便捷字符输出流

构造方法

便捷字符输入流

构造方法

缓冲字符输出流

构造方法

特有方法 

缓冲字符输入流

构造方法

特有方法


File类

构造

1.File(String pathname): 给定文件路径(绝对路径/ 相对路径)封装成file对象

2.File(String parent, String child): 通过父路径名和子路径名, 创建file对象

3.File(File parent, String child): 通过父文件和子路径名, 创建file对象

File f1 = new File("D:\\Pro\\File\\HelloWorld.txt");
File f2 = new File("D:\\Pro\\File","HelloWorld.txt");
File f3 = new File("D:\\Pro\\File")
File f4 = new File(f3,"HelloWorld.txt");

常用方法

路径相关

1.public String getAbsolutePath(): 获取绝对路径

File f = new File("D:\\Pro\\File\\a.txt");
String abs = f.getAbsolutePath();
System.out.println("该文件的绝对路径是:"+abs);

2.public String getPath(): 获取封装时的路径

String path = f.getPath();
System.out.println("该文件封装时的路径是:"+path);

3.public String getName(): 获取最末的文件或者文件夹名

String name = f.getName();
System.out.println("该文件的名字是:"+name);

4.public String getParent(): 获取父路径

String parentName = f.getParent();
System.out.println("该文件的父文件名是:"+parentName);

5.public File getParentFile(): 获取父路径并封装成file

File parentFile = f.getParentFile();
System.out.println("该文件的父文件封装成file对象:"+parentFile);

判断

6.public boolean exists(): 判断路径是否真实存在

File fileOne = new File("D:\\Pro\\File\\HelloWorld.txt");
System.out.println("fOne存在吗:"+fileOne.exists());

7.public boolean isDirectory(): 判断是否是文件夹(不是文件夹也可能不存在)

System.out.println("fOne是文件夹吗:"+fileOne.isDirectory());

8.public boolean isFile(): 判断是文件(不是文件也可能不存在)

System.out.println("fOne是文件吗:"+fileOne.isFile());

创建

9.public boolean createNewFile(): 创建一个新的空文件

//创建文件  父路径必须存在 不然报异常
File file = new File("D:\\Pro\\File\\a");
boolean newFile = file.createNewFile();
System.out.println(newFile);

10.public boolean mkdir(): 创建单级文件夹

//创建文件夹  父路径必须存在 不然返回false
File file1 = new File("D:\\Pro\\File\\a\\b");
boolean mkdir = file1.mkdir();
System.out.println(mkdir);

11.public boolean mkdirs(): 创建多级文件夹

//中间可以有不存在的文件夹, mkdirs自动创建补齐
File file1 = new File("D:\\Pro\\File\\a\\b\\c");
boolean mkdirs = file1.mkdirs();
System.out.println(mkdirs);

删除

12.public boolean delete(): 删除文件或删除没有子文件的文件夹

//删除的内容无法在回收站找回
//若file是文件夹且文件夹中还有子文件或者空文件夹, 则删除不成功
boolean delete = file.delete();
System.out.println(delete);

遍历

13. public file[] listFiles(): 将文件夹中的直系文件封装成数组返回, 不包括file文件夹

当file是文件时 files==null , 当file是空文件夹时 files.length==0

File[] files = file.listFiles();
//一般搭配遍历使用

IO流

分类

1.输入流 和 输出流

   针对内存来说的输入输出(读取,写入)

2.字节流 和 字符流

   任何文件都可以使用字节流读取写入, 只有纯文本文件才能使用字符流读取写入


字节输出流

构造方法

1.FileOutputStream(File file): 封装file进去,如果存在清空文件内容, 不存在则创建一个文件

2.FileOutputStream(String path): 封装string底层转成file,如果存在清空文件内容, 不存在则创建一个文件

//输出流的创建  构造  封装一个file   或者 传入一个string底层封装成file
//如果存在, 清空文件内容,并绑定   不存在 则创建该文件 并绑定
FileOutputStream fos1 = new FileOutputStream(new File("io\\hello.txt"));
FileOutputStream fos2 = new FileOutputStream("io\\src\\com\\io\\world.txt");

3.FileOutputStream(File file,boolean append): 默认append是false,append为true则不清空原文件内容, 追加内容到文件中 

4.FileOutputStream(String path,boolean append): 默认append是false,append为true则不清空原文件内容, 追加内容到文件中 

FileOutputStream fos3 = new FileOutputStream(new File("io\\hello.txt"),true);
FileOutputStream fos4 = new FileOutputStream("io\\src\\com\\io\\world.txt",true);

写入方法

1.public void write(int i): 一次一个字节的写入

FileOutputStream fos1 = new FileOutputStream(new File("io\\hello.txt"));
fos1.write(97);

2.pubic void write(byte[] bytes): 一次一个数组的写入

byte[] bytes = {97,72,101,108,108,111};
fos.write(bytes);
//字节流对字符并不友好, 对于中文的写入使用  中文.getBytes()的方式
fos.write("中国".getBytes);

3.public void write(byte[] bytes,int off, int len): 一次写入数组一部分,从off索引开始写len个元素

fos.write(bytes,2,3);

字节输入流

构造方法(类比输出流)

1.FileInputStream(File file): 如果存在文件可读取, 不存在报异常, 是文件夹报异常(拒绝访问)

2.FileInputStream(String path): 封装string底层转成file, 不存在报异常, 是文件夹报异常(拒绝访问)

FileInputStream fis1 = new FileInputStream(new File("io\\hello.txt"));
FileInputStream fis2 = new FileInputStream("io\\hello.txt");

读取方法

1.public int read(int i):  每次读一个字节返回字节的int值 , 当读取int为-1表示读到文件末尾

int i = fis.read();
System.out.println("本次读取的内容是:"+i+"强转后得到的内容是:"+(char)i);
//这种方式不能用在读取中文上, 一个中文是两个或三个字节, 每次读取到的只是二分之一或者三分之一的内容

//遍历
while((i=fis.read)!=-1){
    System.out.println("本次读取的内容是:"+i+"强转后得到的内容是:"+(char)i);
}

2.public int read(bytes[] b): 将字节放入数组读取 返回有效元素个数

每次字节数组读到内容会覆盖掉数组中上一次读取到的内容, 如果最后一次读取到的并不是完整的byte长度的内容, 会出现部分脏数据, read方法返回的是数组中有效的元素个数, 当返回-1表示读取到文件末尾

FileInputStream fis = new FileInputStream("Chapter-11-io\\hello.txt");
int i;
//一次读取1024个字节
byte[] b = new byte[1024];
while((i=fis.read(b))!=-1){
//创建一个string字符串,读取byte数组, 从0索引开始读i个元素
    String s = new String(b,0,i);
    System.out.println(s);
}

缓冲字节输出流

在字节输出流的基础上, 添加了一块缓冲区, 缓冲字节输出流并不具备写的能力, 只是将字节放到缓冲区中, 需要一个字节输出流将缓冲区种的内容写到文件

构造方法

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("io\\hello.txt")));

缓冲字节输入流

构造方法

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("io\\hello.txt")));

字符流相对于字节流, 更好的对文本类型的文件进行读取和写入

字符输出流(转换流)

字符流的父类是writer和reader, 不具备读和写的能力, 只是对字节和字符进行转换, 具体的读取写入功能需要字节流进行读取和写入

构造方法

字符输出流也叫做转换流, 使用它的构造方法,将字节输出流作为参数, 返回一个字符输出流, 完成从字节流到字符流的转换

1.OutputStreamWriter(OutputStream out): 以平台默认的编码方式进行写入
2.OutputStreamWriter(OutputStream out, String charsetName): 以自定义的编码方式写入

//以平台默认的编码方式进行写入
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("io\\hello.txt")));
//以自定义的编码方式写入
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("io\\hello.txt")),"GBK");

常用方法

1.public void write(int i): 一次写一个字符

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("io\\hello.txt")));
//char类型在运算时提升为int, 因此可以直接写字符
osw.write('我');
//如果最后不释放资源, 则数据都留在了缓冲区中, 只有手动关闭流, 才真正把缓冲区的数据写入到文件
osw.close;

2.public void write(char[] c): 一次写一个字符数组

char[] c = {'你','好','呀','!'};
osw.write(c);
osw.close;

3.public void write(char[] c, int off, int len): 一次写一个字符数组, 从off开始写len个字符

char[] c = {'今','天','天','气','不','错','!'};
//将字符数组c的内容写入文件, 从0索引开始, 写4个字符  今天天气
osw.write(c,0,4);
osw.close;

4.public void write(String s): 一次写一个字符串

//写入一个换行符, 不会显示, 但是系统到这里会换行
osw.write("/r/n");
osw.close;

5.public void write(String s,int off, int len): 一次写一个字符串, 从off开始写len个字符

String s = "最近天气好热.";
//将字符串s的内容写入文件, 从索引2开始, 写4个字符   天气好热
osw.write(s,2,4);
osw.close;

字符输入流

构造方法

1.InputStreamReader(InputStream in): 以平台默认的编码方式对文件进行读取
2.InputStreamReader(InputStream in, String charsetName): 以自定义的编码方式对文件进行读取

//以平台默认的编码方式对文件进行读取
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("io\\hello.txt")));
//以自定义的编码方式对文件进行读取
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("io\\hello.txt")),"GBK");

常用方法 

1.public int read(): 一次读一个字符, 将读取到的数据返回, 如果读到文件末尾, 返回-1

InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("io\\hello.txt")));
int i;
while((i=isr.read())!=-1){
    System.out.println("这次读取到的字符是:"+(char)i);
}
isr.close;

2.public int read(char[] c): 一次读一个字符数组, 返回读取到数组的有效个数, 读到末尾返回-1

每次字符数组读到内容会覆盖掉数组中上一次读取到的内容, 如果最后一次读取到的并不是完整的char[]长度的内容, 会出现部分脏数据, read方法返回的是数组中有效的元素个数, 当返回-1表示读取到文件末尾

char[] c = new char[1024];
int i;
while((i=isr.read(c))!=-1){
//每次读取数组c返回的有效个内容
    String s = new String(c,0,i);
    System.out.println(s);
}

便捷字符输出流

构造方法

1.FileWriter(File file): 底层封装了一个输出流对象, 再将file参数传进去, 相比字符输出流不能指定字符编码但更方便快捷

2.FileWriter(String fileName):

FileWriter fw = new FileWriter(new File("io\\hello.txt"));
FileWriter fw = new FileWriter("io\\hello.txt");

便捷字符输入流

构造方法

1.FileReader(File file): 底层封装了一个输入流对象, 再将file参数传进去, 更方便

2.FileReader(String fileName):

FileReader fr = new FileReader(new File("io\\hello.txt"));
FileReader fr = new FileReader("io\\hello.txt");

缓冲字符输出流

字符缓冲流相较于原生字符流或者便捷字符流, 速度更快, 还有一些特有方法

构造方法

BufferedWriter(Writer w): 传入一个字符输出流

//使用便捷字符输出流作为参数
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("io\\hello.txt")));
//使用原生字符输出流作为参数
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("io\\hello.txt"))));

特有方法 

public void newLine(): 写一个换行符

BufferedWriter bw = new BufferedWriter(new FileWriter(new File("io\\hello.txt")));
bw.write("今天天气很好");
bw.newLine();
bw.write("今天不会下雨了");
bw.close;

缓冲字符输入流

构造方法

BufferedReader(Reader r): 传入一个字符输入流

//传入原生字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("io\\hello.txt"))));
//传入便捷字符输入流
BufferedReader br = new BufferedReader(new FileReader(new File("io\\hello.txt")));

特有方法

public String readLine(): 一次读取一行的内容并返回, 如果读到文件末尾返回null

BufferedReader br = new BufferedReader(new FileReader(new File("io\\hello.txt")));
String info;
while((info=br.readLine())!=null){
    System.out.println(info);
}
br.close;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值