day19
绝对路径 : 很明确的,没有歧义的路径
在windows操作系统中, 绝对路径就表示带有盘符的路径
盘符 : C : D: E:
D:\0826Java系统班-----> 绝对路径
相对路径 : 相对某一个路径而言,没有具体的路径形式
举例 : a/a.txt----->相对路径
D:\b\a\a.txt
D:\新建文件夹\a\a.txt
在eclipse工程中,相对路径,相对于当前eclipse的项目根目录来说
1.2 File类的构造方法
代码
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类的创建方法
代码
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类的删除方法
代码
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类的重命名功能
代码
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类的判断功能
File类的使用场景:
需求: 客户给你的系统提供一些文件,需要将文件的内容读取到程序中,处理内容,存储数据库
解决思路 :
代码
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类的获取功能
代码
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流的主要功能就是进行设备与设备之间的数据传输
2.2 IO流的分类
IO流分类 :
2.3 IO流使用的规则
3.字节流
字节流就表示能直接对字节进行操作的IO流
字节流根据流向,分成两个方向
字节输入流 : InputStream
字节输出流 : OutputStream
3.1 InputStream字节输入流
InputStream 来自于java.io包,是所有字节输入流的父类, 抽象类, 不能实例化对象,需要找一个子类, FileInputStream
字节输入流主要关注的方法:
read() : 读,每次从文件中读取一个字节
read(byte[] arr) : 读,每次从文件中读取一个arr数组个字节
3.2 FileInputStream
3.2.1 FileInputStream构造方法
FileInputStream(File f) : 将File文件对象封装到字节的输入流中,可以通过输入流读取File所表示的文件中的内容
注意 : 所有的IO流进行文件读取的时候,只能读取文件,而不能读取文件夹中内容
FileInputStream(String path) : 将一个String类型的路径字符串,封装在输入流中,可以通过输入流读取String所表示的路径文件内容
关闭流资源 : 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读取文件内容
字节数组读取文件原理
代码
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的子类,功能就是向文件中写入内容
FileOutputStream(File f) : 将File文件对象封装到字节输出流中,可以使用输出流向文件中写入内容
FileOutputStream(String path) : 将String类型文件路径封装到输出流中,可以使用输出流向文件中写入内容
说明 : 1,2两个构造,向文件中写入内容,覆盖(原文件内容被新内容覆盖)
FileOutputStream(File f , boolean append) : append参数如果为true,那么就表示向File所表示的文件中追加写入内容
FileOutputStream(String path , boolean append) : append参数如果为true,那么就表示向String所表示的文件中追加写入内容
3.3.2FileOutputStream写文件内容
代码
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文件复制
将一个文件中的内容复制到另外一个文件中
代码
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();
}
}