java学习第13天

java学习第13天

IO

Input输入、Output输出

信息需要永久保存(持久化),一般用文件的形式把文件保存到磁盘。

程序运行需要一些基本的配置信息,这种配置信息也是保存在磁盘的文件中。

程序从磁盘上读取文件,就称为Input,把文件写到磁盘,就称为Output。(参考位置是内存)

在这里插入图片描述

Java.io下的类分类

按输入和输出的方向划分:

  • 输入

    Input、Reader

  • 输出

    Output、Writer

按照数据的格式划分:

  • 字节流(二进制文件,如:exe、offce、图片、视频·、音频)

    Stream、

  • 字符流(文本文件,如:txt、程序源代码文件、html)

    Reader、Writer

File类

跟磁盘上的文件或者目录关联,读写文件时就用file对象。

常用方法:

//创建文件对象,参数是文件的路径和名称
        //文件路径分隔符可以用\\ 或 /
        //不管文件是否存在,都会创建一个File对象
        File file = new File("D:\\BaiduNetdiskDownload\\games\\测试.txt");
        File file1 = new File("D://");
        //判断文件是否存在,存在返回true,不存在返回false
        System.out.println(file.exists());
        //返回File对象的文件名(不包含路径)
        System.out.println(file.getName());

        //返回文件对象关联的path是否是一个文件
        System.out.println(file.isFile());
        System.out.println(file1.isFile());
        //判断文件对象关联的路径是否是一个目录
        System.out.println(file.isDirectory());
        System.out.println(file1.isDirectory());

        //返回文件最后一次修改的时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
        System.out.println(sdf.format(new Date(file.lastModified())));

        //返回文件内容的字节长度,若文件不存在则返回0.
        System.out.println(file.length());

        //文件重命名
        //System.out.println(file.renameTo(new File("D:\\BaiduNetdiskDownload\\games\\解压码.txt")));

        File file2 = new File("C:\\Users\\hanhan\\Desktop\\新建文本文档.txt");
        //删除文件
        System.out.println(file.delete());

        //列出目录下的所有文件和目录
        File[] files = file1.listFiles();
        System.out.println(Arrays.toString(files));
        System.out.println(files.length);

        //创建新目录,不存在就创建,如果以及存在就不再重复创建
        file.mkdir();
练习

递归打印出文件夹

    public static void main(String[] args) {
        dir(new File("D:\\BaiduNetdiskDownload"), "");
    }

    private static void dir(File file, String tab) {
        tab += "\t";
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                System.out.println(tab + f.getName());
                dir(f, tab);
            }
        }
    }

FileInputStream

以二进制的方式读取文件

  • read(byte[] bytes)把文件内容读入到字节数组,读取到内容返回字节的长度,如果没有内容返回-1.
 FileInputStream fis = null;
        try {
            fis = new FileInputStream("d:\\Hello.java");
            byte[] bytes = new byte[32];
            int count = fis.read(bytes);
            while (count != -1){
                System.out.print(new String(bytes));
                bytes = new byte[32];
                count = fis.read(bytes);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

FileOutputStream

FileOutputStream fos =null;
        try {
            fos = new FileOutputStream("D:\\data.txt");
            String str = "Hello Word";
            fos.write(str.getBytes());
            fos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
练习:实现一个copy文件的功能

一个FileInputStream对象读文件

把读到的字节数组写入到另一个FileOutputStream对象

**注意:**写的时候用fos.write(bytes,0,count);避免把数组中的最后一次多余的字节写到文件中

FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis =  new FileInputStream("D:\\19wlwlpf\\Snipaste_2022-08-05_16-31-04.png");
            fos = new FileOutputStream("D:\\19wlwlpf\\New.png");
            byte[] bytes = new byte[1024];
            int count = fis.read(bytes);
            while (count != -1){
                //第一个参数是字节数组,第二个参数是数组下标的起始位置,第三个参数是这一次实际读到的字节数(要写的字节长度)
                //避免最后一次读的时候数组的内容没有读满,后面的无效字节就不会写到文件中去。
                fos.write(bytes,0,count);
                count = fis.read(bytes);//继续读下一段字节
            }
            System.out.println("复制完成");

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

BufferedReader

带有缓存的读字符流的类,主要用于读文本类型的文件

  • ReadLine()读取一行内容,如果读到文件结尾,则返回null。
package com.hqyj.FileDemo;

import java.io.*;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        BufferedReader bfr =null;
        try {
            bfr = new BufferedReader(new FileReader("D:\\idea\\javaseprojects\\java_HQYJ_Day13\\src\\Data01"));
            //如果文件有内容,就返回当前行的内容,如果读到文件结束,就返回null
            String line = bfr.readLine();
            while (line != null){
                System.out.println(line);
                line = bfr.readLine();//更新line
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bfr != null){
                try {
                    bfr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

BufferedWriter

带有缓存的写文本内容的类,用于写纯文本文件。

  • write() 写字符串
  • newLine() 回车换行

提示:如果文本文件中的内容用逗号分隔,文件名命名为.csv,这种文件可以用excel直接打开显示为表格)

package com.hqyj.FileDemo;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
    public static void main(String[] args) {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new FileWriter("D:\\idea\\javaseprojects\\java_HQYJ_Day13\\src\\Data02"));
            bw.write("张三,22,男");
            bw.newLine();//回车换行
            bw.write("李四,23,女");
            bw.flush();
            System.out.println("写入成功");

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(bw != null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值