内部类、IO流、常用类总结

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

一、内部类

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流的概述

  • 流的分类
  1. 操作数据单位:节点流、字符流
  2. 数据的流向:输入流、输出流
  3. 流的角色:节点流、处理流
    在这里插入图片描述
  • 流的体系结构

在这里插入图片描述
红框对应的是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文件内容读入程序中,并输出到控制台
说明点:

  1. read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1
  2. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用try-catch-finally处理
  3. 读入的文件一定要存在,否则就会报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()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值