正则,包装类和File类

正则,包装类和File类

正则表达式

1 什么是正则表达式

正则表达式能够描述字符串的格式

通常用于验证字符串内容

正则表达式并不是java语言的内容,而是独立于编程语言的体系

2 为什么需要正则表达式

在人机信息互动时,可以让计算机验证用户输入的内容是否匹配

3 正则表达式字符说明

[abc] abc中任意一个字符

[^abc] 除了abc的任意字符

[a~z] a~z中的任意一个字符

[a-zA-Z0-9] az、AZ、0~9中任意一个字符

[a-z&&[ ^bc]] a~z中除了b和c以外的任意一个字符,其中&&表示"与"的关系

. 任意一个字符

\d 任意一个数字字符,相对于[0-9]

\w 单词字符,相当于[a-zA-Z0-9_]

\s 空白字符,相当于[\t\n\x0B\f\r]

\D 非数字字符

\W 非单词字符

\S 非空白字符

X? 表示0个或1个

X* 表示0个或任意多个

X+ 表示1个到任意多个(大于等于1)

X{n} 表示n个

X{n,} 表示n到任意多个

X{n,m} 表示n个到m个

4 正则验证Emall

字符串支持正则表达式方法一:

boolean matches(String regex)

使用当前给定的正则表达式验证当前字符串的格式,匹配通过返回true否则返回false

package cn.tedu.vip.string;
/**
 *boolean matches(String regex)
 */
public class MatchesDemo{
    public static void main(String[] args){
        String email="fancq@tedu.cn";
        /*
         *[a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
         */
        String regs="[a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+";
        boolean match=eamil.matches(regex);
        if(match){
            System.out.println("是邮箱");
        }else{
            System.out.println("不是邮箱");
        }
    }
}
5 正则拆分字符串

String支持正则表达式方法二:

String[]split(String regex)

将当前字符串按照满足正则表达式的部分进行拆分

package cn.tedu.vip.string;

import java.util.Arrays;
/**
 * String的split方法
 * 支持使用正则表达式作为条件
 * 将当前字符串分割成一个字符串数组
 * @author Tedu
 *
 */
public class SplitDemo {

	public static void main(String[] args) {
		String str="abc123def456ghi";
        /*
         *split方法如果连续匹配到了拆分的内容
         *则在中间会拆分出空字符串,但是如果是字符串
         *末尾连续匹配,则所有空字符串都会被忽略
         */
		String[] strs=str.split("\\d+");
		System.out.println(strs.length);//3
		
		System.out.println(Arrays.deepToString(strs));//自动输出数组元素
	}
}
6 正则替换字符串

String支持正则表达式三:

String replaceAll(String regex,String str)

将当前字符串中满足正则表达式的部分替换为刚给定的任务

package cn.tedu.vip.string;
/**
 * indexOf(String str)
 * 查找给定字符串在当前字符串中的位置
 * 若存在返回给定字符串所在的索引位置
 * 若不存在返回-1
 * @author Tedu
 *
 */
public class ReplanceAllDemo {

	public static void main(String[] args) {
		String str="thinking in java";
		//          0123456789012345
		int index=str.indexOf("in");//单引号也可以
		System.out.println(index);
		
		//找第二个
		index=str.indexOf("in",4);
		System.out.println(index);
		//找最后一个(最后出现的字符位置)
		index=str.lastIndexOf("in");
		System.out.println(index);
	}
}

Object类

1 什么是Object类

Object类是java中所有类的父类

2 为什么需要Object类

Object类承载了java中所有类的共性内容

为java程序提供了最基本的结构支撑,是所有类的根类

3 重写toString和equals方法

Object类中的方法并不能针对子类编写

子类中可以重写超类的方法

package cn.tedu.vip.obj;
/**
 * Object类是所有类的顶级父类
 * Object类中也定义了一些方法
 * toString:将当前对象转换为字符串
 * equals:对比两个对象是否相同,Object类默认比较引用
 * @author Tedu
 *
 */
public class Point {
	private int x;
	private int y;
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
	//快捷键调用构造器和属性方法	
	//构造Alt+Shift+S O
	//属性Alt+Shift+S R getter setter
	
	//public static void main(String[] args) {
		//Object o=new Object();
		//System.out.println(o);
	//}
	/*
	 * 重写Object类中的toString方法
	 * 返回统一格式的x轴和y轴坐标值输出
	 */
	public String toString() {//重写父类
		return"(x:"+x+",y:"+y+")";//返回值
	}
	//@Override
	//public String toString() {
		//return "Point [x=" + x + ", y=" + y + "]";
	//}
	/*
	 * 重写Object类中的equals方法
	 * Object类中是比较两个对象的引用
	 * 只有引用相同才会返回true
	 * 当我们需要自定义规则去判断对象是否相等时
	 * 就需要重写equals
	 */
	//public boolean equals(Object obj) {
		//判断参数是否为空
		//if(obj==null) {
		//	return false;
		//}
		//判断是不是同引用
		//if(this==null) {
		//	return true;
		//}
		//判断属性值是否相同
		//if(obj instanceof Point) {
			//Point p=(Point)obj;
			//return this.x==p.x && this.y==p.y;
		//}
		//return false;
	//}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Point other = (Point) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}
}

包装类

1 什么是包装类

每个基本数据类型对应一个包装类

包装类对象就是基本数据类型的对象形式

基本类型 基本类型 父类

int java.lang.Integer java.lang.Number

long java.lang.Long java.lang.Number

double java.lang.Double java.lang.Number

short java.lang.Short java.lang.Number

float java.lang.Float java.lang.Number

byte java.lang.Byte java.lang.Number

char java.lang.Character java.lang.Object

boolean java.lang.Boolean java.lang.Object

2 为什么需要包装类

基本数据类型不能直接参与引用类型的使用或计算

使用包装类将基本数据类型转换为引用数据类型,可以参与到其他引用类型的使用

3 包装类的使用

包装类是为了解决基本数据类型不能直接参与面向对象开发问题而产生的,使得基本类型可以以对象的形式存在

包装类的赋值

package cn.tedu.vip.integer;
/**
 * 包装类
 * 包装类是为了解决基本数据类型值不能作为对象参与程序开发问题的
 * 有了包装类就可以将数值放入对应的包装类中,即转换为对象的形式
 * 所有的包装类都在java.lang包下
 * 包装类的名称,除了int和char都是首字母大写即可
 * int---Ineeger
 * char---Character
 * @author Tedu
 *
 */
public class IntegerDemo01 {
	public static void main(String[] args) {
		int d=128;
		/*
		 * 基本数据类型转换为包装类对象
		 */
		Integer i1=Integer.valueOf(d);
		Integer i2=Integer.valueOf(d);
		
		//Integer中有一个1字节的缓存
		//如果在-128~127之间,直接用缓存保存,否则才是对象形式
		System.out.println(i1==i2);//false
		System.out.println(i1.equals(i2));//true
		
		Double d1=Double.valueOf(123.4);
		Double d2=Double.valueOf(123.4);
		System.out.println(d1==d2);//false
		System.out.println(d1.equals(d2));
		
		/*
		 * 将包装类转换成基本数据类型
		 */
		int i=i1.intValue();
		System.out.println(i);//128
		double dd=d1.doubleValue();
		System.out.println(dd);//123.4
		
		byte b=i1.byteValue();
		System.out.println(b);//溢出,结果为-128		
	}
}

包装类提供的一些功能:

package cn.tedu.vip.integer;
/**
 * 展示包装类中的常用功能和转换时发生的异常
 * @author Tedu
 *
 */
public class IntegerDemo02 {

	public static void main(String[] args) {
		//获得int类型最大值
		int imax=Integer.MAX_VALUE;
		System.out.println(imax);
		
		int imin=Integer.MIN_VALUE;
		System.out.println(imin);
		
		long Imax=Long.MAX_VALUE;
		System.out.println(Imax);
		
		long Imin=Long.MIN_VALUE;
		System.out.println(Imin);
		
		String s="123";
		//Integer i=Integer.valueOf(s);
		//int d=Integer.valueOf(s);
		/*
		 * 如何想将一个String类型的数据转换成int类型
		 * 推荐使用Integer.paresInt()方法
		 */
		//System.out.println(d);
		
		/*
		 * 将字符串转换成数值类型时可能发生数字转换异常
		 * NumberFormatException
		 */
		int d=Integer.parseInt(s);
		System.out.println(d);	
		
		String ss="123.123";
		double dd=Double.parseDouble(ss);
		System.out.println(dd*2);
	}
}

自动拆装箱

使得编译期在编译期间补充代码完成基本类型与对应包装类之间转换的代码,使得我们在编写源代码时可以在基本类型与引用类型直接直接赋值

package cn.tedu.vip.integer;
/**
 * 装箱:将基本数据类型的数值,存放在对应它的包装类里
 * 拆箱:从包装类对象中,获取这个基本数据类型的数值
 * JDK1.5时,java编译器就能够自动拆装箱
 * 为了简化开发时基本数据类型和其包装类的转换
 * @author Tedu
 *
 */
public class IntegerDemo03 {

	public static void main(String[] args) {
		int a=1;
		/*
		 * 下面就是一个自动装箱操作
		 * 代码在编译时会被转换为
		 * Integer i=Integer.valueOf(a);
		 */
		Integer i=a;
		/*
		 * 下面的代码就是自动拆箱
		 * 代码编译时会被转换为
		 * int b=i.intValue();
		 */
		int b=i;
	}
}

FIle类

1 什么是File类

java.io.File类就是文件的意思,用于表示硬盘上的一个文件或文件夹

2 为什么需要File类

java程序可能需要控制硬盘上的一个文件或文件夹

使用File类中的各种方法可以获得文件或文件夹的信息

3 使用File类获得文字信息

使用File可以:

  1. 访问其表示的文件或目录的属性(名字,大小写)
  2. 操作文件或目录(创建,删除)
  3. 访问一个目录的子项内容
package file;

import java.io.File;

/**
 * java.io.File类
 * 这个类的对象代表硬盘上的一个文件或文件夹
 * File类的功能
 *1:访问文件或目录的基本属性
 *2:对文件进行操作(创建删除)
 *3:可以访问文件夹中的文件信息
 * @author Tedu
 *
 */
public class FileDemo {

	public static void main(String[] args) {
		/*
		 * 绝对路径
		 * 绝对路径移植性差
		 * 不同操作系统就可能无法使用了(Linux和Windows)
		 */
		//File file=new File("C:\\Users\\hp\\eclipse-workspace\\Unit001\\File");
		/*
		 * 用相对路径
		 * 可以使用。/开头表示当前项目
		 * 就解决了绝对路径的移植问题
		 */
		File file=new File("./file/txt.txt");
		
		System.out.println("是否存在:"+file.exists());
		System.out.println("是文件:"+file.isFile());
		System.out.println("是文件夹:"+file.isDirectory());
		
		System.out.println("文件名:"+file.getName());
		System.out.println("文件大小(long字节):"+file.length());
		
		System.out.println("可读:"+file.canRead());
		System.out.println("可写"+file.canWrite());
		System.out.println("隐藏的"+file.isHidden());
	}
}
4 创建文件

createNewFile()

创建一个文件

package file;

import java.io.File;
import java.io.IOException;
/**
 * 创建新文件
 * @author Tedu
 *
 */
public class GreateNewFileDemo {
	public static void main(String[] args) throws IOException {
		/*
		 * 在file文件夹下创建test.txt
		 */
		File file=new File("./file/test1.txt");
		if(file.exists()) {
			System.out.println("文件已存在");
		}else {
			//创建文件
			file.createNewFile();
			System.out.println("文件已创建");
		}
	}
}
5 删除文件

delete()

删除一个文件

package file;

import java.io.File;
/**
 * 删除指定文件
 * @author Tedu
 *
 */
public class DeleteFileDemo {

	public static void main(String[] args) {
		/*
		 * 实例化File对象指定目录后
		 * 调用delete方法即可
		 */
		File file=new File("file/test1.txt");
		if(file.exists()) {
			System.out.println("删除文件");
			file.delete();
		}else {
			System.out.println("文件不存在");
		}
	}
}
6 创建空目录

mkdir()

创建一个目录

package file;

import java.io.File;
/**
 * 使用File创建一个空目录
 * @author Tedu
 *
 */
public class MkDirDemo {

	public static void main(String[] args) {
		/*
		 * 当前目录下创建一个新demo目录
		 */
		File file=new File("demo");
		if(file.exists()) {
			System.out.println("目录已创建!");
			file.mkdir();
		}else {
			System.out.println("目录已存在!");
		}
	}
}
7 创建多级目录

mkdirs()

创建一系列目录

package file;

import java.io.File;
/**
 * 创建多级文件夹
 * @author Tedu
 *
 */
public class MkDirsDemo {

	public static void main(String[] args) {
		/*
		 * 在当前目录下创建a/b/c/d/e
		 */
		//指定最后一级目录的File
		//ctrl+shift+O导包
		File file=new File("a/b/c/d/e");
		if(file.exists()) {//!
            //该方法会将所有不存在的父目录一同创建处理
            //而mkdir方法如果父目录不存在则创建失败
			System.out.println("已存在");
		}else {
			/*
			 * 如果使用mkdir创建多级目录会无效
			 * 只要是多级目录必须使用mkdirs方法
			 * 会自动创建它的所有父目录
			 */
			System.out.println("创建文件夹");
			file.mkdirs();
		}
	}
}
8 删除空目录

delete()

用于删除空目录

package file;

import java.io.File;
/**
 * 删除文件夹
 * @author Tedu
 *
 */
public class DeleteDirDemo {

	public static void main(String[] args) {
		File file=new File("null");
		if(file.exists()) {
			/*
			 * 删除文件夹时,这个文件夹必须是空的
			 */
			file.delete();
			System.out.println("执行删除");
		}else {
			System.out.println("文件夹不存在");
		}
	}
}
9 获取当前目录下所有子项

listFiles()

获得目录下所有子项

package file;

import java.io.File;
/**
 * 获取一个目录中的所有子项
 * @author Tedu
 *
 */
public class ListFilesDemo {

	public static void main(String[] args) {
		File dir=new File("./file");
		//如果是文件夹
		if(dir.isDirectory()) {
			/*
			 * file[] listFiles()
			 * 获得当前目录下所有子项,返回一个File类型数值
			 */
			File[] fs=dir.listFiles();
			System.out.println(fs.length);
			for(int i=0; i<fs.length; i++) {
				System.out.println(fs[i].getName());
			}
		}
	}
}
10 删除目录下所有内容

使用递归,配合调用delete()实现删除指定目录下所有内容

package file;

import java.io.File;
/**
 * 递归调用就是一个方法自己调用自己
 * 删除一个由内容的文件夹就需要使用递归
 * 因为每个文件夹中都有可能还有文件夹
 * 使用递归编写类似的逻辑比较简单
 * @author Tedu
 *
 */
public class DeleteDirDemo02 {

	public static void main(String[] args) {
		File f=new File("./file");
		deleteDir(f);
	}
	//编写一个方法删除文件夹,参数是File
	//考虑是文件夹和是文件的不同操作
	public static void deleteDir(File file) {
		
		if(file.isDirectory()) {
			//先取出所有子项
			File[] fs=file.listFiles();
			//编历数组删除文件
			for(int i=0; i<fs.length; i++) {
				File f=fs[i];
				//调用自己;递归调用
				//递归注意事项
				//1.递归使用次数尽量少
				//递归消耗大,效率差
				//2.递归的调用必须在一个分支结构中
				//否则会无限递归
				//导致内存溢出,程序瘫痪
				deleteDir(f);
			}
		}
		//如果是文件夹会有相应的操作
		file.delete();
	}
}
11 文件过滤器

File[]listFiles(FileFilter filter)

该方法在获取该目录中子项的过程中利用参数给定的过滤器将满足其要求的子项返回,其余的忽略:

package file;

import java.io.File;
import java.io.FileFilter;
/**
 * 文件过滤器
 * 就是在listFiles(FileFilter filter)
 * 在获取该文件夹的子项时进行过滤
 * 只返回符合过滤规则的子项
 * @author hp
 *
 */
public class ListFilterDemo {

	public static void main(String[] args) {
		File file=new File(".");
		if(file.isDirectory()) {
			//创建一个匿名内部类;文件过滤器
			FileFilter filter=new FileFilter() {

				@Override
				public boolean accept(File f) {
					String fname=f.getName();
					System.out.println("过滤:"+fname);
					//返回真表示获取
					return fname.startsWith(".");
				}
			};
			File[] fs=file.listFiles(filter);
			System.out.println(fs.length);
			for(int i=0; i<fs.length; i++) {
				System.out.println(fs[i].getName());
			}
		}
	}
}

过滤结果:

过滤:.classpath
过滤:.project
过滤:.settings
过滤:bin
过滤:demo
过滤:src
3
.classpath
.project
.settings
posted @ 2021-03-11 07:48  指尖上的未来  阅读(119)  评论(0)    收藏  举报