Java学习笔记 7-18 IO

IO

1. File类的作用

File类封装了文件或目录,可以实现对文件和目录的获取、创建、删除等功能。

2. File类中常用方法的使用介绍

  1. createNewFile():创建文件,创建成功返回true。
  2. exists():File对象表示的文件名或路径是否存在,存在返回true。
  3. canRead():File对象表示的文件名或路径存在且可读,存在返回true。
  4. canWrite():File对象表示的文件名或路径存在且可写,存在返回true。
  5. isFile():File对象是一个文件,返回true。
  6. isDirectory():File对象表示的是一个目录,返回true。
  7. isAbsolute():File对象表示的文件是使用绝对路径名创建的,返回true。
  8. getAbsolutePath():返回File对象表示的文件或目录的绝对路径。
  9. getName():返回File对象表示的文件或目录的名称。
  10. getPath():返回File对象表示的文件或目录的完整路径。
  11. getParent():返回File对象表示的文件或目录的父目录的完整路径。
  12. lastModified():返回File对象表示的文件或目录的最后一次修改时间。
  13. length():返回File对象表示的文件或目录的长度。
  14. listFiles():如果返回File对象表示的是一个目录,则返回该目录下所有的文件和目录。
  15. delete():删除File对象表示的文件或目录。
  16. renameTo(File file):重命名。

3. 使用File类操作文件和文件夹

使用上述File类常用方法操作文件和文件夹:

package com.myh.day0718;

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

public class FileTest {
    public static void main(String[] args) {
        //对文件进行操作
        File file1 = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
        try {
            System.out.println(file1.createNewFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(file1.canRead());
        System.out.println(file1.canWrite());
        System.out.println(file1.isFile());
        System.out.println(file1.isDirectory());
        System.out.println(file1.isAbsolute());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getName());
        System.out.println(file1.getPath());
        System.out.println(file1.getParent());
        System.out.println(file1.lastModified());
        System.out.println(file1.length());
        System.out.println(file1.listFiles());
        System.out.println(file1.renameTo(new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt")));

        System.out.println("================================");
        //对文件夹进行操作
        File file2 = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718");
        try {
            System.out.println(file1.createNewFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(file2.canRead());
        System.out.println(file2.canWrite());
        System.out.println(file2.isFile());
        System.out.println(file2.isDirectory());
        System.out.println(file2.isAbsolute());
        System.out.println(file2.getAbsoluteFile());
        System.out.println(file2.getName());
        System.out.println(file2.getPath());
        System.out.println(file2.getParent());
        System.out.println(file2.lastModified());
        System.out.println(file2.length());
        System.out.println(file2.listFiles());
        System.out.println(file2.renameTo(new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt")));
    }
}
true
true
true
true
false
true
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt
text.txt
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
1658107574994
0
null
true
================================
true
true
true
false
true
true
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
day0718
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718
/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh
1658107618641
160
[Ljava.io.File;@610455d6
false

使用深度优先搜索对文件夹下的文件进行搜索:

package com.myh.day0718;

import java.io.File;
// 统计src文件夹下.java文件的数量 
public class FileFindDemo {

    public static int findFile(File file) {
        int num = 0;
        File[] files = file.listFiles();
        for (File file1 : files) {
            if(file1.isDirectory()) {
                num += findFile(file1);
            }
            else if(file1.getName().endsWith(".java")) {
                num++;
            }
        }
        return num;
    }

    public static void main(String[] args) {
        File file = new File("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src");

        System.out.println("src目录下有" + findFile(file) + "个.java文件");
    }
}
src目录下有28个.java文件

4. 相对路径和绝对路径的介绍

  • 绝对路径:从根目录为起点到某个目录的路径,与当前位置无关
  • 相对路径:从当前目录为起点到某个目录的路径,与当前位置有关。

5. IO流的概念和工作原理

流:数据在设备间的传输称为流,是内存与存储设备之间传输数据的通道。

IO流:对于数据的传输,可以看做是一种数据的流动。按照流动的方向,分为输入input和输出output,即输入流和输出流。

6. IO流的分类

IO流按照流动的方向,分为输入流和输出流;按照操作单元划分,分为字节流和字符流。

输入流:将内容读入到内存中。

输出流:将内存中的内容读出。

字节流:操作单位为1个字节。

字符流:操作单位为2个字节的Unicode字符。

7. 文件流的使用

输入流:FileInputStream(字节流)和FileReader(字符流)

输出流:FileOutputStream和FileWriter

由于FileReader和FileInputStream的使用方法类似,FileWriter 和FileOutputStream的使用方法类似,所以下面只用FileInputStream和FileOutputStream举例。

使用文件流实现文件内容的拷贝:

package com.myh.day0718;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
            FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt");

            byte[] bytes = new byte[1024];
            int hasRead = 0;

            while ((hasRead = fis.read(bytes)) > 0) {
                fos.write(bytes, 0, hasRead);
            }
            // 要记得关闭输入输出流 
            fis.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

8. 缓冲流的使用

输入流:BufferedInputStream和BufferedReader

输出流:BufferedOutputStream和BufferedWriter

使用缓冲流实现文件的拷贝:

package com.myh.day0718;

import java.io.*;

public class BufferedStreamDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text.txt");
            FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/text1.txt");

            BufferedInputStream bis = new BufferedInputStream(fis);
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            byte[] bytes = new byte[1024];
            int hasRead = 0;

            while ((hasRead = bis.read(bytes)) > 0) {
                bos.write(bytes, 0, hasRead);
            }
            // 此时只需关闭缓冲流的输入输出,java会自动关闭fis和fos 
            bis.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

9. 内存流的使用

输入流:ByteArrayInputStream和CharReader

输出流:ByteArrayOutputStream和CharWriter

package com.myh.day0718;

import java.io.*;

public class ByteArrayStreamDemo {
    public static void main(String[] args) {
        String msg = "Hello, world!";

        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write(msg.getBytes());
            baos.flush();

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            byte[] bytes = new byte[1024];
            int len = bais.read(bytes);

            System.out.println(new String(bytes, 0, len));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Hello, world!

10. 使用流实现文件内容的拷贝

见11

11. 分别使用字符流、字节流、NIO读写中文CSV文件

使用字节流读写中文csv文件
package com.myh.day0718.work;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用字节流读、写中文csv文件
 */
public class ByteIODemo {
    public static void main(String[] args) {
        try (
                FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
                FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_byte.csv")
        ) {

            byte[] bytes = new byte[1024];
            int hasRead = 0;

            while ((hasRead = fis.read(bytes)) > 0) {
                fos.write(bytes, 0, hasRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
使用字符流读写中文csv文件
package com.myh.day0718.work;

import java.io.*;

/**
 * 使用字符流读写csv文件
 */
public class CharIODemo {
    public static void main(String[] args) {
        try (
                FileReader fis = new FileReader("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
                FileWriter fos = new FileWriter("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_char.csv")
        ) {

            char[] chars = new char[1024];
            int hasRead = 0;

            while ((hasRead = fis.read(chars)) > 0) {
                fos.write(chars, 0, hasRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
使用NIO读写中文csv文件
package com.myh.day0718.work;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 使用NIO读写文件
 */
public class NIODemo {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        try (
                FileInputStream fis = new FileInputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data1.csv");
                FileOutputStream fos = new FileOutputStream("/Users/macbook/IdeaProjects/HelloIdea/FirstTest/src/com/myh/day0718/work/data_nio.csv");
                FileChannel fisChannel = fis.getChannel();
                FileChannel fosChannel = fos.getChannel()
        ) {

            int hasRead = 0;

            while ((hasRead = fisChannel.read(byteBuffer)) > 0) {
                byteBuffer.flip(); //从读模式转换为写模式
                fosChannel.write(byteBuffer);
                byteBuffer.clear(); //清空并等待下次读入
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值