泛型、File对象和IO流

目录

1. 泛型
2. File对象
3. IO流

1.泛型

1.1 什么是泛型

1、泛型是限制我们的数据类型。

2、为什么要使用泛型?

​ 在未使用泛型时,我们定义集合默认是Object类型,可以放入任何数据类型,但是在使用集合内的数据时,需要强制转换为我们需要的类型,不方便对元素进行其他的操作。

List list = new ArrayList();
list.add("星期一");
list.add("星期二");
list.add("星期三");
String s = (String) list.get(1);//获取元素时需要对其进行强制转换
System.out.println(s);

1.2 怎么去使用泛型

泛型的格式:

​ List<类型> list = new ArrayList<类型>(); 集合中存储的数据必须是其定义的类型数据,后一个<类型>可以省略不写。也可以只写<>,其默认和前面的类型保持一致

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

public class Test03 {
    public static void main(String[] args) {
        List<String> list = new ArrayList();// 集合中只能添加String类型
        list.add("星期一");
        list.add("星期二");
        list.add("星期三");
        String s = list.get(1);//不需要对其进行强制转换
        System.out.println(s);

     
        HashMap<String,Integer> map = new HashMap<>();
        map.put("孙悟空",500);
        map.put("猪八戒",400);
        Set<String> strings = map.keySet();
        System.out.println(strings);
    }
}

请添加图片描述

1.3自己定义泛型

public class 类名<标识,标识,....>{
    标识  变量名;
    public 标识 方法名(){
        
    }
    public void 方法名(标识 参数名){
    
    }
    ......
}
public class Test04 {
   public static void main(String[] args) {
      Point p1 = new Point();// 创建对象时未指定泛型类型则默认为Object类型
      p1.setX(5);
      p1.setY("南偏北30度");

      Point<Integer> p2 = new Point<>();//指定为泛型为int类型
      p2.setX(5);
      p2.setY(5);
      p2.show();
      
      // 如果要存储其他类型数据,需要重新new一个对象
      Point<String> p3 = new Point<>();
   }
}

public class Point<E> {
    private E x;
    private E y;
    public void show(){
        System.out.println("x轴坐标为:"+x+";y轴坐标为:"+y);
    }

    public E getX() {
        return x;
    }

    public void setX(E x) {
        this.x = x;
    }

    public E getY() {
        return y;
    }

    public void setY(E y) {
        this.y = y;
    }
}

2.File对象

2.1 file的介绍

​ File类就是当前系统中的文件或者文件夹的抽象表示。通俗的讲就是使用file对象来操控我们电脑系统中的文件或者文件夹。学习File类,就是通过file对象,对系统文件或文件夹的增删改查操作。

2.2 创建file对象

import java.io.File;
import java.io.IOException;

public class Test01 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:/AAA");// ios和linux系统下分隔符是 /
        File file1 = new File("D:\\AAA\\aaa");// window系统对/和\都兼容,第一个 \ 是转义字符
        // File.separator:根据当前系统自动获取相应的分隔符
        File file2 = new File("D:"+File.separator+"AAA"+File.separator+"bbb");
    }

2.3增加操作

File file = new File("D:/AAA/aaa.txt");
file.createNewFile();// 创建相应的文件

File file1 = new File("D:/AAA/bbb");
file1.mkdir();//创建单层目录

File file2 = new File("D:/AAA/BBB/bbb");
file2.mkdir();// 文件名不区分大小写,所以bbb会创建到bbb文件夹内

File file3 = new File("D:/AAA/CCC/bbb");
file3.mkdirs();//创建多层目录

File file4 = new File("D:/AAA/DDD");
file4.createNewFile();
// 创建的不是文件夹,而是文件。会根据调用的不同方法,创建不同类型的文件

2.4删除操作

// 删除操作
File file = new File("D:/AAA/aaa.txt");
file.delete();// 删除文件。当删除文件夹时,如果文件夹内还有文件,delete删除不掉文件夹

File file1 = new File("D:/AAA/DDD");
file1.deleteOnExit();// 当程序执行完毕退出后删除文件
 Thread.sleep(5000);// 休眠五秒

2.5 修改操作

// 修改操作
File file = new File("D:/AAA/aaa.txt");
file.createNewFile();
file.setReadable(false);//设置文件为不能读
file.setWritable(false);// 设置文件为不能写入
file.setReadOnly();//设置文件为只读
file.renameTo(new File("D:/AAA/bbb.txt"));// 重命名

2.6 查询操作

// 查询操作
File file = new File("D:/AAA/CCC/bbb/a.txt");
String name = file.getName();// 获得文件名称
System.out.println("name:"+name);
String parent = file.getParent();// 获得父级路径名称
System.out.println("parent:"+parent);
String path = file.getPath();// 获得文件路径名
System.out.println("path:"+path);
boolean file1 = file.isFile();// 判断文件对象是否为文件类型,以布尔值返回
System.out.println(file1);
boolean file2 = file.isDirectory();// 判断是否为目录类型
System.out.println(file2);

File file3 = new File("D:/AAA");
String[] list = file3.list();//列出该目录下所有子文件的名称
System.out.println(Arrays.toString(list));

File[] files = file3.listFiles();// 列出该目录下所有的文件对象
for(File f:files){
    System.out.println(f.toString());
}

经典题目:显示指定目录下的所有文件

import java.io.File;

public class Test02 {
    public static void main(String[] args) {
        showAllFiles("D:/AAA");
    }
    public static void showAllFiles(String path){
        //根据接收的路径创建文件对象
        File file = new File(path);
        // 判断该文件是否存在或者是否是目录
        if(!file.isDirectory() || !file.exists()){
            return;
        }
        // 列出该目录下所有的文件对象
        File[] files = file.listFiles();
        // 遍历数组
        for (File f:files){
            if(f.isDirectory()){
                System.out.println(f.getPath()+"  <Dir>");// 显示AAA下的目录文件
                showAllFiles(f.getPath()); //循环调用,查找所有目录
            }else {
                System.out.println(f.getPath()+" ");
            }
        }
    }
}

3 IO流

请添加图片描述

1、IO是什么?

​ I:input 输入 O:output 输出

2、IO的作用:对文件内容进行操作

输入:读操作,获得文件内容 输出:写操作,向文件内写入内容

3、IO流的分类:

(1)根据流的方向:

输入流:程序可以读取数据的流

输出流:程序可以写入数据的流

(2)根据流的单位:
字节流: 以字节为单位传输数据的流

字符流: 以字符为单位传输数据的流

(3)根据功能
节点流: 直接和文件进行交互
处理流: 不是直接作用在文件上。

四个基本的流: 其他的流都是在这四个流的基础上进行扩展的

字节输入流

字节输出流

字符输入流

字符输出流

3.1 Writer字符输出流

Writer字符输出流是所有字符输出流的根类,我们通常使用其中的FileWriter类:

mport java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test05 {
    public static void main(String[] args) throws IOException {
        // 字符输出流 -->指定文件进行操作
        Writer writer = new FileWriter("D:/AAA/d.txt");
        String str = "今天天气不错!";
        
        writer.write(str);
        writer.flush();// 刷新流
        writer.close(); // 关闭流资源
    }
}

上面每次往文件中写内容关闭文件后,再次写入内容就会把原来的内容覆盖掉。 想要保留文档中原有内容,只需要在将 Writer writer = new FileWriter(“D:/AAA/d.txt”) 改为 Writer writer = new FileWriter(“D:/AAA/d.txt”,true);

3.2Reader字符输入流

Reader字符输入流是所有字符输入流的根类 它的实现类有很多,我们使用FileReader实现类

mport java.io.FileReader;
import java.io.Reader;

public class Test06 {
    public static void main(String[] args) throws Exception {
        // 创建字符输入流对象,读取指定文件内的内容
        Reader reader = new FileReader("D:/AAA/d.txt");
        int count = 0;// 记录读取字符的个数
        char[] cs = new char[10]; // 将每次读取10个字符,并将读取到的内容存入cs数组中
        while ((count = reader.read(cs))!=-1){ //每次读取完后,会记录此次读取的结束位置,下次在读取时,会在上次结束的位置开始读取内容。当读取完所有内容后,会返回-1
            String str = new String(cs,0,count);// 从cs数组中读取内容,从0开始,到count结束
            System.out.println(str);
        }
    }
}
符的个数
        char[] cs = new char[10]; // 将每次读取10个字符,并将读取到的内容存入cs数组中
        while ((count = reader.read(cs))!=-1){ //每次读取完后,会记录此次读取的结束位置,下次在读取时,会在上次结束的位置开始读取内容。当读取完所有内容后,会返回-1
            String str = new String(cs,0,count);// 从cs数组中读取内容,从0开始,到count结束
            System.out.println(str);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值