什么是文件?
一、File概念
java.io.File类是文件和目录路劲名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
1.实例化一个File对象
File file=new File();
2.构造方法
⚫ public File(String pathname) :通过将给定的路径名字符串转换为抽
象路径名来创建新的 File 实例。
⚫ public File(String parent, String child) :从父路径名字符串和子
路径名字符串创建新的 File 实例。
⚫ public File(File parent, String child) :从父抽象路径名和子路径
名字符串创建新的 File 实例。
(ps:无论该路径下是否存在文件或目录,都不影响File对象的创建)
3.常用方法
⚫ public boolean exists() :此 File 表示的文件或目录是否实际存在。
⚫ public boolean isDirectory() :此 File 表示的是否为目录。
⚫ public boolean isFile() :此 File 表示的是否为文件。
⚫ public boolean createNewFile() :当且仅当具有该名称的文件尚不存
在时,创建一个新的空文件。
⚫ public boolean delete() :删除由此 File 表示的文件或目录。
⚫ public boolean mkdir() :创建由此 File 表示的目录。
⚫ public boolean mkdirs() :创建由此 File 表示的目录,包括任何必需
但不存在的父目录。
绝对路径:从盘符开始的路径,这是一个完整的路径。
相对路径:相对于项目目录的路径。
delect方法,如果此File表示目录,则必须目录为空才能删除。
⚫ public String[] list() :返回一个 String 数组,表示该 File 目录中
的所有子文件或目录。
⚫ public File[] listFiles() :返回一个 File 数组,表示该 File 目录
中的所有的子文件或目录。
⚫ public String getAbsolutePath() :返回此 File 的绝对路径名字符串。
⚫ public String getPath() :将此 File 转换为路径名字符串。
⚫ public String getName() :返回由此 File 表示的文件或目录的名称。
⚫ public long length() :返回由此 File 表示的文件的长度。
二、FileFilter
java.io.FileFilter是一个接口,是File的过滤器。该接口的对象可以传递给File类的listFile作为参数,接口中只有一个方法。
什么是IO流?
一、IO流概述
Java中I/O操作主要是指使用了java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做写出数据。
根据数据的流向分为:输入流和输出流,
输入流:把数据从其他设备上读取到内存中的流。
输出流:将内存中的数据写到其他设备上的流
根据数据类型分为:字节流和字符流
字节流:以字节为单位,读写数据的流,
字符流:以字符为单位,读写数据的流。
二、字节流
字节为计算机文件基本存储单位,所以字节流可以传输任意文件数据。在操作流的时候,无论使用什么样的流对象,底层传输的始终为二进制数据。
OutputStream
java.io.outputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。
⚫ public void close() :关闭此输出流并释放与此流相关联的任何系统
资源。
⚫ public void flush() :刷新此输出流并强制任何缓冲的输出字节被写
出。
⚫ public void write(byte[] b) :将 b.length 字节从指定的字节数组
写入此输出流。
⚫ public void write(byte[] b, int off, int len) :从指定的字节数
组写入 len 字节,从偏移量 off 开始输出到此输出流。
⚫ public abstract void write(int b) :将指定的字节输出流。
InputStream
java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取
字节信息到内存中。它定义了字节输入流的基本共性功能方法。
⚫ public void close() :关闭此输入流并释放与此流相关联的任何系统
资源。
⚫ public abstract int read() : 从输入流读取数据的下一个字节。
⚫ public int read(byte[] b) : 从输入流中读取一些字节数,并将它们
存储到字节数组 b 中 。
FileOutputStream
java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。
构造方法
⚫ public FileOutputStream(File file) :创建文件输出流以写入由指定
的 File 对象表示的文件。
⚫ public FileOutputStream(String name) : 创建文件输出流以指定的
名称写入文件。
当创建一个流对象时,必须传入一个文件路径。如果没有这个文件,会创建该文件,如果有这个文件,会清空这个文件的数据。
public static void main(String [] args){
FileOutputStream fos=new FileOutputStream("file.txt");
try{
fos.wirte(97);
fos.wirte(98);
fos.wirte(99);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fos.close();
}catch{
e.printStackTrace();
}
}
}
通过字节数组写入
public static void main(String [] args){
FileOutputStream fos=new FileOutputStream("file.txt");
try{
byte[] b="hello world".getBytes();//包装类
fos.write(b);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fos.close();
}catch{
e.printStackTrace();
}
}
}
换行符
⚫ 回车符\r 和换行符\n :
回车符:回到一行的开头(return)。
换行符:下一行(newline)。
⚫ 系统中的换行:
Windows 系统里,每行结尾是 回车+换行 ,即\r\n ;
Unix 系统里,每行结尾只有 换行 ,即\n ;
Mac 系统里,每行结尾是 回车 ,即\r 。从 Mac OS X 开始与 Linux 统一。
FileInputStream
java.io.FileInputStream 类是文件输入流,从文件中读取字节。
⚫ FileInputStream(File file) : 通过打开与实际文件的连接来创建一
个 FileInputStream ,该文件由文件系统中的 File 对象 file 命名。
⚫ FileInputStream(String name) : 通过打开与实际文件的连接来创建
一个 FileInputStream ,该文件由文件系统中的路径名 name 命名。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException
读取字节:read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1。
public static void main(String [] args){
FiliInputStream fis=new FileOutputStream("file.txt");
try{
int b;
while((b=fis.read())!=-1){
System.out.print((char)b);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fis.close();
}catch{
e.printStackTrace();
}
}
}
使用字节数组读取:read(byte[] b) ,每次读取 b 的长度个字节到数组中,
返回读取到的有效字节个数,读取到末尾时,返回-1。
public static void main(String [] args){
FiliInputStream fis=new FileOutputStream("file.txt");
try{
int len;
byte [] b=new byte[1024];
while((len=fis.read())!=-1){
System.out.print((new String(b));
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fis.close();
}catch{
e.printStackTrace();
}
}
}
什么是Java异常?
一、概念
异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致jvm非正常停止。
异常的根类是 java.lang.Throwable,其下有两个子类:java.lang.Error与java.lang.Exception,平常所说的异常指java.lang.Exception
Throwable体系:
Error:严重错误Error,无法通过处理的错误,只能事先避免。
Exception:表示异常,异常产生后程序员可以通过代码的方法纠正,使程序继续运行,是必须要处理的。
抛出异常throw
创建一个异常对象。封装一些提示信息(信息可以自己编写)。
需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处理呢?通过关键字throw就可以完成,throw异常对象。
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者,并结束当前方法的执行。
格式:
throw new 异常类名(参数);
异常处理值声明异常throws
声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者处理。关键字throws运用于方法声明之上,用于表示当前方法处理异常,而是提醒该方法的调用者来处理异常。
注意:
异常处理方式,要求多个catch的异常不能相同,并且若catch中的多个异常之间有子父类异常关系,那么子类异常要求在上面的catch处理,父类异常在下面catch处理。
运行时异常被抛出可以不处理,即不捕获也不声明抛出。
如果finally有return语句,永远返回finally中的结果,避免该情况。
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常,或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
常用类
一、Object
1.toString()方法
打印的是地址值
2. equals(Object obj)方法
默认比较的是对象的内存地址值。
public boolean equals(Object obj) {
return (this == obj);
}
3.hashCode 方法
hashCode() 返回该对象的哈希码值:采用操作系统底层实现的哈希算法,
这个数值称作为散列值,同一个对象的哈希码值是唯一的。
可以直接根据 hashcode 值判断两个对象是否相等吗?
肯定是不可以的,因为不同的对象可能会生成相同的 hashcode 值。虽然不能根据 hashcode 值判断两个对象是否相等,但是可以直接根据 hashcode 值判断两个对象不等,如果两个对象的 hashcode 值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须equals 方法。
⚫ 对于两个对象,如果调用 equals 方法得到的结果为 true,则两个对象
的 hashcode 值必定相等;
⚫ 如果 equals 方法得到的结果为 false,则两个对象的 hashcode 值不一
定不同;
⚫ 如果两个对象的 hashcode 值不等,则 equals 方法得到的结果必定为
false;
⚫ 如果两个对象的 hashcode 值相等,则 equals 方法得到的结果未知。
4.finalize()方法
asdasd
5. clone()
浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该对象,如果字段类型是值类型(基本类型)的,那么对该字段进行复制;如果字段是引用类型的,则只复制该字段的引用而不复制引用指向的对象。此时新对象里面的引用类型字段相当于是原始对象里面引用类型字段的一个副本,原始对象与新对象里面的引用字段指向的是同一个对象。
深拷贝:即将引用类型的属性内容也拷贝一份新的。实现深拷贝的方式:给需要拷贝的引用类型也实现 Cloneable 接口并覆写 clone 方法
二、String
String声明为final,不可被继承
String实现了serializable接口:表示字符串是支持序列化的
实现了comparable接口:表示String可以比较大小
String代表不可变字符的序列。
1.当堆字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
3.当调用String的replace()方法修改字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
通过字面量的方式给一个字符串赋值,此时的字符串值声明再字符串常量池中。
字符串常量池中是不会存储相同内容的字符串的。
public final class String
implements java.io.Serializable, Comparable, CharSequence {
private final char value[];
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
只要其中有一个变量,结果就在堆中。
如果拼接的结果调用intern()方法,返回值就在常量池中。
字面量连接
通过变量名参与运算,出现在堆空间,只要是有变量运算都是new
索引
替换
匹配
切片