文件操作-IO
- 1.认识文件
- 1.什么是文件
- 2.文件路径
- 2.java中操作文件
- 2.1 File类的用法
- 3.InputStream和OutputStream的用法
1.认识文件
1.什么是文件
文件是计算机系统中用来存储数据的基本单位。它是一种用于持久性存储数据的命名、有序的数据集合.计算机系统通过文件系统来组织、管理和访问文件。文件系统提供了一种机制,使得用户和程序可以创建、读取、写入、修改和删除文件,同时也提供了文件的层次结构和存储管理功能。
2.文件路径
- 相对路径:相对路径描述了文件或目录相对于当前工作目录的位置.相对路径基于当前所处位置的文件或目录.使用相对路径:. ./Download/aaa
- 绝对路径是从文件系统根目录开始的完整路径描述,它从文件系统的根目录开始描述文件的位置,包括所有必要的目录结构信息.绝对路径表示为:Data(D:)/Download/aaa
. ./表示当前文件夹的上个文件
./表示当前文件夹
2.java中操作文件
2.1 File类的用法
java.io.File类提供了对文件和目录进行操作的基本方法。它不涉及文件内容的读写,但是可以用于创建、删除、重命名文件或目录,以及获取文件信息等.以下是File类的常见用法:
文件位置就是当前项目创建的位置
- 创建文件对象
File file = new File("path/to/your/file.txt"); // 创建文件对象,指定文件路径
- 检查文件或目录是否存在
boolean exists = file.exists(); // 检查文件或目录是否存在
- 创建新文件或目录
boolean created = file.createNewFile(); // 创建新文件
// 或者
File directory = new File("path/to/your/directory");
boolean dirCreated = directory.mkdir(); // 创建新目录
// 注意:mkdir() 方法只能创建单级目录,如果需要创建多级目录可以使用 mkdirs() 方法
- 获取文件信息
String fileName = file.getName(); // 获取文件名
String filePath = file.getAbsolutePath(); // 获取文件的绝对路径
boolean isDirectory = file.isDirectory(); // 检查是否是目录
- 删除文件
boolean deleted = file.delete(); // 删除文件
// 或者
file.deleteOnExit();//等到程序退出后再删除
- 文件重命名
File oldFile = new File("./newFileName.txt");
File newFile = new File("./src/newFileName.txt");
oldfile.renameTo(newFile); // 重命名文件
//将oldFile重命名为newFile并移动到src目录下
3.InputStream和OutputStream的用法
InputStream 和 OutputStream 是 Java I/O 的核心抽象类,使用时需要具体的实现类,用于处理字节流。它们是操作数据输入和输出的基础,可以用于读取和写入文件、网络流、内存中的数据
public static void main(String[] args) throws IOException {//在使用完流之后,需要关闭它们以释放资源。在 try-with-resources 语句块中创建流可以确保在结束时自动关闭。//如果不关闭,就会造成资源泄露!!! 也可使用close进行关闭,但是可能会执行不到,比如中途抛异常,return等,//也可采取finally,但代码不美观try(InputStream inputStream = new FileInputStream("d:/aaa/t.txt")) {while (true) {byte[] buf = new byte[1024];int n = inputStream.read(buf);if (n == -1) {break;}for (int i = 0; i < n; i++) {//十六进制方式进行打印System.out.printf("%x ", buf[i]);}//String构造方法内部对字节数组进行编码转换String s = new String(buf, 0, n, "utf-8");System.out.println(s);}}}
对于字符类型使用InputStream进行读取还是比较麻烦的,其实我们可以使用Scanner搭配流对象进行操作,我们一般使用Scanner都是进行输入的,在参数内部添加System.in,在源码中in的类型就是public final static InputStream in = null;
也就是说我们可以传入自己的InputStream对象,对字符类型进行打印.
public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("d:/aaa/t.txt")) {Scanner scanner = new Scanner(inputStream);String s = scanner.nextLine();System.out.println(s);}
}
//注意:Scanner只是用来读文本文件,不适合读取二进制文件,否则会乱码
利用 OutputStreamWriter 进行字符写入
public static void main(String[] args) throws IOException {try(OutputStream ot = new FileOutputStream("d:/aaa/t.txt")) {String s = "hello";//转换为字节数组,存放到数组中byte[] b = s.getBytes();//数组b中的数据写入到输出流ot中ot.write(b);//将输出流中的缓冲区数据写入到文件中,确保数据被及时的写入文件ot.flush();}}
System.out.println()中out的源码public final static PrintStream out = null;
我们可以传入自己的PrintStream来输出
public static void main(String[] args) throws IOException {//再写入之前要先打开文件,输出流对象会在打开文件之后,清空文件内容,所以我们可以追加,加个true即可try(OutputStream ot = new FileOutputStream("d:/aaa/t.txt",true)) {PrintStream printStream = new PrintStream(ot);printStream.println("hello");ot.flush();}}