Java从小白到大佬(File文件类以及IO流)

1.File类

1.1.什么是File文件类?

在文件系统中,每一个文件都存放在一个目录下。
File.separator 文件路径分隔符 / File.pathSeparator 文件分割符;

1.1.1.绝对路径

是由文件名和他的完整路径以及驱动器字母组成。例如:C:\Administrator\Desktop\hello.java

1.1.2.相对路径

相对于当前工作目录的。

1.2.关联文件

File file=new File(“C:\Users\Administrator\Desktop\hello.txt”);//后缀名与创建的文件无关
File file=new File(String parent,String child); 在父文件下面创建子文件 string后面是路径
File file=new File(uri); uri:统一资源定位符 类似于网址的东西

1.3.操作文件的常用指令

1.file.creatNewFile();创建该对象文件指令 有返回值 返回Boolean
2.file.mkdir()/file.mkdirs();创建文件夹 有返回值,返回Boolean
3.file.delete();删除文件或目录 有返回值,返回boolean 删除多级目录时每次只能删最后面的文件夹 当目录中有文件的时候无法直接删除该目录
4.file.renameTo():重命名 file.renameTo() 同目录下为更名,不同目录下为剪切

1.4.文件列表List

在关联文件之后需要对所关联的文件进行操作。

File file=new File("C:\\Administrator\\Desktop");
File [] files=file.listFile();//可以显示当前目录中所有文件返回的是File数组

1.4.1.获取当前目录下的文件

File file=new File("C:\\Administrator\\Desktop");
File [] files=file.listFile();
for(String string : files){
	System.out.println(String);
}

1.4.2.获取当前目录下的文件(包括下级目录里面的文件)

String path="C:\\Users\\Administrator\\Desktop";
		File file=new File(path,"hello.java");
		try {
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
public static void showList(File file,int level) {
		File [] filename=file.listFiles();
		if(filename==null) {
			return;
		}
		for (File file2 : filename) {
			if(file2.isFile()) {
				System.out.println(level+" : "+file2.getAbsolutePath());
			}else {
				showList(file2,level+1); //递归调用
			}
		}
	}

1.4.3.获取以指定后缀名结尾的文件

1.4.3.1.普通查找(只能查找处当前目录里符合要求的文件)
String path="C:\\Users\\Administrator\\Desktop";
		File file=new File(path);
		String [] folder=file.list();
		//1.普通查找
		for (String string : folder) {
			if(string.endsWith(".png")) {
				System.out.println(string);
			}
		}
1.4.3.2.递归查找(可以查找出该目录下所有符合要求的文件)
String path="C:\\Users\\Administrator\\Desktop";
		File file=new File(path);
private static void Recursive(File file) {
		File [] file1=file.listFiles();
		if(file1==null) {
			return;
		}
		for (File file2 : file1) {
			if(file2.isFile()) {
				if(file2.getName().endsWith(".png")) {
					System.out.println(file2.getName());
				}
			}else {
				Recursive(file2);
			}
		}
	}
1.4.3.3.过滤器查找(普通查和递归查的融合,在找的时候进行筛选,降低时间复杂度,但是也只是查找当前目录)
String [] name2=file.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(".png");
			}
		});
		for (String string : name2) {
			System.out.println(string);
		}
	}
1.4.3.4.利用递归思想对链栈进行尾插法
main(){
}
class Link{
	Node head;
	public Link(){
		head.e=0;
		head.next=null;
	}
	public void add(int e){
		Node p=head;
		add2(p,e);
	}
	public void add2(Node p,int e){
		if(p.next==null){
			Node n=new Node();
			n.e=e;
			p.next=n;
			n.next=null;
		}else{
			add2(p.next,e);
		}
	}
	public void print(){
		print(head);
	}
	private void print(Node p){
		if(p.next!=null){
			System.out.println(p.next.e);
			print(p.next);
		}else{
			System.out.println(p.e);
		}
	}
}
class Node{
	int e;
	Node next;
}

1.4.4.过滤器

由于过滤器只使用一次 所以可以通过使用匿名实现子类的匿名对象来解决。

public String[] list(FilenameFilter filter) 
public File[] listFiles(FileFilter filter)
FileFilter 是一个比FilenameFilter更高级的接口 原因是filter可以return更多的东西

2.IO流

2.1.简介IO及分类

为了对文件内容与操作
IO流:
按照流向分为:输入流 输出流
按照类型分 :字节流 字符流(字节流+码表) 字符流的本质就是字节流
在这里插入图片描述

2.2.IO流的四大基类

1.FileInputStream 字节输入流
2.FileOutputStream 字节输出流
3.Reader 字符输入流
4.writer 字符输出流

2.3.FileInputStream 字节输入流

此抽象类是表示字节输入流的所有类的超类。需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法。
在这里插入图片描述

2.3.1.创建字节输入流

法1)File file=new File("C:\\Administrrtor\\Desktop\\hello.txt");
	FileInputStream fis=new FileInputStream(file);
法2)FileInputStream fis=new FileInputStream("C:\\Administrrtor\\Desktop\\hello.txt");

2.3.2.read()函数

2.3.2.1.read();

file.read() 从此输入流中读取一个数据字节。如果已到达文件末尾,则返回 -1(迭代步骤当第一个字节读取完之后会自动读向下一个字节)

void Demo(){
File file=new File("C:\\Administrrtor\\Desktop\\hello.txt");
FileInputStream fis=new FileInputStream(file);
int ch=0;
while((ch=fis.read())!=1){
		System.out.println(ch);//输出读取的字节码
	}
	fis.close();
}
2.3.2.2.read(byte[]);

由于一个字节一个字节的读取文件速度过慢,所以read还有一个带参的方法用来读取文件

private static void test3() throws IOException {
		File file=new File("Hello.txt");
		FileInputStream fis=new FileInputStream(file);
		byte [] buf=new byte[6];
		int len=0;
		while((len=fis.read(buf))!=-1) {
			System.out.println(len);//输出的是读取的有效字节码长度
			System.out.println(new String(buf,0,len));//将字节码用字符串输出
		}
		fis.close();
}
2.3.2.3.读取整个文件:while循环+read()

2.4.FileOutputStream 字节输出流

此抽象类是表示字节输入流的所有类的超类。字节输出流和字节输入流大致相同。
在这里插入图片描述

2.4.2.write()方法

在字节输入流中read()是用来读取文件,则输出流中的write()是用来输入文件内容。

2.4.3.复制文本

2.4.3.1.复制文件

1.确定源文件和目标文件
2.确定输入流和输出流
一个字节一个字节的读 效率低
读数组 效率高

public class FileCopy {
	public static void main(String[] args) throws IOException {
		String path1="C:\\Users\\Administrator\\Desktop\\IO.txt";
		String path2="C:\\Users\\Administrator\\Desktop\\tu.txt";
		File from =new File(path1);//源文件
		File to =new File(path2);//目标文件
		copy(from,to);
	}
	private void copy(File from,File to){
	File [] file=from.listFiles();
		if(file==null) {
			return;
		}
		for (File file3 : file) {
			if(file3.isFile()) {
				copyFile(file3,to);
			}else {
				copy(file3,to);
			}
		}
	private void copyFile(File from,File to){
		File aimFile=new File(to,file.getName());
		aimFile.createNewFile();
		FileInputStream fis=new FileInputStream(file);
		FileOutputStream fos=new FileOutputStream(aimFile);
		byte[]buf=new byte[1024];
		int len=0;
		while((len=fis.read(buf))!=-1) {
			fis.write(buf, 0, len);
		}
		fis.close();
		fos.close();
		System.out.println(aimFile+" is copy over");
		}
	}
}
2.4.3.2.复制目录

复制目录:
1.将源文件与目标文件关联
2.判断目标文件是否存在如果不存在则创建目标文件目录
3.遍历源文件
3.1.如果isFile(),则复制文件到目标文件
3.2.如果isFile()==false,则重新遍历
4.直到文件全部复制完成

public class FileCopy {
	public static void main(String[] args) throws IOException {
		String path1="C:\\Users\\Administrator\\Desktop\\IO";
		String path2="C:\\Users\\Administrator\\Desktop\\tu";
		File from =new File(path1);//源文件
		File to =new File(path2);//目标文件
		if(!to.exists()) {
			to.mkdir();
		}
		copy(from,to);
	}

	private static void copy(File from,File to) throws IOException {
		File [] file=from.listFiles();
		if(file==null) {
			return;
		}
		for (File file3 : file) {
			if(file3.isFile()) {
				copyFile(file3,to);
			}else {
				File newFolder=creatFolder(to,file3.getName());
				copy(file3,newFolder);
			}
		}
	}

	private static File creatFolder(File to, String name) {
		File folder=new File(to,name);
		if(!folder.exists()) {
			folder.mkdir();
		}
		return folder;
	}

	private static void copyFile(File file, File to) throws IOException {
		File aimFile=new File(to,file.getName());
		aimFile.createNewFile();
		FileInputStream fis=new FileInputStream(file);
		BufferedInputStream bis=new BufferedInputStream(fis);
		FileOutputStream fos=new FileOutputStream(aimFile);
		BufferedOutputStream bos=new BufferedOutputStream(fos);
		byte[]buf=new byte[1024];
		int len=0;
		while((len=bis.read(buf))!=-1) {
			bos.write(buf, 0, len);
		}
		bos.flush();
		bis.close();
		bos.close();
		System.out.println(aimFile+" is copy over");
	}
}

2.5.Reader字符输入流与writer 字符输出流

2.5.1.缓冲流:提高效率(在字节流的基础上)

BufferedInputStream bis=new BufferedInputStream(fis);字节输入缓冲流
BufferedOutputStream bos=new BufferInputStream(fos); 字节输出缓冲流
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

在字节流的基础上加入缓冲流:
private static void copyFile(File file, File to) throws IOException {
		File aimFile=new File(to,file.getName());
		aimFile.createNewFile();
		//输入缓冲
		FileInputStream fis=new FileInputStream(file);
		BufferedInputStream bis=new BufferedInputStream(fis);
		//输出缓冲
		FileOutputStream fos=new FileOutputStream(aimFile);
		BufferedOutputStream bos=new BufferedOutputStream(fos);
		byte[]buf=new byte[1024];
		int len=0;
		while((len=bis.read(buf))!=-1) {
			bos.write(buf, 0, len);
		}
		bos.flush();
		bis.close();
		bos.close();
		System.out.println(aimFile+" is copy over");
	}

2.5.2.转换流:将字节流转换成字符流 (进出内存都只能以字节形似存在)可以指定输入/输出的码表

在字节流的基础上进行。

InputStreamReader isr=new InputStreamReader(new FileInputStream(from));/(new FileInputStreamRead(from),"GBK")
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(to));/(new FileOutputStreamWrite(to),"UTF-8")

返回的是字符串char[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值