Java - File类 / 输入输出流 / IO流(FileReader、FileWriter、FileInputStream、FileOnputStream、缓冲流、转换流)

本文详细介绍了Java中的File类,包括构造器、常用方法及使用示例。接着讲解了IO流的基本原理和分类,如字节流、字符流,以及FileReader、FileWriter、FileInputStream、FileOutputStream的使用。文章还涵盖了缓冲流、转换流、标准输入输出流、打印流、对象流等,并给出了多线程搜索文件关键字的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

File类

    java.io.File 类能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容,则需要使用输入流/输出流
    想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

File类的常用构造器

    若硬盘中有一个真实存在的文件或目录,创建File对象时,各个属性会显式赋值。当硬盘中没有真实的文件或目录对应时,那么创建File对象时,除了指定的目录和路径之外,其他的属性都是取成员变量的默认值。

	//以pathname为路径创建File对象,可以是绝对路径或相对路径
	public File(String pathname)
	//以parent为父路径,child为子路径创建File对象
	public File(String parent, String child)
	//关于一个父File对象,child为子路径创建File对象
	public File(File parent, String child)
	//以URI对象创建File对象
	public File(URI uri)

    路径中的每级目录之间用一个路径分割符隔开。在Windows下默认使用 “ \ ”,在UNIX和Linux下默认使用 “ / ”。Java提供一个常量File.separator,根据操作系统动态提供分隔符。

	File file1 = new File("D:\\Java\\File");
	File file2 = new File("D:"+File.separator+"Java"+File.separator+"File");
	File file3 = new File("D:/Java/File");

    此时的file1对象是在内存层面的,在硬盘中不一定存在。

File类的常用方法

               |——public String getAbsolutePath():获取绝对路径
               |——public String getPath():获取路径
               |——public String getName():获取名称
               |——public String getParent():获取上层文件目录路径,若无返回null
               |——public long length():获取文件字节数,不能获取目录的字节数
               |——public long lastModified():获取最后一次修改时间(毫秒值)
               |——public String[] list():获取指定目录下的所有文件或文件目录的名称数组
               |——public File[] listFiles():获取指定目录下的所有文件或文件目录的File数组
               |——public boolean renameTo(File dest):文件重命名(源文件在硬盘必须存在,目标文件不能在硬盘存在)
File——|——public boolean isDirectory():判断是否是文件目录
               |——public boolean isFile():判断是否是文件
               |——public boolean exists():判断是否是存在
               |——public boolean canRead():判断是否可读
               |——public boolean canWrite():判断是否可写
               |——public boolean isHidden():判断是否隐藏
               |——public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
               |——public boolean mkdir():创建文件目录。若此文件目录存在,则不创建。若其上层目录不存在,也不创建
               |——public boolean mkdir():创建文件目录。若此文件目录存在,则不创建。若其上层目录不存在,一并创建
               |——public boolean delete():删除文件或文件夹(如果文件夹内有文件则删除失败)

File类的使用

    1. 将指定目录下的 .jpg 文件重命名:

	File[] files =new File("D:\\Java\\eclipse-workspace\\study").listFiles();
	StringBuilder builder = new StringBuilder("图片1.jpg");
	int i = 1;
	for(File file : files) {
      //遍历目录下的文件
		if(file.isFile()) {
   
			if(file.getName().endsWith(".jpg")) {
   
				file.renameTo(new File(builder.toString()));   //重命名
				builder.delete(2, builder.length());
				builder.append(++i+".jpg");
			}
		}
	}

    2. 遍历指定目录下的所有文件和文件夹,并输出文件数、文件夹数、总大小:

import java.io.File;

public class FileTest {
   

	private static int fileNum = 0; // 文件数
	private static int folderNum = 0; // 文件夹数
	private static int total = 0; // 总大小

	public static void search(File[] folder) {
   
		for (File file : folder) {
   
			if (file.isFile()) {
      //文件
				fileNum++;
				total += file.length();
			} else {
      //文件夹
				folderNum++;
				search(file.listFiles());   //深度遍历
			}
		}
	}

	public static void main(String[] args) {
   
		search(new File("C:\\Users\\HP\\Desktop").listFiles());
		System.out.println("文件数:" + fileNum);
		System.out.println("文件夹数:" + folderNum);
		System.out.println("总大小:" + total + " kb");
	}
}

运行结果:
文件数:1346
文件夹数:142
总大小:1525166593 byte

IO流原理及流的分类

    I/O的Input/Output的缩写,在Java程序中,对于数据的输入/输出操作以“”(stream)的方式进行。
    输入Input:读取外部数据(磁盘等存储设备)的数据到程序(内存)。
    输出Output:将程序(内存)数据输出到硬盘等存储设备中。
    流的分类:
            按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
            按数据流的流向不同分为:输入流输出流
            按流的角色的不同分为:节点流处理流
在这里插入图片描述
    Java的IO共涉及多个类,实际上都是从上面4个抽象基类派生,由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀,如FileInputStream,BufferedReader,PrintWriter等等。
在这里插入图片描述
    字节流适用于非文本文件(.jpg、.mp3、.mp4、.avi、.doc、.ppt……);字符型适用于文本文件(.txt、.java、.c……)。不能使用字符流来处理图片等文件。
    我们称FileInputStream、FileOutputStream、FileReader、FileWriter等为节点流,可以从或向一个特定的地方(节点)读写数据。而其他的流则为处理流,对一个已存在的流的连接和封装(套上),通过所封装的流的功能调用实现数据读写。

FileReader读入数据的操作

    读入的文件必须存在,否则会报FileNotFoundException。
    步骤:
        1. 提供File对象,指明要操作的文件。
        2. 提供FileReader对象,用于数据的读入。
                read() 返回读入的一个字符的字节码,如果到达文件末尾则返回-1。
                read(char[]) 返回读入字符的个数,字符存在数组里面,如果到达文件末尾则返回-1。
        3. 进行读入操作。
        4. 流资源关闭。

	public static void readFile() {
   
		File file = new File("hello.txt");   //指定要读取的文件
		if (file.exists()) {
   
			FileReader reader = null;
			try {
   
				reader = new FileReader(file);
				/*方式一
				int data;
				while ((data = reader.read()) != -1) {
					System.out.print((char) data);
				}*/
				//方式二
				int number;
				char[] ch = new char[10];
				while ((number = reader.read(ch)) != -1) {
   
					for(int i = 0;i < number; i++)
						System.out.print(ch[i]);
				}
			} catch (FileNotFoundException e) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值