一、内部类
Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。其可分为成员内部类、局部内部类、匿名内部类
1.成员内部类
1.1 成员内部类的理解
成员内部类作为外部类的成员:
- 可以调用外部类的结构
- 可以被static修饰
- 可以被4种不同的权限修饰
成员内部类作为一个类:
- 其类里面可以定义属性、方法、构造器等
- 其可以被final修饰,表示此类不能被继承。言外之意,不使用ginal,就可以被继承
- 其可以被abstract修饰
1.2 如何创建成员内部类对象?(静态的,非静态的)
//创建静态的Dog内部类的实例(静态的成员内部类)
Person.Dog. dog = new Person.Dog();
//创建非静态的Bird内部类的实例(非静态的成员内部类)
//Person p = new Person();错误的
Person p = new Person();
Person.Bird bird = p.new Bird();
1.3 如何在成员内部类中调用外部类的结构?
class Person{
String name = "小明";
public void eat(){
}
//非静态成员内部类
class Bird{
String name = "杜鹃";
public void display(String name){
System.out.println(name);//方法的形参
System.out.println(this.name);//内部类的属性
System.out.println(Person.this.name);//外部类的属性
Person.this.eat();
}
}
}
2.局部内部类
2.1 局部内部类的使用
//返回一个实现了Comparable接口的类的对象
public Comparable getComparable(){
//创建一个实现了Comparable接口的类:局部内部类
//方式一:
// class MyComparable implements Comparable{
// @Override
// public int compareTo(Object o){
// return 0;
// }
// }
// return new MyComparable();
//方式二:
return new Comparable(){
@Override
public int compareTo(Object o){
return 0;
}
}
}
- 注意点:
在局部内部类的方法中(比如:如果调用局部内部类所声明的方法中的局部变量,要求此局部变量声明为final的)
jdk7及之前版本:要求此局部变量显示的声明为final的
jdk8及之后的版本:可以省略final的声明
- 总结:成员内部类和局部内部类,在编译以后,都会生成字节码文件。
3.匿名内部类
public class Test{
private Runnable runnable = new Runnable(){
@Override
public void run(){
}
};
}
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其它类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
二、IO流知识
1. File类的常用方法
- 获取功能
String getName():获取文件或文件夹的名字
String getPath():获取文件或文件夹的路径
String getParent():获取文件或文件夹的当前路径的上一级路径
String getAbsolutePath():获取文件或文件夹的绝对路径
String[] list():获取指定目录下的所有文件或者文件目录的名称数组
File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组
- 重命名功能
boolean renameTo(File dest):把文件重命名为指定的文件路径
- 判断功能
boolean isDirectory():判断是否是目录
boolean isFile():判断是否是文件
boolean isHidden():判断文件是否是隐藏
boolean isAbsolute():判断是否是绝对路径
boolean exists():判断文件或文件夹是否存在
boolean canRead():判断是否可读
boolean canWrite():判断是否可写
- 创建功能
creatNewFile():若文件存在,则不创建;若文件不存在,则创建
mkdir():若目录存在,则不创建;若目录不存在,则创建单级目录
mkdirs():创建文件目录。如果上层文件目录不存在,一并创建
注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下
- 删除功能
boolean delete():删除文件或者文件夹
void deleteOnExists():退出程序以后才删除
删除注意事项:
Java中的删除不走回收站。
要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
2. IO流的概述
- 流的分类
- 操作数据单位:节点流、字符流
- 数据的流向:输入流、输出流
- 流的角色:节点流、处理流
- 流的体系结构
红框对应的是IO流中的4个抽象基类。蓝框常用
- 重点说明的几个流结构

- 输入、输出的标准化过程
- 输入过程
- 创建File对象,指明读取的数据的来源【要求此文件一定要存在】
- 创建对应的输入流,将File类的对象作为参数,传入流的构造器中
- 具体的读入过程:创建响应的byte[]或char[]
- 关闭流资源
- 说明:程序中出现的异常需要使用try-catch-finally处理
- 输出过程
- 创建File类对象,指明写出的数据的位置【不要求此文件一定要存在】
- 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
- 具体的写出过程:write(char[]/byte[] buffer, 0, len)
- 关闭流资源
- 说明:程序中出现的异常需要使用try-catch-finally处理
- 输入过程
3. FileReader / FileWriter的使用:
- FileReader的使用
将day09下的hello.txt文件内容读入程序中,并输出到控制台
说明点:
- read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
- 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
- 读入的文件一定要存在,否则就会报FileNotFoundException。
@Test
public void testFileReader1() {
FileReader fr = null;
try {
//1.File类的实例化
File file = new File("hello.txt");
//2.FileReader流的实例化
fr = new FileReader(file);
//3.读入的操作
//read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
char[] cbuf = new char[5];
int len;
while((len = fr.read(cbuf)) != -1){
//方式一:
//错误的写法
// for(int i = 0;i < cbuf.length;i++){
// System.out.print(cbuf[i]);
// }
//正确的写法
// for(int i = 0;i < len;i++){
// System.out.print(cbuf[i]);
// }
//方式二:
//错误的写法,对应着方式一的错误的写法
// String str = new String(cbuf);
// System.out.print(str);
//正确的写法
String str = new String(cbuf,0,len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fr != null){
//4.资源的关闭
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- FileWriter的使用
从内存中写出数据到硬盘的文件里。
说明:
输出操作,对应的File可以不存在的。并不会报异常
File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
File对应的硬盘中的文件如果存在:
如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容
@Test
public void testFileWriter() {
FileWriter fw = null;
try {
//1.提供File类的对象,指明写出到的文件
File file = new File("hello1.txt");
//2.提供FileWriter的对象,用于数据的写出
fw = new FileWriter(file,false);
//3.写出的操作
fw.write("I have a dream!\n");
fw.write("you need to have a dream!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流资源的关闭
if(fw != null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 文本文件的复制:
@Test
public void testFileReaderFileWriter() {
FileReader fr = null;
FileWriter fw = null;
try {
//1.创建File类的对象,指明读入和写出的文件
File srcFile = new File("hello.txt");
File destFile = new File("hello2.txt");
//不能使用字符流来处理图片等字节数据
// File srcFile = new File("爱情与友情.jpg");
// File destFile = new File("爱情与友情1.jpg");
//2.创建输入流和输出流的对象
fr = new FileReader(srcFile);
fw = new FileWriter(destFile);
//3.数据的读入和写出操作
char[] cbuf = new char[5];
int len;//记录每次读入到cbuf数组中的字符的个数
while((len = fr.read(cbuf)) != -1){
//每次写出len个字符
fw.write(cbuf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
//方式一:
// try {
// if(fw != null)
// fw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }finally{
// try {
// if(fr != null)
// fr.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//方式二:
try {
if(fw != null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace()

本文详细介绍了Java中的内部类概念,包括成员内部类、局部内部类和匿名内部类的特点与使用方法。同时深入探讨了Java IO流的基础知识,如File类的使用方法、字符流与字节流的区别及应用,以及缓冲流、转换流等高级流的使用技巧。


最低0.47元/天 解锁文章
1706

被折叠的 条评论
为什么被折叠?



