回顾Java知识点,面试题汇总Day10:日期类、IO流(持续更新)

实用类

一、日期类

1.1 Date

|----|---------------------|
| 标记 | 描述 |
| y | 年,yyyy表示4位数的年份 |
| M | 月,MM表示2位数的月份 |
| d | 天,dd表示2位数的天数 |
| H | 小时,HH表示2位数的24小时制的时间 |
| h | 小时,hh表示2位数的12小时制的时间 |
| m | 分钟,mm表示2位数的分钟数 |
| s | 秒,ss表示2位数的秒数 |

java 复制代码
package com.date;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);
        //格式化日期
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(new Date()));
    }
}
J

1.2 Calendar

|--------------------------------------|---------|
| 常量 | 描述 |
| public static final int YEAR | 年 |
| public static final int MONTH | 月 |
| public static final int DAY_OF_MONTH | 天,以月为单位 |
| public static final int DAY_OF_YEAR | 天,以年为单位 |
| public static final int HOUR_OF_DAY | 小时 |
| public static final int MINUTE | 分钟 |
| public static final int SECOND | 秒 |
| public static final int MILLISECOND | 毫秒 |

|--------------------------------------|----------------------|
| 方法 | 描述 |
| public static Calendar getInstance() | 获取系统对应的Calendar实例化对象 |
| public void get(int field,int value) | 给静态常量赋值 |
| public int get(int field) | 取出静态常量 |
| public final Date getTime() | 获取Calendar对应的Date对象 |

java 复制代码
package com.date;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        //今天所在的周是今年的第几周
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,2026);
        //月份从0开始算
        calendar.set(Calendar.MONTH,4);
        calendar.set(Calendar.DAY_OF_MONTH,28);
        System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));

        //今天之后的52天日期
        int i = calendar.get(Calendar.DAY_OF_YEAR);
        calendar.set(Calendar.DAY_OF_YEAR , (i+52));
        Date time = calendar.getTime();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(simpleDateFormat.format(time));


    }
}

二、IO流

2.1 File类

|------------------------------------|----------------|
| 方法 | 描述 |
| public File(String path) | 根据路径创建文件对象 |
| public String getName() | 获取文件名 |
| public String getParent() | 获取文件所在的目录 |
| public File getParentFile() | 获取文件所在的目录对应的文件 |
| public String getPath() | 获取文件路径 |
| public boolean exists() | 判断对象是否存在 |
| public boolean isDirectory() | 判断对象是否为目录 |
| public boolean idFile() | 判断对象是否为文件 |
| public long length() | 获取文件的大小 |
| public boolean createNewFile() | 根据当前对象创建文件 |
| public boolean delete() | 删除对象 |
| public boolean mkdir() | 创建文件夹 |
| public boolean renameTo(File file) | 为已存在的文件重命名 |

java 复制代码
package com;

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

public class IOTest {
    public static void main(String[] args) {
        File file = new File("D:\\java\\test.txt");
        System.out.println(file);
        if (file.exists()) {
            System.out.println(file + "文件存在");
            System.out.println(file.getName()); //获取文件名
            System.out.println(file.getPath());//获取文件路径
            System.out.println(file.getParent());//获取文件所在的目录
            System.out.println(file.isFile());//判断是否为文件
            File file1 = new File(file.getParent());
            System.out.println(file1.isDirectory());//判断是否为目录
            System.out.println(file.length());//获取文件长度,以字节为单位
        }else {
            System.out.println(file + "文件不存在,请创建");
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

2.2 字节流

  • 按方向分,分为输入流和输出流
  • 按单位分,分为字节流和字符流

输入字节流 InputStream

|-------------------------------------------------|-------------------------|
| 方法 | 描述 |
| public int read() | 以字节为单位读取数据,一次读一个字母 |
| public int read(byte\[\] bytes) | 将数据存入byte数组,返回数据长度 |
| public int read(byte\[\] bytes,int off,int len) | 将数据存入byte数组的指定区间,返回数据长度 |
| public int available() | 返回当前数据流中未读取的数据个数 |
| public void close() | 关闭数据流 |

InputStream是抽象类,不能直接使用,使用其子类 FileInputStream

java 复制代码
package com;

import java.io.*;

public class InputStreamTest {
    public static void main(String[] args) throws Exception {
        InputStream inputStream = new FileInputStream("D:\\java\\test.txt");
//        System.out.println(inputStream.read()); //读取第一个  注释掉,不注释掉的话,这里读了第一个,for循环里读出来的就会少一个,读完了,返回-1
        File file = new File("D:\\java\\test.txt");
        long length = file.length();
        for (long i = 0; i < length; i++) {
            System.out.println(inputStream.read());
        }

        System.out.println("---------------------------------");
         inputStream = new FileInputStream("D:\\java\\test.txt");
         int temp = 0;
         while((temp = inputStream.read()) != -1){
//             System.out.println(inputStream.read());//相当于读了两次,文件中存储abcdef,最后只会输出bdf的值
             System.out.println(temp);
         }
    }
}
java 复制代码
package com;

import java.io.*;

public class InputStreamTest {
    public static void main(String[] args) throws Exception {
        InputStream inputStream = new FileInputStream("D:\\java\\test.txt");
//        byte[] bytes = new byte[3]; //数组长度为3
//        int length1 = inputStream.read(bytes); //将数据存入byte数组,返回数据长度   97,98,99
        byte[] bytes = new byte[6]; //数组长度为6
        int length1 = inputStream.read(bytes,2,3); //将数据存入byte数组的指定区间,返回数据长度   0,0,97,98,99
        System.out.println(length1);
        for(byte abytes : bytes){
            System.out.println(abytes);
        }
        inputStream = new FileInputStream("D:\\java\\test.txt");
        int temp = 0;
        System.out.println(inputStream.available());
        while((temp = inputStream.read()) != -1){
            System.out.println(temp);
            System.out.println(inputStream.available());//读一次输出一次   全部读完,返回0
        }
        inputStream.close();
    }
}

输出字节流 OutputStream

|-----------------------------------------------|-------------------|
| 方法 | 描述 |
| public void write(int b) | 以字节为单位写数据 |
| public void write(byte\[\] b) | 将byte数组中的数据写出 |
| public void write(byte\[\] b,int off,int len) | 将byte数组中指定区间的数据写出 |
| public void close() | 关闭数据流 |

java 复制代码
package com;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class OutputStreamTest {
    public static void main(String[] args) throws Exception {
        OutputStream outputStream = new FileOutputStream("D:/java/test2.txt");
//        outputStream.write(99);//会转换成对应的字母"c"进行存储。下一次写入的数据会覆盖当前写入的数据
        byte[] bytes = {97,98,99,100,101,102,103};
//        outputStream.write(bytes); //写入abcdefg
        outputStream.write(bytes,2,3); //写入cde
        outputStream.close();
    }
}

2.3 文件复制(字节流)

java 复制代码
package com;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;


public class FileCopyTest {
    public static void main(String[] args)  throws Exception{
        InputStream inputStream = new FileInputStream("D:/java/test.txt");
        OutputStream outputStream = new FileOutputStream("D:\\java\\test3.txt");
        //方式1 :数据量大时,效率低
//        int temp = 0;
//        while((temp = inputStream.read()) != -1){
//            outputStream.write(temp);
//        }
        //方式2
//        byte[] bytes = new byte[6]; //明确知道文件的长度
//        inputStream.read(bytes);
  //      outputStream.write(bytes);

        byte[] bytes1 = new byte[1024]; //不知道文件长度,直接写1024,大于1024,继续加
        int length = inputStream.read(bytes1);
        outputStream.write(bytes1,0,length); //只写文件的长度,多余的空间不使用空格占位

        inputStream.close();
        outputStream.close();
    }
}

2.4 字符流

输入字符流 Reader

|-------------------------------------------------|-------------------------|
| 方法 | 描述 |
| public int read() | 以字符为单位读取数据,一次读一个 |
| public int read(char\[\] chars) | 将数据读入char数组,并返回数据长度 |
| public int read(char\[\] chars,int off.int len) | 将数据读入char数组指定区间,并返回数据长度 |
| public void close() | 关闭数据流 |

当被读取的内容是英文或数字、符号,字节流和字符流输出结果一致。

因为英文一个字符就是一个字节

汉字一个字符是3个字节

java 复制代码
package com;

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

public class ReaderTest {
    public static void main(String[] args) throws Exception {
        Reader reader = new FileReader("D:\\java\\test3.txt");
//        System.out.println(reader.read());
        //输出文件中所有字符的ASCII码
//        int temp = 0;
//        while((temp = reader.read() )!= -1){
//            System.out.println(temp);
//        }

        char[] chars = new char[1024]; //多余的都会用空格占用输出
        int length = reader.read(chars,0,4);
        System.out.println(length);
        for(char achar : chars){
            System.out.println(achar);
        }
        reader.close();
    }
}

输出字符流 Writer

|---------------------------------------------------|--------------------|
| 方法 | 描述 |
| public void write(int c) | 以字符为单位写数据,一次写一个 |
| public void write(char\[\] chars) | 将char数组中的数据写入 |
| public void write(char\[\] chars,int off,int len) | 将char数组指定区间的数据写入 |
| public void write(String str) | 将String类型的数据写入 |
| public void write(String str,int off,int len) | 将String数组指定区间的数据写入 |
| public void close() | 关闭数据流 |

java 复制代码
package com;

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

public class WriterTest{
    public static void main(String[] args) throws Exception{
        Writer writer = new FileWriter("D:\\java\\test2.txt");
        writer.write(97);//输出c
        char[] chars = {'测','试','数','据'};
        writer.write(chars);//输出"测试数据"
        writer.write(chars,2,1);//输出 数
        String str = new String("字符串数据");
        writer.write(str);//输出  字符串数据
        writer.write(str,1,3);//输出符串数
        writer.close(); //要关闭数据流,不然无法写入数据

    }


}

2.5 文件复制(字符流)

java 复制代码
package com;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;

public class FileReaderWriterTest {
    public static void main(String[] args) throws Exception{
        //字符流复制
        Reader reader = new FileReader("D:\\java\\test2.txt");
        Writer writer = new FileWriter("D:/java/copy.txt");
       int temp = 0;
       while((temp = reader.read()) != -1){
            writer.write(temp);
       }
       reader.close();
       writer.close();
    }
}

如果文件中存储英文、数字或符号,字节流文件复制和字符流文件复制效率是一样的,如果存储的是汉字,字符流的效率是字节流复制的三倍。(一个汉字等于3字节)

复制图片时,使用字节流。

如果使用字符流,可拿到数据,但是无法打开(结构已经被破坏)。(字节是最基本的单位)

2.6 序列化和反序列化

如果要把一个Java对象存入文件中,则需要对该对象进行序列化处理。

从文件中读取对象,就是反序列化。

java 复制代码
package com.xlh;

import java.io.Serializable;

public class User implements Serializable {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public User(Integer id,String name){
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
java 复制代码
package com.xlh;

import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception{
        User user = new User(1,"张三");
        //序列化:把对象存进文件中
        OutputStream outputStream = new FileOutputStream("D:\\java\\test1.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(user);
        objectOutputStream.close();
        outputStream.close();
        //反序列化:从文件中读取对象
        InputStream inputStream = new FileInputStream("D:\\java\\test1.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
       User user1 = (User) objectInputStream.readObject();
        System.out.println(user1);


    }
}
相关推荐
luck_bor1 小时前
IO流知识点笔记
java·开发语言·笔记
大圣编程2 小时前
面向对象深度理解
java·开发语言·算法
影寂ldy2 小时前
C# const 常量 / readonly 只读 / static readonly
java·开发语言·c#
摇滚侠2 小时前
Maven 入门+高深 体系外 jar 包导入 172
java·maven·jar
做个文艺程序员2 小时前
第02篇:K8s 存储与配置管理:ConfigMap、Secret、PV/PVC 实战——Java SaaS 多租户配置最佳实践
java·容器·kubernetes
爱吃牛肉的大老虎3 小时前
Spring中用到的设计模式
java·spring·设计模式
Refrain_zc3 小时前
Android TV 语音消息实战:遥控器 PCM 录音失真修复与扬声器强制播放方案
java
Stick_ZYZ3 小时前
从“能调用工具”到“能稳定执行任务”:Agent 工程化的下一步
java·人工智能·后端·spring·ai
代码中介商3 小时前
C++四大设计模式:单例、工厂、观察者、策略
java·c++·设计模式