Java的学习——泛型和Io流

1.集合的回顾

2.正文

1.泛型

2.file对象

3.Io流

3.泛型

3.1什么是泛型

1. 泛型就是限制我们得数据类型。

2.为什么使用泛型?
我们原来在定义集合时,是如下得定义方式:
        List list=new ArrayList();//该集合没有使用泛型
        list.add("java01");
        list.add("java02");

        String str= (String) list.get(0);//获取元素 需要进行强制类型转换
        System.out.println(str);
获取元素时,不方便对元素进行相应得其他操作。    

3.2 如何使用泛型

List<类型> list=new ArrayList<类型>(); 只能在该集合中存储指定得类型。

package com.666.test1;

import java.util.*;

/**
 * @unthor : YSH
 * @date : 19:50 2022/4/19
 */
public class Test1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();//这里就限制了集合中每个元素的类型
        list.add("张三");
        list.add("李四");//集合中只能添加String类型
        list.add("王五");

        String s = list.get(0);//在获取元素时 默认就是相应的数据类型 而无需在进行转换
        System.out.println(s);

        //<K,V>: K:表示键的泛型  V:表示值的泛型
        HashMap<String,Integer> map = new HashMap<>();
        map.put("age",20);
        map.put("tell",170);

        Set<String> keys = map.keySet();
        System.out.println(keys);
    }
}

3.3自己定义泛型类

定义坐标类:

 public static void main(String[] args) {
        //在创建泛型类对象时没有指定相应得泛型类型。则默认为Object类型
        Point p1=new Point();
        p1.setX(15);
        p1.setX("北纬50度");

        //这里得泛型必须都是对象类型
        Point<Integer> p2=new Point<Integer>() ;
        p2.setX(25);
        p2.setY(65);
        Integer x = p2.getX();
        Integer y = p2.getY();
        p2.show();

        Point<String> p3=new Point<>();
    }
}
class Point<T>{
     private T x;
     private T y;

     public void show(){
         System.out.println("x坐标为:"+x+";y坐标为:"+y);
     }

    public T getX() {
        return x;
    }

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

    public T getY() {
        return y;
    }

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

4.File对象

4.1File类

4.1.1File类简介

File 类 就是当前系统中 文件或者文件夹的抽象表示
    
通俗的讲  就是 使用File对象 才操作我们电脑系统中的文件或者文件夹

学习File类 其实就是学习 如何通过file对象 对系统中的文件/文件夹进行增删改查

4.1.2Flie对象创建

1 前期准备
1 前期准备
    在电脑的非系统盘 创建一个 test文件夹 今天所有的操作都在这个文件夹中

2 创建
    @Test
    public void test() {

        /*  path 路径
          Creates a new <code>File</code> instance by converting the given
          pathname string into an abstract pathname.  If the given string is
          the empty string, then the result is the empty abstract pathname
          File(String) 参数为String类型的目标文件路径名
         */
        File file = new File("D:\\aaa\\123.txt");

        /*  路径分割符
         *  D:\yyy\666\123.mp4    称之为路径  其中 \ 就是路径分割符 代表的是 下级目录
         *  在windows系统中 路径分割符为  \   在 Linux 和 Mac 中 路径分割符是 /
         *  我们写的java代码  需要跨平台 多环境运行   开发环境:windows   生成环境:Linux
         *  此时就会出现一个问题  如果我们的路径分隔符 写成 \  在 windows中好使 到了 Linux就不识别
         *  所以我们可以使用以下两种方式解决:
         *
         * */
        /* 方式1 :  windows不仅支持 \ 还支持/ */
        File file1 = new File("D:/aaa/666.txt");

        /* 方式2:   使用动态识别的常量  */
        // ;
        System.out.println(File.pathSeparator);
        // \ 
        System.out.println(File.separator);
       
        File file2 = new File("D:" + File.separator + "aaa" + File.separator + "123.txt");
    }

4.1.3增加操作

package com.666.test2;

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

/**
 * @unthor : YSH
 * @date : 20:03 2022/4/19
 */
public class Test {
    public static void main(String[] args) throws IOException {
        File file1 = new File("D:/0419AAA/666.txt");//创建file对象
        file1.createNewFile();//创建相应的文件

        File file02 = new File("D:/0419AAA/6969");
        file02.mkdir();//创建目录 make directory

        File file03 = new File("D:/0419AAA/6969/6666");
        file03.mkdirs();//创建多层目录

        File file04 = new File("D:/0419AAA/666");
        file04.createNewFile();
        //根据你调用的方法不同  而创建不同的类型
    }
}

4.1.4删除操作

package com.666.test2;

import java.io.File;

/**
 * @unthor : YSH
 * @date : 20:15 2022/4/19
 */
public class Test2 {
    public static void main(String[] args) throws InterruptedException{
        File file01 = new File("D:/0419AAA/666.txt");
        file01.delete();//删除文件

        File file02 = new File("D:/0419AAA/666");
        file02.deleteOnExit();//当程序退出后 删除
        Thread.sleep(5000);//休眠5秒

        File file03 = new File("D:/0419AAA/6969/6666");
        file03.delete();//删除空目录(当前目录为空才可以删除)
    }
}

4.1.5修改操作

package com.666.test2;

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

/**
 * @unthor : YSH
 * @date : 20:23 2022/4/19
 */
public class Test3 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:/0419AAA/Y.txt");
        file.createNewFile();
        //file.setReadable(false);//设置该文件的权限为不能读
        //file.setWritable(false);//设置该文件得到权限为不能写
        //file.setReadOnly();//设置只读的权限


        file.renameTo(new File("D:/0419AAA/YY.txt"));//重命名
    }
}

 4.1.6查询操作

package com.666.test2;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * @unthor : YSH
 * @date : 20:33 2022/4/19
 */
public class Test4 {
    public static void main(String[] args){
        File file = new File("D:/0419AAA/6969/YYY/CCC.txt");

        String name = file.getName();//得到文件的名字
        System.out.println("name======"+name);
        File parentFile = file.getParentFile();//得到父级路径的名称
        System.out.println("parentFile======"+parentFile);
        String path = file.getPath();//得到文件的路径名称
        System.out.println("path======"+path);

        boolean f1 = file.isFile();//判断该文件对象是否为文件类型
        System.out.println("f1======"+f1);
        boolean f2 = file.isDirectory();//判断该文件对象是否为目录类型
        System.out.println("f2======"+f2);

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

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

运行结果:

 4.1.7经典题目:用的方法是递归调用

package com.666.test2;

import java.io.File;

/**
 * @unthor : YSH
 * @date : 20:47 2022/4/19
 */
public class Test5 {
    public static void main(String[] args) {
        showAllFiles("D:/AAA_0419");
    }

    private 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()+"");
            }
        }
    }
}

运行结果:

5.Io流

1. IO 表示有两个单词的缩写。
  I: Input 输入   O: Output 输出

2. IO的作用:就是对文件中的内容进行操作。
  输入: 读操作(读取文件的内容)   输出: 写操作(往文件中写内容)
 
3. IO流的分类:

 (1)根据流的方向:
    ---输入流: 程序可以从中读取数据的流。
    ---输出流: 程序能向其中写入数据的流。
    
 (2)根据流的单位:
    ---字节流: 以字节为单位传输数据的流
    ---字符流: 以字符为单位传输数据的流
 
 (3)根据功能
    ---节点流: 直接和文件进行交互
    ---处理流: 不是直接作用在文件上。
    
四个基本的流: 其他的流都是在这四个流的基础上进行扩展的
        字节输入流
        字节输出流
    
        字符输入流
        字符输出流

5.字符流

 5.1Writer字符输出流

它是所有字符输出流的跟类。---FileWriter类

package com.666.test3;

import java.io.FileWriter;
import java.io.Writer;

/**
 * @unthor : YSH
 * @date : 21:07 2022/4/19
 */
public class Test1 {
    public static void main(String[] args) throws Exception{
        //字符输出流 ---指定对那个文件 (路径) 进行写操作
        Writer writer = new FileWriter("D:/0419AAA/S.txt");

        String str ="hello AAA 今天要下雨";
        writer.write(str);

        writer.flush();//刷新流
        writer.close();//关闭流资源
    }
}

 上面每次往文件中写内容时 就会把原来的内容覆盖了。 如何追加内容

package com.666.test3;

import java.io.FileWriter;
import java.io.Writer;

/**
 * @unthor : YSH
 * @date : 21:18 2022/4/19
 */
public class Test2 {
    public static void main(String[] args) throws Exception{
        //字符输出流 ---指定对哪个文件(路径)进行写操作
        //true:表示允许追加内容到文件中
        Writer writer = new FileWriter("D:/0419AAA/S.txt",true);

        String str ="明天是晴天";
        writer.write(str);

        writer.flush();//刷新流
        writer.close();//关闭流资源
    }
}

5.2Reader字符输入流

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

5.3完成文件内容的复制

要求:从 "D:/AAA0420/a.txt"复制到"C:/AAA0420/a.txt"

/*
     完成文件内容的复制功能
     */ 

@Test
    public void FZ() throws Exception{
        //1.创建一个字符输入流
        FileReader fr =new FileReader("D:/AAA0420/a.txt");
        //2.创建一个字符输出流
        FileWriter fw = new FileWriter("C:/AAA0420/a.txt");

        int c = 0;//读取到字符的个数
        char[] cs =new char[10];//每次读取的内容放入该数组中

        while ((c=fr.read(cs)) !=-1){
            fw.write(cs,0,c);
            fw.flush();
        }
        fw.close();
        fr.close();
    }

大家思考: 咱们能不能复制一个电影 图片 压缩文件等 上面的字符流没法对图片和电影 或压缩文件等进行操作。 它只能对文本进行操作。 因为视频图片 这些都属于二进制。 

6.字节流

6.1字节输出流--OutputStream

它可以对任意文件进行操作,对文件进行输出操作。以字节为单位。 它是所有字节输出流的父类,
FileOutputStream 


 //测试字节输出流
    @Test
    public void testOutStream() throws Exception{
        OutputStream outputStream = new FileOutputStream("D:/AAA0420/b.txt");
        String str = "abcd";
        //把字符串转换为字节数组
        byte[] bytes = str.getBytes();

        outputStream.write(bytes);

        outputStream.flush();
        outputStream.close();
    }

6.2字节输入流--InputStream

它可以对任意文件进行读操作 ,以字节为单位,它是所有字节输入流的父类子类有FileInputStream

//字节输入流
    @Test
    public void testInputStream() throws Exception{
        InputStream is = new FileInputStream("D:/AAA0420/b.txt");

        byte [] bytes = new byte[3];
        int c = is.read(bytes);//一次读取三个字节 并把读取的内容放入字节数组中 返回读取到的字节的个数
        System.out.println(bytes+"==========>个数:"+c);
        c = is.read(bytes);//一次读取三个字节 并把读取的内容放入字节数组中 返回读取到的字节的个数
        System.out.println(bytes+"==========>个数:"+c);
        c = is.read(bytes);//一次读取三个字节 并把读取的内容放入字节数组中 返回读取到的字节的个数
        System.out.println(bytes+"==========>个数:"+c);
        is.close();

    }
    //如果文件内容非常大  使用循环来读取
    @Test
    public void testInputStream2() throws Exception{
        InputStream is =new FileInputStream("D:/AAA0420/b.txt");
        byte[] bytes = new byte[300];
        int c=0;//d读取到的个数
        while((c= is.read(bytes))!=-1){
            //把byte数组转化为字符串
            String str = new String(bytes,0,c);
            System.out.println(str);
        }
        is.close();
    }

6.3使用字节输入和输出流完成文件的复制功能

 @Test
    public void testCopy() throws Exception{
        //1.创建字节输入流
        InputStream is = new FileInputStream("D:/AAA0420/666.jpg");
        //2.字节输出流
        OutputStream fos = new FileOutputStream("C:/AAA0420/66.jpg");
        byte[] bytes = new byte[10];
        int c=0;
        while ((c=is.read(bytes)) !=-1 ){
            fos.write(bytes,0,c);
        }
        is.close();
        fos.close();
    }

7.缓存流

缓存流是在基础流[InputStream OutputStream Reader Writer]之上 添加了一个缓存池功能.
BufferInutStream  BufferOutputStream BufferReader  BufferWriter 提高IO的效率,降低IO的次数。

  @Test
    public void TestBuffer() throws Exception{
        OutputStream out = new FileOutputStream("D:/AAA0420/c.txt");
        BufferedOutputStream bos = new BufferedOutputStream(out);//缓存流要作用在基础流上
        String str ="abcdefghijk";
        byte[] bytes = str.getBytes();
        bos.write(bytes); //因为你写的内容 暂时放入缓存池中  并没有直接放入文件中。 所以文件中没有你的内容。
        //bos.flush();//刷新缓存池---把池子中的内容输入到文件上
        bos.close(); //关闭----先刷新缓冲池 再关闭流资源
    }

8.对象流--对Java对象进行IO操作

为什么需要对象流
  我们现在操作IO流的时候 都是将字符串读写操作 可不可以将java对象在文件中进行读写呢? 可以的 Student st=new Student();对象
  将java对象进行读写操作 意义在于持久化信息  例如: 游戏存档。
 
   //  因为运行的时候 所有的数据都是在运行内存中的   持久化 将运行内存的数据 保存到硬盘上    存档(写)  读档(读)

package com.666.test1;

import org.junit.Test;

import java.io.*;

/**
 * @unthor : YSH
 * @date : 19:45 2022/4/20
 */
public class DemoTest2 {

    @Test  //存档: ----列序化
    public void testObjectStream() throws Exception{
        OutputStream out = new FileOutputStream("D:/AAA0420/d.txt");
        //对象输出流
        ObjectOutputStream oos = new ObjectOutputStream(out);

        //使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口
        Role r = new Role("吕布","7级",001,"大战三英");
        oos.writeObject(r);
        oos.close();
    }

    //测试 读档: ----反序列化:
    @Test
    public void testObjectStream2() throws Exception{
        InputStream input = new FileInputStream("D:/AAA0420/d.txt");
        ObjectInputStream ois = new ObjectInputStream(input);
        Object o = ois.readObject();

        System.out.println(o);
        ois.close();
    }

}

 1. 序列化: 把内存中的java对象存储到磁盘[网盘]的过程。
         ---java对象所属的类必须实现序列化接口.implements Serializable
2. 反序列化: 把磁盘中的内容读取到java对象内存中的过程。

9.总结

 1.  通过字符流完成文件的复制---->它只能复制文本文件
2.  字节流:---字节输入流和字节输出流。
3.  字节流 我们也可以完成文件的复制功能---它可以复制任意类型的文件.
4.  缓存流--->它基本流的基础上 添加了一个缓存池
5.  对象流: ObjectInputStream  ObjectOutputStream
     序列化:把内存中的java对象存储到磁盘[网盘]的过程。
         ---java对象所属的类必须实现序列化接口.implements Serializable
     反序列化:把磁盘中的内容读取到java对象内存中的过程。

本章内容到此结束,谢谢观看!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值