JAVA——文件(File)对象与IO流

1、File对象

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

        File类 其实就是通过file对象,我们可以对系统中的文件或是文件夹进行增加、删除、修改、查询的操作。

2、File对象的使用

2.1 创建File对象

        在创建File对象前我们要准备好要操作的文件夹,然后创建File对象。

        在创建对象时,要注意的是,不同的系统它的目录层级是不同的 。在window系统下层级分割符为\ ,但是在linux和mac系统上分割符为 /。
        但是Java语言是一种跨平台的语言。我们在window系统上做开发,但是我们项目部署在linux系统上。这样使我们的代码能在任意系统下来用。

       对于分隔符我们有两种解决办法
       (1)第一种 因为window 兼容 / 和 \

        (2)第二种 File.separator根据当前代码所在得系统自动获取相应得分割符 3

 public static void main(String[] args) {
        //创建一个File对象 并指定文件得路径  \转移字符串
        //第一种Windows通用两种分隔符
        File file01 = new File("D:\\AAA\\aaa.txt");
       
        File file02 = new File("D:/AAA/bbb.txt");


        // 第二种 File.separator根据当前代码所在得系统自动获取相应得分割符 

        System.out.println(File.separator); // \因为我们当前在window下
        File file03 = new File("D:"+File.separator+"AAA"+File.separator+"ccc.txt");


    }

 2.2 添加文件

        //创建文件对象
        File file = new File("F:/AAA/a.txt");
        //添加文件操作
        file.createNewFile();

        File file2 = new File("F:/AAA/bbb");
        file2.mkdir();//创建单层文件夹

        File file3 = new File("F:/AAA/bbb/ccc");
        file3.mkdirs();//创建多层文件夹

2.3 删除操作

        //创建文件对象
        File file = new File("F:/AAA/a.txt");
        //删除操作
        file.delete();//删除文件,同时可以删除空的文件夹
        file3.deleteOnExit();//程序退出时删除文件

2.4 修改文件

        //创建文件对象
        File file = new File("F:/AAA/a.txt");        
        //创建文件对象
        File file = new File("F:/AAA/a.txt");
        //修改操作
        file.setReadable(false);//修改能否打开文件的权限
        file.setWritable(false);//修改能否修改文件中的内容的权限
        file.setReadOnly();//修改文件为只读
        file.renameTo(new File("D:/AAA/aaa.txt"));//给文件重命名

2.5 查询文件

        //创建文件对象
        File file = new File("F:/AAA/a.txt");       
        //查询操作
        String name = file.getName();//获取文件名称
        String parent = file.getParent();//获取父级的名称
        String path = file.getPath();//获取路径
        System.out.println(name + " "+ parent+" "+path);
        boolean f1 = file.isFile();//是否为文件类型
        boolean f2 = file.isDirectory();//是否为文件夹类型
        System.out.println(f1 + " "+f2);

3、IO流

3.1 IO流概念

        IO( I: Input 输入   O: Output 输出)流,是一种计算机用语。主要是用于处理数据的传输。

        输入流:程序对文件中内容进行读取操作,就是读取文件的内容。

        输出流:程序对文件的内容进行写入操作,就是往文件中写入内容。

3.2 IO流的分类

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

 3.3 字符输出流——Writer

        Writer字符输出流它是所有字符输出流的根类,主要实现类为FileWriter。

        FileWriter使用步骤:

        1)创建FileWriter对象,并指定要操作文件的路径。

        2)使用write方法进行写入操作。

        3)写入操作完成后,必须使用flush()方法刷新和close()关闭流资源。

注:每次使用write方法往文件中写入内容时,都会覆盖文件中原有的内容。如果想追加内容,就在创建对象时在构造方法中,传一个true,这样就是追加内容,不是覆盖了。

        Writer writer =new FileWriter("F:/AAA/a.txt");
        writer.write("今天真是个好天气");
        writer.flush(); //刷新流
        writer.close(); //关闭流资源

        Writer writer1=new FileWriter("F:/AAA/a.txt",true);//可追加文字,不会覆盖
        writer1.write("很适合出去玩耍呢!!");
        writer1.flush(); //刷新流
        writer1.close(); //关闭流资源

3.4 字符输入流——Reader

        Reader字符输入流数所有字符输入流的根类,主要的实现类为FileReader。

        FileReader主要方法,read()方法。读取下一个文件中的字符,返回的是字符对应的ASSIC码,如果没有下一个,返回的是-1。

        read(char [ ] )这个方法,读取多个字符并存储在传入的数组中,返回的是读取了几个字符(int类型)。

     Reader reader = new FileReader("F:/AAA/a.txt");
        int count =0;
        char [] dataArr = new char[10];
        while ((count = reader.read(dataArr))!=-1){
            System.out.println(new String(dataArr,0,count));
        }

来利用字符流实现复制功能

    @Test
    public void test() throws Exception {
        //创建输入流对象
        FileReader fr = new FileReader("F:/AAA/a.txt");
        //创建输出流对象
        FileWriter fw =new FileWriter("F:/AAA/e.txt");
        int count = 0;
        char [] cs = new char[5];
        while( (count=fr.read(cs)) !=-1 ){
            fw.write(cs,0,count);
            fw.flush(); //刷新
        }
        fw.close();
        fr.close();
    }

         由此可见字符流只能对文件的文本进行操作,不能对图片、视频、压缩包等文件进行操作。

3.5 字节输出流——OutputStream

        字节流在操作文件时,是将文件转换成以字节为单,所以它可以对任意类型的文件进行操作。OutputStream时都有字节输出流的父类,他是一个抽象类无法实例化对象,我们常用的实现类为FileOutputStream。

    @Test
    public void test2() throws IOException {
           //创建字节流对象
        OutputStream os=new FileOutputStream("F:/AAA/d.txt");
        String str="大家好,我是张三!!";
        //创建数组,将字符串转换成字节
        byte[] bytes = str.getBytes();
        os.write(bytes);
        os.flush();//刷新
        os.close();//关闭
    }

3.6 字节输入流——InputStream

        与字节输出流同理,字节输入流也可以对所有的文件进行操作,它作为所有字节输入流的父类,是一个抽象类所以无法创建对象,我们常用的字节输入流为:FileInputStream

    @Test
    public void test3() throws IOException {
        //创建输入流对象
        InputStream is = new FileInputStream("F:/AAA/d.txt");
        //创建数组,用来存放读取的字节
        byte [] bytes =new byte[3];
        int count=0;
        //读取的字节存入数组中
        while( (count=is.read(bytes))!=-1 ){
            //转换成字符串,并输出
            String str=new String(bytes,0,count);
            System.out.print(str);
        }
        is.close();
    }

利用输入流实现文件的复制功能

    @Test
    public void testCopy() throws Exception{
            //1.创建字节输入流 视频
            InputStream is=new FileInputStream("D:/AAA/1.jpg");
           //2.字节输出流
           OutputStream fos=new FileOutputStream("C:/AAA/2.jpg");
           byte[] bytes=new byte[10];
           int c=0;

           while( (c=is.read(bytes)) !=-1 ){
                 fos.write(bytes,0,c);
           }

           is.close();
           fos.close();
    }

3.6 缓存流

                缓存流是在基础流[InputStream OutputStream Reader Writer]之上 添加了一个缓存池功能。即无论时在输入或是输出时,将数据存在缓存池中,并不是直接作用于文件上,这样对于频繁使用IO流的程序来说可以提高IO流的效率,减少IO流次数。

    @Test
    public void TestBuffer() throws Exception{
          OutputStream out=new FileOutputStream("D:/AAA/g.txt");
          BufferedOutputStream  bos=new BufferedOutputStream(out);//缓存流要作用再基础流上
          String str="abcdefhijglmn";
          byte[] bytes = str.getBytes();
          bos.write(bytes); 
          //bos.flush();//刷新缓存池---把池子中的内容输入到文件上
            bos.close(); //关闭----先刷新缓冲池 再关闭流资源
    }

        如果在程序中没有刷新缓存池或是没有关闭流资源,在程序运行结束后,在文件中是看不到所写的内容的,因为你写的内容,暂时放入缓存池中 ,并没有直接放入文件中。 所以文件中没有你的内容。 因此,在程序运行结束时,必须关闭流资源。

3.7 对象流

在上面的IO流中都是对文件中的数据进行读写操作,而对象流,是对Java对象进行的读写操作。将Java对象进行读写操作意义在于,持久化信息。实例应用中:游戏的读档和存档

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

1、对象输出流——ObjectOutputStream

    @Test //存档:----序列化:
    public void testObjectStream() throws Exception{
        OutputStream os=new FileOutputStream("F:/AAA/ccc/b.txt");
        //对象输出流
        ObjectOutputStream oos=new ObjectOutputStream(os);

        //使用对象输出流调用输出方法 输出的类对象 该类必须实现Serializable 序列化接口
        People people=new People("张三",23,"男","打游戏、打篮球、打乒乓球");
        oos.writeObject(people);
        oos.close();
    }

2、对象输入流——ObjectInputStream

    @Test //读档: ----反序列化:
    public void testObjectStream2()throws Exception{
        InputStream input=new FileInputStream("F:/AAA/ccc/b.txt");
        ObjectInputStream ois=new ObjectInputStream(input);
        Object o = ois.readObject();

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

4、总结

字符流:我们是对文件中的字符串进行操作。字符流只能对文本文件进行读取操作。

字节流:字节流可以将文件内容转化为字节,所以字节流可以定义任意的文件类型进行操作。

缓存流:缓存流是在基础流的基础上添加了缓存池的功能,即读取的内容先存在缓存池中,当程序执行完毕是,再将内容写进文件中,减少了IO操作次数。

对象流:对象流是对Java对象进行读取操作,即序列化和反序列化。

注:再每种流使用完毕后都必须要进行关闭流资源操纵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值