File类
一、File类概述:
1.File:它是文件和目录路径名的抽象表示
①文件和目录是可以通过File封装成对象的
②对应File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
二、File类的常用方法:
1.File(String pathname):通过将给定的路径名字字符串转换为抽象路径名来创建新的File实例
File f1 = new File("E:\\QLDownload\\java.txt");
System.out.println(f1);
2.File(String parent,String child):从父路径名字符串和子路径名字字符串创建的File实现
File f2 = new File("E:\\QLDownload","java.exe");
System.out.println(f2);
3.File(File parent,String child):从父抽象路径名和子路径名字符串创建的File实例
File f3 = new File("E:\\QLDownload");
File f4 = new File(f3,"java.ese");
System.out.println(f4);
4.public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
如果文件不存在,就创建文件,并返回true
如果文件存在,就不创建文件,并返回false
File f5 = new File("E:\\QLDownload\\java.txt");
System.out.println(f5.createNewFile());
5.public boolean mkdir():创建由此抽象路径名命名的目录
如果目录不存在,就创建目录,并返回true
如果目录存在,就不创建目录,并返回false
File f6 = new File("E:\\QLDownload\\javaSE");
System.out.println(f6.mkdir());
6.public boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
如果父目录不存在,就创建父目录,并返回true
如果父目录存在,就不创建父目录,并返回false
File f7 = new File("E:\\QLDownload\\javaWEB\\HTML");
System.out.println(f7.mkdirs());
7.public boolean isDirectory():测试此抽象路径名表示的File是否为目录
File f = new File("E://QLDownload");
System.out.println(f.isDirectory());
8.public boolean isFile():测试此抽象路径名表示的File是否为文件
File f1 = new File("E://QLDownload//java.txt");
System.out.println(f1.isFile());
9.public boolean exists():测试此抽象路径名表示的File是否存在
File f2 = new File("E://QLDownload");
System.out.println(f2.exists());
10.public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
File f3 = new File("QLDownload//java.txt");
System.out.println(f3.getAbsolutePath());
11. public String getPath():将此抽象路径名转换为路径名字符
File f3 = new File("QLDownload//java.txt");
System.out.println(f3.getPath());
12.public String getName():返回由此抽象路径名表示的文件或目录的名称
File f3 = new File("QLDownload//java.txt");
System.out.println(f3.getName());
13.public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
File f4 = new File("E://QLDownload");
String[] strArray = f4.list();
14.public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
File f4 = new File("E://QLDownload");
File[] fiArray = f4.listFiles();
15.public boolean delete():删除由此路径名表示的文件或目录
File f1 = new File("E:\\eclipse-workspace\\heima\\java.txt");
System.out.println(f1.delete());
三、绝对路径和相对路径的区别:
1.绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\\QLDownload\\java.txt
2.相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\\java.txt
四、删除目录时注意事项:
如果一个目录中内容(目录、文件),不能直接删除。应该先删除目录中的内容,最后才删除目录
递归
一、递归概述:
以编程的角度来看,递归指的是方法定义调用方法本身的现象
二、递归解决问题的思路:
1.把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
2.递归策略只需少量的程序就可描述出解题过程所需要的多少次重复计算
三、递归解决问题要找到两个内容:
1.递归出口:否则或出现内存溢出
2.递归规则:与原问题相似的模拟较小的问题
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
System.out.println(f(20));
public static int f(int n) {
if(n == 1 || n == 2 ) {
return 1 ;
}else {
return f(n - 1 ) + f(n -2);
}
}
IO流
一、IO流概述:
1.IO:输入/输出(Input/Output)
2.流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
3.IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制;文件上传;文件下载
二、IO流分类:
1.按照数据的流向
输入流:读数据
输出流:写数据2.按照数据类型来分
字节流
字节输入流;字节输出流
字符流
字符输入流;字符输出流3.一般来说,我们说IO流的分类是按照数据类型来分的
4.如果数据通过WIndow自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果你不知道该使用那种类型的流,就使用字节流
字节流写数据
一、字节流抽象基类:
1.InputStream:这个抽象类是表示字节输入流的所有类的超类
2.OutputStream:这个抽象类是表示字节输出流的所有类的超类
3.子类名特点:子类名称都是以其父类名作为子类名的后缀
二、FileOutputStream的概念:
1.FileOutputStream:文件输出流用于将数据写入File
2.FileOutputStream(String name):创建文件输出流以指定的名称写入文件
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\java.txt");
f.write(97);
f.write(57);
f.write(55);
f.close();
三、使用字节输出流写数据的步骤:
1.创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节流输出流对象指向文件)
2.调用字节输出流对象的写数据方法
3.释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
四、字节流常用方法:
1.void write(int b):将指定的字节写入此文件输出流,一次写一个字节数据
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\fos.txt");
f.write(97);
f.write(98);
f.write(99);
f.write(100);
f.write(101);
2.void write(byte[] b):将b.length字节从指定的字节数组写入此文件输出一次写一个字节数组数据
byte[] getBytes():返回字符串对应的字符数组
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\fos.txt");
byte[] b = "abcde".getBytes();
f.write(b);
3.void write(byte[] b,int off,int len):将len字节从指定的字节数组开始,从偏移两off开始写入此文件输出流,一次写一个字节数组的部分数据
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\fos.txt");
f.write(97);
f.write(98);
f.write(99);
f.write(100);
f.write(101);
f.write(b,1,3);
4.FileOutputStream(String name):创建文件输出流以指定的名称写入文件
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\fos.txt");
5.FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件
File f1 = new File("E:\\QLDownload\\fos.txt");
FileOutputStream f2 = new FileOutputStream(f1);
//上面两个结合就成为下面在一种方法
FileOutputStream f2 = new FileOutputStream(new File("E:\\QLDownload\\fos.txt"));
五、字节流写入数据的两个小问题:
1.字节流写数据如何实现换行呢?
①写完数据后,加换行符
windows:\r\n
linux:\n
mac:\r
2.字节流写数据然后实现追加写入呢?
①public FileOutputStream(String name,boolean append)
②创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
六、字节流写数据加异常处理:
1.finally:在异常处理时提供finally快来执行所有清除操作。比如说Io流中的释放资源
特点:别finally控制的语句一定会执行,除非JVM退出
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有清除操作;
}
FileOutputStream f = null;
try {
f = new FileOutputStream("E:\\QLDownload\\fos2.txt");
f.write("hello".getBytes());
}catch(IOException e) {
e.printStackTrace();
}finally {
if(f != null) {
try {
f.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
七、遍历字节流:
FileInputStream f = new FileInputStream("E:\\QLDownload\\fos.txt");
int a;
for(a = 0;(a = f.read()) != -1;a++) {
System.out.print((char)a);
}
f.close();
FilelnputStream
一、FilelnputStream概述:
1.FilelnputStream:从文件系统中的文件获取输入字节
2.FilelnputStream(String name):通过打开文件与实际文件的连接创建一个FilelnputStream,该文件由文件系统中的路径名name命名
二、使用字节输入流读取数据的步骤:
①创建字节输入流对象
②调用字节输入流对象的读取数据方法
③释放资源
三、字节缓冲流:
1.BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每一个字节导致底层系统的调用
2.BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\foe4.txt");
FileInputStream f = new FileInputStream("E:\\QLDownload\\fos4.txt");
二、构造方法:
1.字节缓冲输出流:BufferedOutputStream(OutputStream out)
2.字节缓冲输入流:BufferedInputStream(InputStream in)
FileOutputStream f = new FileOutputStream("E:\\QLDownload\\foe4.txt");
BufferedOutputStream b = new BufferedOutputStream(f);
FileInputStream f = new FileInputStream("E:\\QLDownload\\fos4.txt");
BufferedInputStream b = new BufferedInputStream(f);
三、为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
1.字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
四、为什么会出现字符流:
1.由于字节流操作中不是特别方便,所以java就提供字符流
字符流 = 字节流 + 编码表
五、用字节流复制文本文件时,文本文件也会有中午,但是没有问题,原因是最终底层操作会自动进行字节并接成中文,如何识别是中文的呢?
1.汉字在存储的时候,无论选择那种编码存储,第一个字节都是负数
六、字节流读文本文件数据:
一个汉字存储:
如果是GBK编码,占用两个字节
如果是UTF-8编码 ,占用三个字节
编码表
一、基础知识:
1.计算机存储的信息都是用二进制数表示的;我们在屏幕上看到的英文、汉字等字是二进制数转换之后的结果
2.按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。
这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会出现乱码现象
字符编码:就是一套自然语言的字符与二进制之间的对应规则(A,65)
二、字符集:
1.是一个系统支持的所有字符的集合,包括各个国家文字、标点符号、图形符号、数字等
2.计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。
常见字符集有ASCLL字符集、GBXXX字符集、Unicode字符集
三、ASCLL字符集:
2.ASCLL(AmericanStandard Code for Information Interchange,美国信息交换标准代码):是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)
3.基本的ASCLL字符集,使用7文表示一个字符,共128字符ASCLL的扩展字符集使用8为表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等
四、GBXXX字符集:
1.GB2312:简体中文码表。一个小于127的字符意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大概可以组合了包括7000多个简体汉字,此外数字符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCLL里本来就有数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”符号了
2.GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等
3.GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等。
五、Unicode字符集:
1.为表示任何语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。它最多使用4个字节的数字来表达每个字母、符号、或者文字。有三种编码方案,UTF-8UTF-16和UTF32。最为常用的UTF-8编码
2.UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(LETF)要求所有互联网协议都必须支持UTF-8编码。他使用一至四个字节为每个字符编码
编码规则:
128个US-ASCLL字符,只需要一个字节编码
拉丁文等字符,需要二个字节编码
大部分常用字(含中文),使用三个字节编码
其他极少使用的Unicode辅助字符,使用四字节编码
六、字符串中的编码解码问题:
1.编码:
①byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
②byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
String s = "中国";
byte[] b = s.getBytes();
byte[] b = s.getBytes("UTF-8");
2.解码:
①String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
②String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字符数组来构造新的String
String s = "中国";
byte[] b = s.getBytes();
byte[] b = s.getBytes("UTF-8");
String ss = new String(b);
String ss = new String(b,"UTF-8");
字符流
一、字符流中的编码解码问题:
1.字符流抽象基类
①Reader:字符输入流的抽象类
②Writer:字符输出流的抽象类
2.字符流中和编码问题相关的两个类:
①InputStreamReader:是从字节流到字符流的桥梁。它读取字节,并使用指定的编码将其解码为字符。它使用的字符集可以有名称指定,也可以被明确指定,或者可以接受平台的默认字符集
②OutputStreamWriter:是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节,它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos6.txt"),"GBK");
FileInputStream f1 = new FileInputStream("E:\\QLDownload\\fos6.txt");
InputStreamReader isr = new InputStreamReader(f1,"GBK");
二、字符流的常用方法:
1.void write(int c):写一个字符
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos2.txt"));
os.write(97);
2.void write(char[] cbuf):写入一个字符数组
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos2.txt"));
char[] a = {'h','e','l','l','o'};
os.write(a);
3.void write(char[] cbuf,int off,int len):写入字符数组的一部分
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos2.txt"));
char[] a = {'h','e','l','l','o'};
os.write(a,0,3);
4.void write(String str):写一个字符串
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos2.txt"));
String s = "wored";
os.write(s);
5.void write(String str,int off,int len):写一个字符串的一部分
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("E:\\QLDownload\\fos2.txt"));
String s = "wored";
os.write(s,0,2);
6. int read():一次读一个字符数据
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\QLDownload\\fos2.txt"));
int e = isr.read();
7.int read(char[] cbuf):一次读一个字符数组数据
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\QLDownload\\fos2.txt"));
char[] a = new char[1024];
int e;
while((e = isr.read(a)) != -1) {
System.out.print(new String(a,0,e));
}
字符缓冲流
1.BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
2.BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途
一、构造方法:
1.BufferedWriter(Writer out)
2.BufferedReader(Reader in)
BufferedReader br = new BufferedReader(new FileReader("E:\\QLDownload\\窗里窗外.txt"));
FileWriter fw = new FileWriter("E:\\QLDownload\\fos9.txt");
BufferedWriter bw =new BufferedWriter(fw);
二、字符缓冲流常用方法:
1.BufferedWriter:
①void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\QLDownload\\fos9.txt"));
for(int a = 0;a < 10; a++) {
bw.write("Hello" + a);
bw.write("\r\n");
bw.newLine();
bw.flush();//刷新
}
2.BufferedReader:
②public String readLine():读一行文字。结果包含行的内容字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
BufferedReader br = new BufferedReader(new FileReader("E:\\QLDownload\\fos9.txt"));
String s = br.readLine();
小结:字符流只能复制文本文件数据,有5种方式,一般采用字符缓冲流的特有功能
三、复制文件的异常处理:
try(定义流对象){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
自动释放资源
System类
一、System类中有两个静态的成员变量:
1.public static final InputStream in:标准输入流。通过该流对应于键盘输入或由主机环境或用户指定的另一个输入源
InputStream is = System.in;
2.public static final PrintStream out:标准输入流。通过该流对应于显示输出或有主机环境或用户指定的另一个输出目标
PrintStream ps = System.out;
打印流
一、打印流分类:
1.字节打印流:PrintStream
2.字符打印流:PrintWriter
二、打印流的特点:
只负责输出数据,不负责读取数据,有自己的特有方法
三、字节打印流的概述:
PrintStream(String fileName):使用指定的文件名创建新的打印流使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
四、字符打印流PrintWriter的构造方法:
1.PrintWriter(String fileName):使用指定的文件创建一个新的PrintWriter,而不需要自动执行刷新
BufferedReader br = new BufferedReader(new FileReader("E:\\QLDownload\\窗里窗外1.txt"));
2.PrintWriter(Writer out,boolean autoFlush):创建一个新的PrintWriter,out:字符输,autoFlush:一个布尔值,如果为真,则println,print或format方法将耍新输出缓冲区
PrintWriter pw = new PrintWriter(new FileWriter("E:\\QLDownload\\窗里窗外2.txt"),true);
对象序列化流
一、对象序列化概念:
1.对象序列化:
就是将对象保存到磁盘中,或者在网络中传输对象
2.这种机制就是使用一个字节序列表示一个对象,该字节序列包含:
对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件中之后,相当于文件中持久保存了一个对象的信息,反之,该字节序列还可以从文件中读取回来,重构对象,对他进行反序列化
3.要实现序列化和反序列化就要使用对象序列化流和反序列化流:
对象序列化流:ObjectOutputStream
对象反序列化流:ObjectInputStream
二、对象序列化流:ObjectOutputStream
1.将java对象的原数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
2.构造方法:
ObjectOutputStream(ObjectStream out):创建一个写入指定的OutputStream的ObjectOutputStream
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("E:\\QLDownload\\duix.txt"));
三、序列化对象的方法:
1.void WriteObject(Object obj):将指定的对象写入ObjectOutputStream
ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("E:\\QLDownload\\duix.txt"));
Sum s = new Sum("小二",18);
obj.writeObject(s);
1.NotSerializableException:抛出一个实例需要一个Serializable接口。序列化运行时或实例的类可能会抛出此异常
2.Serializable:类的序列实例化由实现java.io.Serializable接口的类启用。不实现此接口的类将不会使任何状态序列化和反序列化
四、对象反序列化流:ObjectInputStream
1. ObjectInputStream反序列化先使用ObjectOutputStream编写的原始数据和对象
二、构造方法:
ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectOutputStream
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\QLDownload\\duix.txt"));
三、反序列化对象的方法:
Object readObject():从ObjectOutputStream读取一个对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\QLDownload\\duix.txt"));
Object obj1 = ois.readObject();
Sum s = (Sum)obj1;