初学者关于泛型、File对象、IO流

本文详细介绍了Java中的泛型,包括其概念、使用原因及如何使用。接着讨论了File对象,包括其功能、创建与操作方法,并给出了一个展示目录结构的面试题。最后,深入探讨了IO流的分类和不同流的功能,如字符流、字节流、处理流以及对象流,并展示了文件复制的实例。
摘要由CSDN通过智能技术生成

目录

1.泛型

        1.1什么是泛型

        1.2为什么使用

        1.3如何使用泛型     

2、File对象

        2.1介绍File对象

        2.2File对象的使用

        2.3基于上述讲解的面试题

3、IO流

        3.1  IO流的分类

        3.2介绍不同流的功能作用


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对象内存的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值