一.File
1.简介
在java中我们使用File这个类来对电脑上磁盘上的文件夹进行描述和操作。可以新建,删除,移动,重命名文件或者文件夹,也可以获取文件的属性,但是File不能访问文件里面的内容。
2.绝对路径
就是从磁盘的根目录开始查找,直到找到这个文件为止,不同的操作系统的目录表示方式也不同,在windows系统下为: C:/User/username/file.txt。在linux系统中为:\home\user\file.txt。
3.相对路径
相对与当前工作的目录或者一个已知位置的路径。描述的是文件或者目录与当前位置的相对关系。相对路径经常省略根目录部分,直接从当前目录开始描述路径。./表示当前工作目录。../表示返回上一层目录
例如:当前工作空间是 /home/user/michael/
需求1. 访问/home/user/michael/file1.txt
需求2. 访问/home/user/michael/doc/file1.txt
需求3. 访问/home/user/lucy/file1.txt
需求4. 访问/home/user/lucy/doc/file1.txt
则需求1为:./file1.txt
需求2: ./doc./file1.txt
需求3: ../lucy./file1.txt
需求4: ../lucy./doc./file1.txt
4.File的静态属性
因为在不同的操作系统中目录分隔符会不一样。而File的静态常量会获取程序所在的系统环境中的具体分隔符。
System.out.println(File.separator); 目录分隔符,用来分隔两个目录,返回一个 字符串
System.out.println(File.separatorChar); 目录分隔符,用来分隔两个目录,返回一个字符
System.out.println(File.pathSeparator);路径分隔符,用来分隔两个路径,返回一个字符串
System.out.println(File.pathSeparatorChar);路径分隔符,用来分隔两个路径,返回一个字符
5.常用构造器:
File(String pathname)里面传入引用数据类型的路径来创建File对象
File(File parent,String child)通过父路径名和传入引用数据类型子路径来创建File对象
File(String parent, String child)通过传入引用数据类型的父路径和子路径
file.exists()该方法可用于判断该文件是否存在
6.文件属性的方法
File f1 = new File("D:/code/HelloWorld.java"); System.out.println("文件名"+f1.getName()); System.out.println("绝对路径"+f1.getAbsolutePath()); System.out.println("父路径"+f1.getParent()); System.out.println("路径"+f1.getPath()); System.out.println("是不是一个文件:"+f1.isFile()); System.out.println("是否是一个文件夹"+f1.isDirectory()); System.out.println("该文件是不是一个隐藏文件"+f1.isHidden()); System.out.println("是否是一个可读文件"+f1.canRead()); //可写,一定是可读文件 System.out.println("是否是一个可写文件"+f1.canWrite()); //可执行一定是可读文件 System.out.println("是否是一个可执行的文件"+f1.canExecute()); System.out.println("最后一次修改时间"+f1.lastModified()); System.out.println("文件的大小"+f1.length());
注意:空文件夹的话,那么文件夹的大小为0,即file.length() 返回值为0。
文件中的单位为字节
- 比特(bit):是计算机中数据的最小单位,表示二进制数中的一个位,只有两种状态:0或1。
- 字节:由8个比特组成,是计算机中数据的基本单位,用于表示文本、图像、音频等数据。
- 1024等于2的十次方
- 1 byte = 8 bit:字节由8个比特组成。
- 1 KB = 1,024 byte:千字节(KiB)等于1024字节。
- 1 MB = 1,048,576 byte:兆字节(MiB)等于1,048,576字节。
- 1 GB = 1,073,741,824 byte:吉字节(GiB)等于1,073,741,824字节。
7.文件的查询
文件查询,检索的相关法 String[] list():返回指定文件夹里的子文件或者是子目录的名字 File[] listFiles(): 返回指定文件里的子文件或者是子目录的File类型
一般情况下如果想要获得一个文件里面所有的文件夹或者文件可以使用增强for循环来遍历获得想要的子文件或者子目录。
下面重写的该方法可以获取到以.java结尾的所有文件
重写accept方法,编写过滤逻辑,name指的就是文件夹里的每一个文件或文件夹,dir就是要操作的文件列表 FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".java"); } };
8.文件的创建和删除(调用的方法都有返回值,返回值都是boolean类型)
文件的创建:
->createNewFile() 创建一个文件
->madir() 创建文件夹,但是一次只能创建一个文件夹
->madirs() 创建文件夹,可以创建多个文件夹
例如:
File dir = new File("D:/dir");
//如果test1不存在就会创建一个test1的文件夹
if(!dir.exists()){
dir.madir(); //创建test1文件夹
}
File files = new File(dir,"test1.txt");
if(!files.exisist()){
//此时一定存在dir文件夹,如果files不存在就创建一个文件
files.createNewFile();
}
File dir2 = new File("D:/dir2/test/test2");
//判断存不存在,不存在就创建
if(!dir2.exsist()){
madirs();
}
文件的删除:
delete();
注意:delete()该方法只能删除文件和空文件夹,如果想要使用该方法删除一个文件夹需要使用递归算法。
例如:要删除文件夹A:文件夹A里面有文件夹B,文件夹B里面有文件C
puclic static void deleteFile(File file){
if(file.isFile()){
file.delete();
}else{
File[ ] files = file.listFile();
for(File file1:files){
deleteFile(file1);
}
}
}
二.IO流
1.概念
是计算机程序中用于处理输入和输出数据的机制,它允许程序从外部设备(如文件、网络等)读取数据或将数据写入外部设备。如果我们在编程的时候想要从硬盘上获取一个文件,或者想将程序里的内容写到磁盘上的文件,我们可以用到IO流。
输出流(Output Stream):将程序中的数据输出,写出数据
输入流(Input Stream):将外界的数据输入到程序中,用来读取数据
注意:IO流一旦被创建之后就会自动打开,我们需要调用close方法将IO流关闭
2.分类
按数据流向分类:输入流和输出流
按处理的数据单位分类:字节流和字符流
按照操作对象的不同分为:节点流和处理流。节点流直接与数据源或目标进行交互,如文件、网络连接等,例如FileInputStream和FileOutputStream。处理流则通过包装其他流来提供额外的功能,如缓冲、压缩、加密等,例如BufferedInputStream和BufferedOutputStream。
3.IO流的应用场景
IO流的应用场景非常广泛,涵盖了文件读写操作、网络通信、图像和音视频处理、数据加密与解密、串口通信以及其他应用场景。
4.IO流体系结构
5.字节流
InputStream是字节流输入流的顶级父类,是抽象类,定义了基本的读取方法,以下是InputStream定义的方法:
int read():从输入流中读取一个字节,返回-1说明读取到文件末尾。
int read(byte[] b):从输入流中读取若干个字节,把他们保存早缓冲区b中,返回的整数表示读取的字节数,如果遇到输入流的结尾,返回-1。
int read(byte[] b, int off , int len ):从输入流中读入len字节,从指定下标off开始存入,返回的整数表示实际存的字节数,如果遇到输入流的结尾,返回-1。
void close():关闭输入流
int available():返回可以从输入流中读取的字节数目
long skip(long n):从输入流中跳过n个数目字节
boolean markSupported():测试这个输入流是否支持mark和reset方法
void mark(int readLimit);标记此输入流当前的位置
void reset():将此流重新定位到上次在此输入流上调用mark方法时的位置
OutputStream是字节流输出流的顶级父类,也是抽象类,定义了基本的写法
如:
void write(int b):向输出流写入一个字节
void write(byte[] b ):将字节数组长度的字节从指定的字节数组写入此输入流
void write(byte[] b,int off,int len):从指定的字节数组写入len个字节,从off开始输出到此输入流
void close():关闭输入流
void flush():该方法强制把缓冲区内的数据写到输出流中
6.常用字节流
1)文件流
FileOutputStream:文件的字节输出流,以字节的单位写出数据到文件
->重写模式构造方法:
FileOutputStream(File file):创建一个向指定file对象表示的文件写出数据的文件输出流
FileOutputStream(String filename):创建一个向指定具体文件名的文件写出数据的文件输出流
->追加模式构造方法
FileOutputStream(File file ,boolean append):创建一个向指定file对象表示的文件写出数据的文件输出流
FileOutputStream(String filename,boolean append):创建一个向指定具体文件名的文件写出数据的文件输出流
以上两个构造器append为ture时,通过该流写出的数据就会追加在文件末尾
注意事项:若指定的文件已经包含内容,那么使用该流写出数据时,会将原有的内容全部清除
若指定的文件不存在,任何输出流都会自动创建该文件
FileInputStream;文件的字节输入流,以字节为单位从文件中读取数据
常用构造器:
FileInputStream(File file):创建一个从指定File对象表示的文件中读取数据的文件输入流
FileInputStream(String name):创建一个从指定路径名所指向的文件中读取数据的文件输入流
2):缓冲流
在向硬件设备做读写操作时,读写操作次数的增大会降低读写效率,因此,我们可以使用缓冲流来一次性读写若干数据来减少读写的次数,从而提高效率
BufferedOutputStream(缓冲输出流):该流维护着一个缓冲区,每当我们向该流写数据时,都会现先将数据存储在缓冲区,当缓冲区满之后,会将数据一次性全部写出。
缺点:缺乏即时性,但我们可以使用flush方法清空缓冲区,强制写出
常用构造器:
BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,将数据写入指定的底层输出流
BufferedOutputSrteam(OutputStream out,int size):创建一个新的缓冲输出流,以指定的缓冲区大小将数据写入指定的底层输出流
BufferedInputStream(InputStream in):以指定的节流点in作为参数,创建一个缓冲输入流
BufferedOutputStream(InputStream in,int size)以指定节点流in和缓冲区大小作为参数,创建一个缓冲输入流
3)数据流
DataOutputStream:
->该流是FileterOutputStream的子类,扩展了一些功能,提供了一些可以直接写出基本数据类型的方法
->构造方法DataOutputStream(OutputStream os)
DateInputStream:
->该流提供了一些可以直接读取基本数据类型的方法
->构造方法DataInputStream(InputStream is)
4)对象流
对象存储于内存中,有时候我们需要把对象保存到硬盘上。或者有时候将对象传输到另一个电脑上等等,我们需要将对象序列化,就是把对象转换成一个字节序列,这个过程就是序列化。如果我们又将一个字节序列转换成对象,这个过程就是反序列化。
实现方法:
ObjectOutputStream流的方法writeObject(Object o)实现对象实例化
ObjectInputStream流的方法readObject(Object o)实现对象的反序列化
常用构造器:
ObjectOutputStream(OutputStream os)
ObjectInputStream(InputStream is)
Serializable接口:
在进行对象序列化时,系统会默认给类提供一个序列版本号,反序列化时,如果类和对象的序列版本号不相同会出现异常,就是反序列化失败。所以我们应该主动提供一个序列化版本号,这样可以确保版本号相同。就是要进行序列化和反序列化的类需要实现Serializable接口。然后再在类中再提供一个自己定义的序列化版本号例如:、
public static final long serialVersionUID = 1L
serialVersionUID:为一个固定值
transient关键字:使用这个关键字修饰的属性在序列化时该属性的值会被忽略
7.字符流
1)字符流简介:
字符流以字符(char)为单位读写数据,一次处理一个unicode。字符流的底层仍然是基本的字节流。
Reader是字符流输入流的父类,是抽象类
Writer是字符流的输入流的父类,是抽象类
2)Reader的常用方法:
int read():读一个字符
int read(char[] cbuf)将字符读入数组
abstract int read(char[] cbuf,int off,int len)将字符读入数组的一部分
3)Writer的常用方法:
void write(char[] cbuf)写入一个字符数组
abstract void write(char[] cbuf int off,int len)写入字符数组的一部分
void writer(int c)写入一个字符
void write(String str)写入一个字符串
void write(String str,int off,int len)写一个字符串的一部分