• Java(十六)——文件


    文件

    一、File对象

    注意:

    • Windows平台使用作为路径分隔符,在Java字符串中需要用\表示一个
    • Linux平台使用/作为路径分隔符
    • 若传入的是相对路径,可以用.表示当前目录,..表示上级目录

    1、创建对象

    File f = new File("/home/up/IdeaProjects/test_project");
    

    2、对象方法

    getPath()     // 返回构造方法传入的路径
    getAbsolutePath()    // 返回绝对路径
    getCanonicalPath() 		// 它和绝对路径类似,但是返回的是规范路径
    
    isFile() 			// 判断该File对象是否是一个已存在的文件
    isDirectory()			// 判断该File对象是否是一个已存在的目录
    
    boolean canRead()		// 是否可读
    boolean canWrite()			// 是否可写
    boolean canExecute()			// 是否可执行
    long length()			// 文件字节大小
    
    createNewFile()			// 创建一个新文件
    delete()		// 删除该文件
    createTempFile()   		// 创建一个临时文件
    deleteOnExit()			// 在JVM退出时自动删除该文件
    mkdir()  或者 mkdirs() 	// 创建目录或多级目录
    
    

    3、遍历文件

    list()    // 列出目录下的所有文件和子目录
    listFiles()		// 列出当前目录下的所有文件
    

    二、Path类

    1、对象方法

    Path p1 = Paths.get(".", "project", "study"); 		// 构造一个Path对象
    
    // toAbsolutePath   转为绝对路径
    p1.toAbsolutePath();
    
    // normalize   转为规范路径
    p1.normalize();
    
    // toFile   转为File对象
    p1.toFile();
    

    三、读写文件

    字节流 字符流
    输入流 InputStream Reader
    输出流 OutputStream Writer
    • InputStream和OutputStream读写数据的单位是一个字节

    • Reader和Writer读写数据的单位是一个字符

    1、InputStream输入流——读文件

    (1)常用方法

    read()
    // 读取一个字节,以整数形式返回;读到末尾则返回-1
    
    read(byte[] b, int off, int len) 
    // 从文件中最多读取 len个字节的数据,从b[off]处开始存入b
    
    skip(long n)
    // 跳过输入流的n个字节
    

    (2)案例

    // try(resource)   会自动关闭文件
    
    public void readFile() throws IOException {
        try (InputStream input = new FileInputStream("src/readme.txt")) {
            int n;
            while ((n = input.read()) != -1) {
                System.out.println(n);
            }
        } // 编译器在此自动为我们写入finally并调用close()
    }
    

    2、OutputStream输出流——写文件

    (1)常用方法

    write(int b)
    // 向输出流中写入
        
    write(byte[] b, int off, int len)
    // 将数组从 off索引开始的len个字节写入输出流
    
    flush()
    // 将输出流中缓冲的数据全部写到目标位置
    

    (2)案例

    public void writeFile() throws IOException {
        try (OutputStream out = new FileOutputStream("b.txt")){
                out.write("hello".getBytes());
    
            }catch (Exception e){
                System.out.println(e);
            } // 编译器在此自动为我们写入finally并调用close()
    }
    

    3、Reader——读文件

    Reader是一个字符流,即以char为单位读取

    • 在创建文件对象时,要指定字符编码,否则会读出乱码
    public void readFile() throws IOException {
        // 创建一个FileReader对象:
        try(Reader reader = new FileReader("b.txt", StandardCharsets.UTF_8)){
                while (true){
                    int res = reader.read();
                    System.out.println((char) res);
                    if (res == -1){
                        break;
                    }
                }
            }catch (Exception e){
                System.out.println(e);
            }
    }
    

    4、Writer——写文件

    • 在创建文件对象时,要指定字符编码,否则会读出乱码
    void write(int c)		// 写入一个字符(0~65535)
    void write(char[] c)		// 写入字符数组的所有字符
    void write(String s)		// 写入String表示的所有字符
    
    try(Writer writer = new FileWriter("b.txt", StandardCharsets.UTF_8)){
                writer.write("好的");
            }catch (Exception e){
                System.out.println(e);
            }
    
    

    四、Zip文件

    1、读取zip文件

    创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束

    try (ZipInputStream zip = new ZipInputStream(new FileInputStream("a.zip"))) {
        ZipEntry entry = null;
        while ((entry = zip.getNextEntry()) != null) {
            String name = entry.getName();
            if (!entry.isDirectory()) {
                int n;
                while ((n = zip.read()) != -1) {
                    ...
                }
            }
        }
    }
    

    2、写入zip文件

    创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包

    try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("a.zip"))) {
        File[] files = ...
        for (File file : files) {
            zip.putNextEntry(new ZipEntry(file.getName()));
            zip.write(getFileDataAsBytes(file));
            zip.closeEntry();
        }
    }
    

    五、序列化与反序列化

    1、序列化

    序列化是指把一个Java对象变成二进制内容,本质上就是一个byte[]数组。序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把Java对象存储到文件或者通过网络传输出去了。

    ObjectOutputStream可以把一个Java对象写入一个字节流

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    try (ObjectOutputStream output = new ObjectOutputStream(buffer)) {
        // 写入int
        output.writeInt(12345);
        // 写入String
        output.writeUTF("Hello");
        // 写入Object
        output.writeObject(Double.valueOf(123.456));
    }
    System.out.println(Arrays.toString(buffer.toByteArray()));
    

    2、反序列化

    ObjectInputStream负责从一个字节流读取Java对象

    try (ObjectInputStream input = new ObjectInputStream(...)) {
        int n = input.readInt();
        String s = input.readUTF();
        Double d = (Double) input.readObject();
    }
    
  • 相关阅读:
    POJ ACM题分类
    HDU 4438 Hunters (概率 & 期望)
    HDU 1042 N!
    HDU 1073 Online Judge
    PKU 1006 Biorhythms (中国剩余定理 * *)
    HDU 1047 Integer Inquiry
    HDU 2710 Max Factorv (素数模板 & 多种解法)
    HDU A + B Problem II 1002
    第6期(江西省吉安市永丰县)县长手机信箱工作简报(自吹自擂政绩,自圆其说)
    Send mail from ASP.NET using your gmail account
  • 原文地址:https://www.cnblogs.com/linagcheng/p/12186415.html
Copyright © 2020-2023  润新知