1.正则表达式Regex
String提供了支持正则表达式的方法
- Matches(正则) : 当前字符串能否匹配正则表达式
- replaceAll(正则,子串) : 替换子串
- split(正则) : 拆分字符串
k 必须匹配指定字符k
abc 必须匹配指定字符abc
[abc] 只匹配单个的字符
[abc] [123] 两个里面各取一个进行组合
[a-z] 匹配小写26个字母
[a-zA-Z0-9] 三种符合的都可以单一的存在
[^a-zA-Z] 排除英文字母
\d 数字,相当于[0-9]
\D 排除数字,相当于[^0-9]
\s 空白字符
\S 排除空白字符
\w 字母数字下划线,相当于[a-zA-Z0-9]
\W 排除字母数字下划线
. 单个匹配任意字符
[abc]? ?表示,出现0次或者1次
[abc]?[123] 组合,如1,2,a1,a2
[abc]* 表示,可以出现0到多次
[abc]+ +表示,出现的次数要>=1次
[abc]{3} 元素可以出现3次,aaa,bbb,abc.
private static void method1() {
System.out.println("请输入身份证号");
String s = new Scanner(System.in).nextLine();
/*单个 \ 在java中有特殊含义,表示转义符号,不认为是一个斜杠
* 所以如果想要表示斜杠,需要在它的前面加一个用来转义的 \
* 也就是 \\ 才表示成一个单纯的 \ */
String Regex = "[\\d]{17}[\\dX]";
if(s.matches(Regex)){
System.out.println("输入正确");
}else{
System.out.println("请重新输入");
}
}
2.包装类
- 包装类把基本类型进行包装,提供更加完善的功能。
基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能 - Number抽象类
数字包装类的抽象父类。
提供了各种获取值的方式。
/**本类用于测试基本类型的包装类*/
public class TestNumber {
public static void main(String[] args) {
Integer i1 = new Integer(123);
Integer i11 = new Integer(123);
System.out.println(i1 == i11); //false
System.out.println(i1.equals(i11));//true
/*Integer有高效的效果,但是必须满足三个条件:
* 1.是Integer类型
* 2.使用valuesOf()的创建条件
* 3.数据在-128 ~ 127的范围内
* 满足以上条件,相同的数据只会存一次,后续再使用都是以前存过的数据*/
Integer i2 = Integer.valueOf(100);
Integer i22 = Integer.valueOf(100);
System.out.println(i2 == i22); //true
Integer i3 = Integer.valueOf(300);
Integer i33 = Integer.valueOf(300);
System.out.println(i3 == i33); // false,超过高效的数据范围-128~1279
Double d1 = new Double(3.14);
Double d11 = new Double(3.14);
System.out.println(d1 == d11); //false
/*只有Integer才有高效的效果,Double没有*/
Double d2 = Double.valueOf(3.14);
Double d22 = Double.valueOf(3.14);
System.out.println(d2==d22);//false
//这个方法的作用就是把传入的String类型的数据转成int
/*对象是什么类型的,就可以使用这个类的所有资源
* i1是Integer类型的对象,所以可以使用parseInt()将String类型的数据转为int类型
* d1是Double类型的对象,所以可以使用parseDouble()将String类型的数据转为double类型*/
System.out.println(i1.parseInt("800")+8); //808
System.out.println(d1.parseDouble("2.2")+3.4); //5.6
}
}
int类型装箱与拆箱
/**本类用于测试自动装箱与自动拆箱*/
public class TestBox {
public static void main(String[] args) {
Integer i1 = new Integer(100);
Integer i11 = new Integer(100);
Integer i2 = Integer.valueOf(100);
Integer i22 = Integer.valueOf(100);
System.out.println(i11==i22); //false
System.out.println(i1==i11); //false
System.out.println(i2==i22);//true
/*1.自动装箱,编译器会自动把基本类型int 5,包装成对应的包装类型Integer
* 然后交给i3来保存,自动装箱底层发生的代码: Integer.valueOf(5);
* valueOf()的方向: int ---> Integer*/
Integer i3 = 5;//不会报错,这个现象就是自动装箱
/*2.自动拆箱,编译器会自动把包装类型的i1拆掉箱子,变回基本类型数据5
* 然后交给基本类型int i4 来保存,底层发生的代码: i1.intValue()
* intValue()的方向: Integer ---> int*/
int i4 = i1; //不会报错,这个现象就是自动拆箱
}
}
3.io流
- 流只能单方向流动
- 输入流用来读取 → in
- 输出流用来写出 → out
- 数据只能从头到尾顺序的读写一次
3.1 IO流的继承结构
File
字节流:针对二进制文件
InputStream
FileInputStream
BufferedInputStream
ObjectInputStream
OutputStream
FileOutputStream
BufferedOutputStream
ObjectOutputStream
字符流:针对文本文件
Reader
FileReader
BufferedReader
InputStreamReader
Writer
FileWriter
BufferedWriter
OutputStreamWriter
PrintWriter一行行写出
3.2 File文件类
概述
封装一个磁盘路径字符串,对这个路径可以执行一次操作
可以封装文件路径、文件夹路径、不存在的路径
/**本类用于测试文件类File*/
public class TestFile {
public static void main(String[] args) throws IOException {
/*1.ready目录与1.txt需要自己创建
* 2.需要导包: import java.io.File;
* 3.路径是String类型,必须写正确,不然找不到文件
* 4.完整的文件名包含两部分: 文件名+后缀名*/
File file = new File("D:\\ready\\1.txt");
//2.1file中的常用方法
System.out.println(file.length()); //3,获取文件字节量
System.out.println(file.exists());//true, 判断文件是否存在
System.out.println(file.isFile());//true,判断是否为文件
System.out.println(file.isDirectory());//false,判断是否为文件夹
System.out.println(file.getName());//1.txt,获取文件名
System.out.println(file.getParent());//D:\ready,获取父级目录
System.out.println(file.getAbsolutePath());//D:\ready\1.txt,获取带盘符的完整路径:绝对路径
//2.2 创建与删除
/*new 只会在内存中创建一个File类型的对象
* 并不会在磁盘中创建一个真实存在的2.txt文件*/
file = new File("D:\\ready\\2.txt");
System.out.println("******************");
/*如果指定创建文件的路径不对,会抛出异常: java.io.Exception
* 所以需要提前处理这个问题,暂时选择在main()上抛出
* 这个IO异常是目前我们遇到的强制要求必须预先处理的异常
* 如果不处理,方法的调用会报错,不能通过编译*/
System.out.println(file.createNewFile());//创建一个之前并不存在的文件,如果创建成功就会返回true
file = new File("D:\\ready\\m");
System.out.println(file.mkdir());//创建之前不存在的单层文件夹
file = new File("D:\\ready\\a\\b");
System.out.println(file.mkdirs());//创建之前不存在的多层文件夹
System.out.println(file.delete());//true,删除空文件夹/文件
file = new File("D:\\ready\\a");
System.out.println(file.delete());// false,只能删除空文件夹
file = new File("D:\\ready\\2.txt");
System.out.println(file.delete());// true,2.txt被删除,可以删除文件
//2.3测展示文件列表
file = new File("D:\\ready");
String[] list = file.list();/*不常用*/
System.out.println(Arrays.toString(list));
//String[]不能用File[]的方法
// System.out.println(list[0].isDirectory());
File[] fs = file.listFiles();/*常用*/
System.out.println(Arrays.toString(fs));
System.out.println(fs[0].isDirectory());
}
}
3.3 字节流读取
字节流是由字节组成的,字符流是由字符组成的.
Java里字符由两个字节组成.字节流是基本流,主要用在处理二进制数据。
所以字节流是比较常用的,可以可以处理多种不同种类的文件,比如文本文档/音频/视频等等
3.3.1 InputStream抽象类
此抽象类是表示字节输入流的所有类的超类/抽象类,不可创建对象
常用方法:
abstract int read() 从输入流中读取数据的下一个字节
int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组,off表示存时的偏移量
void close() 关闭此输入流并释放与该流关联的所有系统资源
3.3.2 FileInputStream子类
创建对象
FileInputStream(File file)—直接传文件对象
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定FileInputStream(String pathname)—传路径
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定
/**本类用于练习字节输入流*/
public class TestIn {
public static void main(String[] args) {
try {
// InputStream in = new FileInputStream(new File("D:\\ready\\1.txt"));
InputStream in = new FileInputStream("D:\\ready\\1.txt");
System.out.println(in.read());
System.out.println(in.read());
System.out.println(in.read());
} catch (Exception e) {
e.printStackTrace();//报错后会在控制台给程序员打印错误信息用来调试
}
}
}