【文件IO】 File类的用法和 InputStream OutputStream 的用法

File常见方法和属性

属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char类型的表示

构造方法

方法说明
File(File parent, String child)根据父目录 + 子文件路径,创建一个新的 File 实例
File(String parent, String child)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者 相对路径
File(String parent, String child)根据父目录 + 子文件路径,创建一个新的 File 实例,父目录用 路径表示

方法

返回值方法名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返 回 true
返回值方法名说明
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操 作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

观察下面的代码:

示例一:

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

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        System.out.println(file.getName());//返回file对象的纯文件名
        System.out.println(file.getParent());//返回file对象的父目录文件路径
        System.out.println(file.getPath());//返回file对象的文件路径
        System.out.println(file.getAbsolutePath());//返回file对象的绝对路径
        System.out.println(file.getCanonicalPath());//返回file对象的修饰过的绝对路径
    }
}

在这里插入图片描述

示例二:

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

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("d:/test.txt");
        System.out.println(file.exists());//判断file对象描述的文件是否真实存在
        System.out.println(file.isDirectory());//判断file对象是否是一个目录
        System.out.println(file.isFile());//判断file对象是否是一个普通文件

        //创建一个text文件
        boolean newFile = file.createNewFile();
        System.out.println("newFile = "+newFile);

        System.out.println(file.exists());
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
    }
}

在这里插入图片描述

示例三:

import java.io.File;

public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        File file = new File("d:/test.txt");
//        boolean delete = file.delete();//删除file文件 成功则返回true
//        System.out.println(delete);
        //进程结束后删除file
        file.deleteOnExit();
        Thread.sleep(5000);//5秒后删除创建的test.txt
    }
}

示例四:

import java.io.File;
import java.util.Arrays;

public class Demo4 {
    public static void main(String[] args) {
        File file = new File("d:/");
        //返回file对象代表的的目录下所有的文件名 (包括一些隐藏的文件)
        String[] fs = file.list();
        System.out.println(Arrays.toString(fs));
    }
}

示例五:

import java.io.File;

public class Demo5 {
    public static void main(String[] args) {
        File file = new File("d:/aaa/bbb/ccc");
        //创建file对象代表的目录
        boolean mkdirs = file.mkdirs();
        System.out.println(mkdirs);
    }
}

示例六:

import java.io.File;

public class Demo6 {
    public static void main(String[] args) {
        //源文件
        File srcFile = new File("d:/test.txt");
        //目标文件
        File destFile = new File("d:/test1.txt");
        //将源文件名改成目标文件
        boolean renameTo = srcFile.renameTo(destFile);
        System.out.println(renameTo);
    }
}

示例七:

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

public class Demo7 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("d:/test1.txt",true)){
            //直接使用write写入数据
            writer.write("计算机操作系统IO");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

InputStream

InputStream 是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用 FileInputStream。

方法

返回值方法名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数 量;-1 代表以及读完了
intread(byte[] b, int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返 回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流

FileInputStream

构造方法

方法名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

示例八:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Demo8 {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("d:/test1.txt")) {
            byte[] buffer = new byte[1024];
            int read = inputStream.read(buffer);
            System.out.println(read);
            for (int i = 0; i < read; i++) {
                System.out.printf("%x\n",buffer[i]);//以十六进制打印文件里的内容
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

示例九:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    // 需要先在项目目录下准备好一个 test1.txt 的文件  里面填充 "Hello"
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("d:/test1.txt")) {
            while (true) {
                int b = is.read();
                if (b == -1) {
                    break;
                }
                System.out.printf("%c", b);
            }
        }
    }
}

示例十:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    // 需要先在项目目录下准备好一个 test1.txt 的文件  里面填充 "Hello"
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("d:/test1.txt")) {
            byte[] buf = new byte[1024];
            int len;
            while (true) {
                len = is.read(buf);
                if (len == -1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", buf[i]);
                }
                // 每次使用 3 字节进行utf8解码 得到中文字符利用 String 中的构造方法完成
               // for (int i = 0; i < len; i+=3) {
                  //  String s = new String(buf, i, 3, "UTF-8");
                  //System.out.printf("%s", s);
                }
            }
        }
    }
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("d:/test1.txt")) {
            try (Scanner scanner = new Scanner(is, "UTF-8")) {
                while (scanner.hasNext()) {
                    String s = scanner.next();
                    System.out.print(s);
                }
            }
        }
    }
}

OutputStream

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。

返回值方法名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()I/O 的速度是很慢的,所以,大多的 OutputStream 为 了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的 一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写 入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置, 调用 flush(刷新)操作,将数据刷到设备中。

利用 OutputStreamWriter 进行字符写入

示例一:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
            os.write('H');
            os.write('e');
            os.write('l');
            os.write('l');
            os.write('o');
            os.flush();
        }
    }
}

示例二:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
            byte[] b = new byte[]{
                    (byte) 'H', (byte) 'e', (byte) 'l', (byte) 'l',(byte) 'o'
            };
            os.write(b);
            os.flush();
        }
    }
}

示例三:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
            byte[] b = new byte[]{
                    (byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd', (byte) 'B',
                    (byte) 'a', (byte) 'd'
            };
            os.write(b, 0, 4); //Good
            os.flush();
        }
    }
}

示例四:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
            String s = "hello word";
            byte[] b = s.getBytes();
            os.write(b);
            os.flush();
        }
    }
}

示例五:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

public class Test {
    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/test1.txt",true)) {
            //把字节流转为字符流
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println("hello");
            //把写在缓冲区的数据冲入内存
            printWriter.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

总结

按字节读取数据

try (InputStream is = new FileInputStream("d:/test1.txt")) {
	byte[] buf = new byte[1024];
    int n;
	while (true) {
		n = is.read(buf);
		if (n == -1) {
			break;
		}
		// 处理读取到的数据
	}
}

按字节写入数据

try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
	byte[] buf = new byte[1024];
	while (/* 还有未完成的业务数据 */) {
		// 将业务数据填入 buf 中,长度为 n
		int n = ...;
		os.write(buf, 0, n);
	}
    // 进行数据刷新操作
	os.flush(); 
}

按字符读取数据

try (InputStream is = new FileInputStream("d:/test1.txt")) {
	try (Scanner scanner = new Scanner(is, "UTF-8")) {
		while (scanner.hasNextLine()) {
			String line = scanner.nextLine();
			// 对line进行操作
		}
	}
}

按字符写入数据

try (OutputStream os = new FileOutputStream("d:/test1.txt")) {
	try (OutputStreamWriter osWriter = new OutputStreamWriter(os, "UTF-8")) {
		try (PrintWriter writer = new PrintWriter(osWriter)) {
			while (/* 还有未完成的业务数据 */) {
				writer.println(...);
			}
            // 进行数据刷新操作
			writer.flush(); 
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值