Java基础Day19

day19

  1. File类
    1.1 File类的概述
    File类 : 来自java.io包,表示一个文件或文件目录路径名表示形式
    D:\0826Java系统班\day19\笔记----->文件夹路径
    路径 : 表示一个文件或文件夹位置的字符串

绝对路径 : 很明确的,没有歧义的路径
在windows操作系统中, 绝对路径就表示带有盘符的路径
盘符 : C : D: E:
D:\0826Java系统班-----> 绝对路径
相对路径 : 相对某一个路径而言,没有具体的路径形式
举例 : a/a.txt----->相对路径
D:\b\a\a.txt
D:\新建文件夹\a\a.txt

在eclipse工程中,相对路径,相对于当前eclipse的项目根目录来说

1.2 File类的构造方法

  1. File(String pathname) : 表示将String类型的路径,转换成File类对象
  2. File(String parent,String child) : 表示将parent+child两个字符串拼接在一起,转换成一个File对象
  3. File(File parent,String child) : 表示将File类型的文件路径与String类型路径进行拼接,拼接的结果转换成File文件对象
    File f = new File(“D:\a”);
    File f1 = new File(f,”a.txt”);

代码
package com.zgjy.fileDmeo;
import java.io.File;
public class FileCreate {
public static void main(String[] args) {
// 1. File(Strint pathname)
File f = new File(“D:\0826Java系统班\day19\笔记”);
System.out.println(f);// D:\0826Java系统班\day19\笔记
// 2.File(String parent,String child) : 表示将parent+child两个字符串拼接在一起,转换成一个File对象
File f1 = new File(“D:”, “a.txt”);
System.out.println(f1);//D:\a.txt
// 3.File(File parent,String child) : 表示将File类型的文件路径与String类型路径进行拼接,拼接的结果转换成File文件对象
File f2 = new File(“D:\a”);
File f3 = new File(f2,“a.txt”);
System.out.println(f3);//D:\a\a.txt
}
}

1.3 File类的创建方法

  1. createNewFile() : 当File类表示的文件不存在时,创建一个空文件,返回值类型boolean类型
    注意 : 如果文件的所在路径不存在,不能新建文件成功
  2. mkdir() : 创建文件夹路径, 表示创建一级(一层)文件夹,返回值类型boolean类型
  3. mkdirs() : 创建一级或者多级文件夹路径,返回值类型boolean类型

代码
package com.zgjy.fileDmeo;
import java.io.File;
import java.io.IOException;
public class FileAdd {

public static void main(String[] args) throws IOException {
	// 1. createNewFile():当File类多表示的文件不存在时,创建一个空文件
	File f = new File("D:\\a.txt");
	// 有可能需要创建的文件的路径不存在,就会创建失败,抛出异常
	boolean boo = f.createNewFile();
	System.out.println(boo);
	
	/*File f1 = new File("D:\\abc\\abc.txt");
	// 需要创建的文件的路径D:\\abc不存在,创建失败,抛出异常
	boolean boo1 = f1.createNewFile();
	System.out.println(boo1);*/
	
	// 2. mkdir(): 创建文件夹路径, 表示创建一级(一层)文件夹
	// D:\\abc : 一层文件夹
	File f2 = new File("D:\\abc");
	boolean boo2 = f2.mkdir();
	System.out.println(boo2);
	
	// 多级(多层)文件夹,无法使用mkdir()进行创建
	File f3 = new File("D:\\a\\bc\\e");
	boolean boo3 = f3.mkdir();
	System.out.println(boo3);
	
	// 3.mkdirs() : 创建一级或者多级文件夹路径
	File f4 = new File("D:\\a\\bc\\e");
	boolean boo4 = f4.mkdirs();
	System.out.println(boo4);
}

}

1.4 File类的删除方法

  1. delete() : 删除File文件表示的文件或者是文件夹,返回值类型boolean类型,删除成功返回true,删除失败返回false
    注意 : 1. 如果删除的是文件夹,只能删除空文件夹 2. 删除直接删除掉,不走回收站

代码
package com.zgjy.fileDmeo;
import java.io.File;
public class FileDelete {

public static void main(String[] args) {
	// 1. delete() : 删除文件
	File f = new File("D:\\a.txt");
	boolean boo = f.delete();
	System.out.println(boo);// true
	
	// 2. 删除空文件夹
	File f1 = new File("D:\\abc");
	boolean boo1 = f1.delete();
	System.out.println(boo1);// true
	
	//3. 删除非空文件夹
	File f2 = new File("D:\\a");
	boolean boo2 = f2.delete();
	System.out.println(boo2);// false
}

}

1.5 File类的重命名功能

  1. renameTo(File path) : 调用方法的File类对象需要被重命名的. 重命名为参数的文件路径和名字
    注意 :
  1. 如果参数path的路径与方法调用的File类路径保持一致,就只是该名
  2. 如果参数path的路径与方法调用的File类路径不一致,先剪切File文件到指定的path路径下,然后重命名

代码
package com.zgjy.fileDmeo;
import java.io.File;
import java.io.IOException;
public class FileRename {
public static void main(String[] args) throws IOException {
// 1. 创建一个hello.txt文件
/*File f = new File(“D:\a\bc\hello.txt”);
System.out.println(f.createNewFile());// true

	// 2. 将hello.txt文件进行重命名
	// 1) hello.txt文件路径不变,只是名字改变
	// 创建一个修改后的File文件路径
	File ff = new File("D:\\a\\bc\\world.txt");
	// 将hello.txt文件的名字修改为world.txt
	boolean boo = f.renameTo(ff);
	System.out.println(boo);// true
	
	ff.renameTo(new File("D:\\a\\bc\\123.txt"));*/
	
	//3. 源File文件路径与path文件路径不一致,先剪切再重命名
	File f = new File("D:\\a\\bc\\123.txt");
	System.out.println(f.renameTo(new File("D:\\new.txt")));
}

}

1.6 File类的判断功能

  1. exists() :判断File类所表示的文件或者是文件夹路径是否真实存在,存在返回true,不存在返回false,返回值类型boolean
  2. isFile() : 判断File类所表示的路径是否是一个文件
    3.isDirectory() : 判断File类所表示的路径是否是一个文件夹

File类的使用场景:
需求: 客户给你的系统提供一些文件,需要将文件的内容读取到程序中,处理内容,存储数据库

解决思路 :

  1. 判断文件是否存在,判断是否是一个文件
  2. 如果文件不存在,某些情况下,可能会需要新建文件出来

代码
package com.zgjy.fileDmeo;
import java.io.File;
public class FilePanDuan {
public static void main(String[] args) {
//1. 创建一个File文件对象
File f = new File(“D:\a\bc”);
System.out.println(f.exists());// true

	File f1 = new File("D:\\a\\bc\\12345.txt");
    System.out.println(f1.exists());// false
    
    // 2. 判断文件
    boolean boo1 = f.isFile();
    // 3.判断文件夹
    boolean boo2 = f.isDirectory();
    System.out.println(boo1);//false
    System.out.println(boo2);//true  
}

}

1.7 File类的获取功能

  1. getAbsolutePath() : 获取File对象所表示的绝对路径,返回值类型String类型
  2. getPath() : 将File文件所表示的路径,转换成字符串的形式
    3.getName() : 获取File文件所表示路径的最后一部分的文件名字或者是文件夹名字
    4.length() : 获取File表示的文件的内容大小,字节大小进行返回,返回值类型long类型
    说明 : length方法只能求取文件的内容大小,不能获得文件夹的大小
  3. list() : 将File所表示的文件路径下的所有的文件和文件夹获取到,将获取到的结果装在一个String[]
  4. listFiles() : 将File所表示的文件路径下的所有的文件和文件夹获取到,将获取到的结果装在一个File[]

代码
package com.zgjy.fileDmeo;
import java.io.File;
import java.util.Arrays;
public class FileGet {
public static void main(String[] args) {
// 1. 创建一个File路径对象
File f = new File(“D:\0826Java系统班\day19\笔记”);
// 1. getAbsolutePath() : 获取File对象所表示的绝对路径,返回值类型String类型
String path = f.getAbsolutePath();
System.out.println(path);
// 2. getPath() : 将File文件所表示的路径,转换成字符串的形式
String path2 =f.getPath();
System.out.println(path2);
// 3.getName() : 获取File文件所表示路径的最后一部分的文件名字或者是文件夹名字
System.out.println(f.getName());//笔记

	File f1 = new File("a\\cc.txt");
	String path1 = f1.getAbsolutePath();
	//D:\eclipse-workspace\day19\a\cc.txt
	System.out.println(path1);
	String path3 =f1.getPath();
	//a\cc.txt
	System.out.println(path3);
	//System.out.println(f1.exists());//false
	System.out.println(f1.getName());//cc.txt
	
// 4. length():获取File表示的文件的内容大小,字节大小进行返回,返回值类型long类型
	File f4 = new File("D:\\new.txt");
	long count = f4.length();
	System.out.println(count);
	
	// 5.list():将File所表示的文件路径下的所有的文件和文件夹获取到,将获取到的结果装在一个String[]
	File f5 = new File("D:\\JRE");
	String[] ss = f5.list();
	System.out.println("---"+Arrays.toString(ss));
	
	// 6.listFiles():将File所表示的文件路径下的所有的文件和文件夹获取到,将获取到的结果装在一个File[] 
	File[] ff = f5.listFiles();
	System.out.println(Arrays.toString(ff));	
}

}

2.IO流的概述
2.1 IO流的流向
IO : input输入, output输出,输入或者输出就叫做IO流的流向
IO流的主要功能就是进行设备与设备之间的数据传输
Java基础Day19_第1张图片
2.2 IO流的分类
IO流分类 :

  1. 功能上进行分类:
    字节流: 字节输入流 InputStream 字节的输出流OutputStream
    字符流: 字符的输入流 Reader 字符的输出流 Writer
  2. 流向上进行分类:
    输入流 : 将其他设备的数据读入到内存中
    输出流 : 将内存中的数据写入到其他设备中

2.3 IO流使用的规则

  1. 使用IO流的相关的类的内容时,先导包,java.io包
  2. 使用IO的过程中,需要抛出异常
    举例 : 如果有一个外接设备,U盘,从U盘中的a.txt文件中读取内容到程序中,正在读取的过程中,U盘被撤掉了,不能再进行正常的文件读取了
  3. IO流使用完毕,一定要记得关闭IO流的资源(必须要做的事情)

3.字节流
字节流就表示能直接对字节进行操作的IO流
字节流根据流向,分成两个方向
字节输入流 : InputStream
字节输出流 : OutputStream

3.1 InputStream字节输入流
InputStream 来自于java.io包,是所有字节输入流的父类, 抽象类, 不能实例化对象,需要找一个子类, FileInputStream

字节输入流主要关注的方法:
read() : 读,每次从文件中读取一个字节
read(byte[] arr) : 读,每次从文件中读取一个arr数组个字节

3.2 FileInputStream

  1. FileInputStream 类,是InputStream的子类,来自于java.io包
  2. FileInputStream 主要是针对于系统磁盘上的文件内容的读取,因为计算机中文件的最小存储单元为字节,因此通过字节的方法来进行文件的读取,可以读取任意文件类型,包括纯文本,图片,音频,视频,压缩包…

3.2.1 FileInputStream构造方法

  1. FileInputStream(File f) : 将File文件对象封装到字节的输入流中,可以通过输入流读取File所表示的文件中的内容
    注意 : 所有的IO流进行文件读取的时候,只能读取文件,而不能读取文件夹中内容

  2. FileInputStream(String path) : 将一个String类型的路径字符串,封装在输入流中,可以通过输入流读取String所表示的路径文件内容

  3. 关闭流资源 : close();

代码
package com.zgjy.stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 1. 创建一个FileInputStream对象,需要抛出FileNotFoundException
// 文件找不到异常
FileInputStream fis = new FileInputStream(new File(“D:\abc.txt”));

	// 2.FileInputStream(String path) : 将一个String类型的路径字符串,封装在输入流中,
	// 可以通过输入流读取String所表示的路径文件内容
	FileInputStream fis1 = new FileInputStream("D:\\abc.txt");
	// 关闭流资源
	fis.close();
}

}

3.2.2 FileInputStream读取文件内容

  1. read() :读,每次从文件中读取一个字节,返回值类型int类型,是所读取到的字符对应的int类型的整数结果,字符与int类型结果的对应关系,GBK中文编码表中对应,GBK编码表兼容ASCII码表
    当文件中的内容读取完毕,返回-1的结果
    2.read(byte[] arr) : 读,每次从文件中读取一个arr数组长度的字节数,将读取到的字节放置到arr数组中,通过查看arr数组中的内容,就相当于查看文件内容
    返回值类型int类型, 返回值表示这一次读取到了几个字节放入到数组中

字节数组读取文件原理

Java基础Day19_第2张图片
代码
package com.zgjy.stream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
public class FileInputStreamDemo {

public static void main(String[] args) throws IOException {
	// 1. 创建一个FileInputStream对象,需要抛出FileNotFoundException
	// 文件找不到异常
	//FileInputStream fis = new FileInputStream(new File("D:\\abc.txt"));

	// 2.FileInputStream(String path) : 将一个String类型的路径字符串,封装在输入流中,
	// 可以通过输入流读取String所表示的路径文件内容
	FileInputStream fis = new FileInputStream("D:\\abc.txt");
	//readTxt(fis);
	readTxt2(fis);
}

// 1. 每次读取一个字节,将文件内容读取出来
public static void readTxt(FileInputStream fis) throws IOException {
	/*int i = fis.read();
	System.out.println(i);// 49
	System.out.println((char)i);// 1
	int i1 = fis.read();
	System.out.println(i1);//50
	int i2 = fis.read();
	System.out.println(i2);//51
	int i3 = fis.read();
	System.out.println(i3);//97
	int i4 = fis.read();
	System.out.println(i4);//98
	int i5 = fis.read();
	System.out.println(i5);//99
	// 文件已经没有内容,仍然在读
	int i6 = fis.read();
	System.out.println(i6);// -1
	
	int i7 = fis.read();
	System.out.println(i7);// -1
  */		
	// 优化,将文件中的内容通过循环,都读取出来
	// 什么时候文件读完 : read方法读到-1
	int len ;
	while((len = fis.read())!= -1) {
		System.out.println((char)len);
	}
	// 关闭流资源
	fis.close();
}

// 2. 通过字节数组将文件内容读取出来
public static void readTxt2(FileInputStream fis) throws IOException {
	// 1. 创建一个字节数组
	byte[] b = new byte[4];
	/*int count = fis.read(b);
	System.out.println(count);//4
	System.out.println(Arrays.toString(b));
	
	int count1 = fis.read(b);
	System.out.println(count1);//2
	System.out.println(Arrays.toString(b));
	
	int count2 = fis.read(b);
	System.out.println(count2);//-1
	System.out.println(Arrays.toString(b));*/
	
	// 优化数组读取文件,通过循环的方式进行文件读取
	// 数组读取到的结果返回-1的时候,证明文件读取结束
	int len ;// 表示每次读取到的字节个数
	while((len = fis.read(b)) != -1) {
		// String类的构造方法,能将一个字节数组转换成一个字符串
		// String类中构造方法,将一个字节数组的一部分转换成字符串
		//String(byte[] bytes, int offset, int length) 
		System.out.println(new String(b,0,len));
	}
	// 关闭流资源
	fis.close();	
}

}

3.3OutputStream字节输出流
OutputStream : 是所有的字节输出流的父类,来自于java.io,是个抽象类,不能实例化对象,需要一个子类,FileOutputStream

write(int c) : 每次向文件中写入一个字节
write(byte[] b) : 每次向文件中写入一个字节数组
write(byte[] b,int index, int length) : 每次向文件中写入数组的一部分,从index索引位置开始写,写length长度个字节(一般适用于文件复制)

3.3.1FileOutputStream的构造方法
FileOutputStream 类,OutputStream的子类,功能就是向文件中写入内容

  1. FileOutputStream(File f) : 将File文件对象封装到字节输出流中,可以使用输出流向文件中写入内容

  2. FileOutputStream(String path) : 将String类型文件路径封装到输出流中,可以使用输出流向文件中写入内容
    说明 : 1,2两个构造,向文件中写入内容,覆盖(原文件内容被新内容覆盖)

  3. FileOutputStream(File f , boolean append) : append参数如果为true,那么就表示向File所表示的文件中追加写入内容

  4. FileOutputStream(String path , boolean append) : append参数如果为true,那么就表示向String所表示的文件中追加写入内容

3.3.2FileOutputStream写文件内容

  1. write(int c) : 每次向文件中写入一个字节
  2. write(byte[] b) : 每次向文件中写入一个字节数组
  3. write(byte[] b,int index, int length) : 每次向文件中写入数组的一部分,从index索引位置开始写,写length长度个字节(一般适用于文件复制)
    注意 : write方法都没有返回值,返回值类型void

代码
package com.zgjy.stream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOError;
import java.io.IOException;
public class FileOutputStreamDemo {

public static void main(String[] args) throws IOException{
	// 1. FileOutputStream(File f) : 将File文件对象封装到字节输出流中,可以使用输出流向文件中写入内容
	//FileOutputStream fos = new FileOutputStream(new File("D:\\abc.txt"));
	
	// 2. 2.FileOutputStream(String path) :  将String类型文件路径封装到输出流中,可以使用输出流向文件中写入内容
	FileOutputStream fos = new FileOutputStream("D:\\abc.txt");
	// 3. 向abc.txt文件中写入内容
	// 1) write(int c) : 每次向文件中写入一个字节
	fos.write(97);// a
	fos.write(98);// b
	
	// 2) write(byte[] b) : 每次向文件中写入一个字节数组
	// 将数组b中的内容写入到文件中
	byte[] b = {99,100,101,102};// cdef
	fos.write(b);
	
	// 3) write(byte[] b,int index, int length) : 每次向文件中写入数组的一部分,
	// 从index索引位置开始写,写length长度个字节
	fos.write(b, 1, 2);//de
	//abcdefde
	
	// getBytes : 将String类型的额字符串转换成字节数组
	fos.write("我爱中国".getBytes());

	// 关闭流资源
	fos.close();
}

// 向文件中追加写入内容
public static void write() throws IOException{
	// 向abc.txt中追加写入内容
	FileOutputStream fos = new FileOutputStream("D:\\abc.txt", true);
	fos.write("我是续写的内容".getBytes());
	
	fos.close();	
}

}

3.4IO流需要关闭资源的原因
实际上输入和输出流没有在进行文件读写,流很懒
创建一个流资源,向文件中写入内容----> 流找JVM,让JVM向文件中写内容---->JVM找操作系统向文件中写内容
当使用文件结束,通过close方法,通知系统不再使用文件了,操作系统会将文件移出内存,操作结束,否则文件在内存中一直存在运行

3.5文件复制
将一个文件中的内容复制到另外一个文件中
Java基础Day19_第3张图片
代码
package com.zgjy.stream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
// 图片复制的案例
public static void main(String[] args) throws IOException{
copy2();
}

public static void copy1() throws IOException{
	//1. 先确定从哪里读图片的数据:D:\0826Java系统班\day19\图解\IO流向.png
    FileInputStream fis = new FileInputStream("D:\\0826Java系统班\\day19\\图解\\IO流向.png");
	//2.在确定将图片复制到哪里,写入
    FileOutputStream fos = new FileOutputStream("D:\\copy.png");
    //3. 复制过程就是边读边写
    int len;
    // 读取图片中的内容
    while((len = fis.read()) != -1) {
    	//将读到的内容写入到目标图片中
    	fos.write(len);
    }
    //4. 关闭流资源
    fos.close();
    fis.close();
}

// 使用字节数组进行文件复制
public static void copy2() throws IOException{
	//1. 先确定从哪里读图片的数据:D:\0826Java系统班\day19\图解\IO流向.png

FileInputStream fis = new FileInputStream(“D:\0826Java系统班\day19\图解\IO流向.png”);
//2.在确定将图片复制到哪里,写入
FileOutputStream fos = new FileOutputStream(“D:\流.png”);
// 3. 使用数组进行文件复制
// 数组进行流的读写时,通常开辟的数组空间大小
// 1024 10244 10248
byte[] b = new byte[1024];
int len ;// 每次读取到的字符个数,读到-1时,证明文件读取完毕
while((len = fis.read(b)) != -1) {
// 向liu.png中写入数组内容
fos.write(b,0,len);
}
fos.close();
fis.close();
}
}

你可能感兴趣的:(java)