目录
1.泛型
1.1什么是泛型
在使用时限制数据类型
1.2为什么使用
类型安全,使用泛型可以知道变量的类型限制,如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全,在运行期间可能会发生异常,因此使用泛型还能消除强制类型转换,减少出错机会。
1.3如何使用泛型
若定义的一个类或接口有一个或多个类型变量,则可以使用泛型。泛型类型变量由<>界定,放在类名后或接口后。例如List<E> list=new ArrayList<E>();这样就意味着变量将被一个类型替代当作参数或返回类型,但在JDK1.7后,new后的<>可以省略。我们还可以自定义泛型类,例如很常见的介绍:
public class TestFan {
public static void main(String[] args) {
Student stu=new Student();
stu.setAge(13);
stu.setName("李四");
Object a = stu.getAge(); //未使用泛型限制,默认为Object类型
Object n = stu.getName();
System.out.println(a+"岁的"+n);
Student<String> stu1=new Student(); //使用泛型限制,内容定义只能为字符串类型
stu1.setName("张三");
stu1.setAge("18");
String a1 = stu1.getAge();
String n1 = stu1.getName();
System.out.println(a1+"岁的"+n1);
}
}
class Student<T>{ //使用泛型,上述泛型定义会替代此处的T
private T name; //使用泛型方法
private T age;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public T getAge() {
return age;
}
public void setAge(T age) {
this.age = age;
}
}
2、File对象
2.1介绍File对象
File类就是当前系统中文件或文件夹的抽象表示,通俗来讲就是使用File对象来操作window下的文件或文件夹进行增删改查的操作处理。
2.2File对象的使用
(1)创建一个File对象
首先在磁盘创建一个文件夹,方便在内部进行对文件的操作,而不影响其他文件夹的内部内容,创建File对象时,需要对其传入绝对路径也可传入相对路径,一般都是选用绝对路径就是以根目录开头的完整路径。需要注意的是windows下的使用\作为层级分隔符,但在Linux和Mac系统上是以/作为层级分割符。因为java代码是一种跨平台语言,为使代码在任意系统下使用,又因为windows兼容/和\,因此之后使用时都是以/作为层级分割符。即
File file=new File("D:/www/a.txt")
(2)增加、删除操作
若是增加操作没有执行,上述new出的文件夹内部是没有a.txt这个文件内容的,即使你写上了,也是不会自行创造出来的。
file.createNewFile(); //创建相应的文件,因为此处要异常要进行抛异常处理
file.mkdir(); //创建目录但只能创建单层目录
file.mkdirs(); //创建多层目录
file.delete(); //删除文件还可以删除空目录
file.deleteOnExit(); //程序完成后才会删除,一般与Thread.sleep(10000);进行同时使用,此处是为了让程序休眠10s,然后完成程序,是为了更好的观看删除的效果。
(3)修改、查找操作
file.setReadable(false); //设置该文件的权限为不能读,但自己可以读
file.setWritable(false); //设置该文件不能写
file.setReadOnly(); //设置该文件只能为读
file.renameTo(new File("")); //修改文件的名字,要记得内部还是使用绝对定位,然后才能实现重命名的操作。
file.getName(); //得到文件的名称
file.getParent(); //得到父级路径的名称
file.getPath(); //得到文件的路径名称
file.isFile(); //判断该文件类型是否为文件类型
file.isDirectory(); //判断该文件对象是否为目录类型
file.Listy(); //列出此目录下的所有文件名称
file.ListFiles(); //列出此目录下的所有文件对象
2.3基于上述讲解的面试题
打印出目标目录下的所有文件对象的名称已经路径
public class Topic {
public static void main(String[] args) {
showAllFiles("D:/aaaa");
}
public static void showAllFiles(String path){ //使用递归方式进行打印
File file=new File(path);
if(!file.exists() || !file.isDirectory()){
return;
}
File[] files = file.listFiles();
for (File f:files) {
if(f.isDirectory()){
System.out.println(f.getPath()+" <Dir>"); //给打印出的文件夹做标记
showAllFiles(f.getPath());
}else {
System.out.println(f.getPath()+" ");
}
}
}
}
3、IO流
IO为两个单词的缩写:Input以及Output。
IO流的作用是:就是对文件中的内容进行操作。输入:读操作(读取文件中的内容),输出:写操作(往文件中写内容)
3.1 IO流的分类
(1)根据流的方向:
输入流:程序可以从中读取数据的流。
输出流:程序可以向其写数据的流。
(2) 根据流的单位 :
字节流:以字节为单位传输数据的流。
字符流:以字符为单位传输数据的流。
(3)根据功能
节点流:直接和文件进行交互。
处理流:不是直接作用在文件上。
流的分类基本上分为两类:字节流和字符流。
3.2介绍不同流的功能作用
(1)writer字符输出流(抽象类,是所有字符输出流的根类)
字符输出流----指定对那个文件路径进行操作。介绍一下writer字符输出流里包含的FileWriter类
1、首先进行创建
Writer writer=new FileWriter(); //内部必须有路径,因为其内部方法里面没有无参构造。
2、写入内容
String str="hello";
writer.writer(str); //写操作
writer.flush(); //刷新流,这个操作必然存在
writer.close(); //关闭流,这个操作必然存在
(2)Reader 字符输入流(所有字符输入流的根类)
实现类很多,先介绍一下FileReader类
1、先创建
Reader reader=new FileReader(); //内部没有无参构造,必须要有绝对路径
2、实现作用
reader.read(); //每次只读一个字符,返回的是为读取的内容
读多个内容并打印出来:
int r=0; //每次读一位,效率慢
while((r=reader.read()!=-1)){
System.out.print((char) r);
}
char[] cs=new char[2]; //每次读两位,加快速度
int count=0;
while((count= reader.read(cs))!=-1){
String str=new String (cs,0,count);
System.out.println(str);
}
3、完成文件的复制
要求是把D盘的文件内容复制到C盘中的指定位置
1、首先创建一个字符输入流
2、再创建一个字符输出流
3、再将D盘中的字符内容读取到C盘中
public void Test01() throws Exception {
FileReader fs=new FileReader("D:/aaaa/aaa.text");
FileWriter fc=new FileWriter("C:/aaaa/bbb.txt");
int c=0;
char[] chars = new char[3];
while((c=fs.read(chars))!=-1){ //从D盘读
fc.write(chars,0,c); //C盘写入读取的内容
fc.flush();
}
fc.close(); //关闭流是一定要进行的操作
fs.close();
}
但这个复制方式却不能将D盘中的图片或视频及压缩文件进行复制到C盘指定文件夹下,它只能对文本进行操作,因为图片或视频及压缩文件这些都是输入二进制,因此只能使用字节流进行操作。
(3)OutputStream(字节输出流,可以对任意文件进行输出操作)
讲解子类FileOutputStream
1、进行创建
OutputStream os=new FileOutputStream(""); //内部填写想要复制的初始位置,若是发现内部没有这个文件,会相应的创建一个文件,但是不能创建文件夹
2、添加内容
String str="abcd";
byte[] bytes=str.getBytes(); //此处是将字符串转换为字节数组
(4)InputStream(字节输入流,可对任意文件进行读操作,以字节为单位,是所有字节输入流的父类)
讲解子类FileInputStream
1、进行创建
InputStream is=new FileInputStream(""); //内部有异常要进行异常处理
2、读取内容的操作
public void Test02() throws Exception {
InputStream is=new FileInputStream("D:/aaaa/aaa.text");
byte[] bytes = new byte[3];
int c=0;
while((c=is.read(bytes))!=-1){
String s = new String(bytes); //把Bytes数组转换为字符串操作
System.out.println(s);
}
is.close();
}
3、完成文件的复制
要求是把D盘的文照片复制到C盘中的指定位置
1、首先创建一个字节输入流
2、再创建一个字节输出流
3、再将D盘中的字符内容读取到C盘中
public void Test03() throws Exception {
InputStream is=new FileInputStream("D:/aaaa/3.jpg"); //从D盘取出
OutputStream os=new FileOutputStream("C:/aaaa/3.jpg"); //C盘写入
byte[] bytes = new byte[10];
int c=0;
while((c=is.read(bytes))!=-1){
os.write(bytes ,0,c);
}
os.close();
is.close();
}
(5)处理流(缓存流)
缓冲流是在基础流上添加了一个缓存池功能,语句是在基础流语句前加个Buffer。
1、进行创建
首先要创建一个基础流,例如首先创建一个输出字节流(其余方式与此相似,不一一赘述)
OutputStream os=new FileOutputStream("");
BufferOutputStream bos=new BufferOutputStream(os); //后边还可以添加想要的长度
使用缓冲池时,默认是可以放入8192个字节,若里面内容较少,则会暂时放入缓存池里面,并没有放入到文件中,所以文件中没有内容,但是如果进行刷新流处理,即使内容少也会放入到文件中,还可以不进行刷新直接关闭流,因为关闭流前会默认先刷新流。
(6)对象流(对java对象进行IO操作)
操作IO流的时候,除了将字符串读写操作,还可以将java对象在文件中进行对象,将java对象进行读写操作意义在于持久化信息,因运行时,所有的数据都是运行内存中的,持久化就是将运行内存的数据保存到硬盘上 ,存档(写)是序列化,读档(读)是反序列化。
1、进行创建
对象输出流:ObjectOutputStream oos=new ObjectOutputStream(); //内部放字节输出流
oos.writeObject(); //使用对象输出流调用输出方法
注意:输出的类对象,该类必须实现序列化接口,即在对象类后加上implements Serializable。序列化就是把内存中的java对象存储到磁盘的过程,反序列化就是把磁盘中的内容读取到java对象内存的过程。