文件操作和IO

本文介绍了Java中如何使用File类进行文件操作,包括构造方法、文件属性、路径处理等。此外,还详细讲解了如何通过InputStream和OutputStream进行文件的读写,包括单个字符读取、批量读写,以及使用Scanner和PrintWriter进行数据交互。同时,展示了如何创建、删除文件以及追加数据到文件。
摘要由CSDN通过智能技术生成

一、Java中操作文件

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。

1.1File常见属性

在这里插入图片描述

1.2File常见构造方法

在这里插入图片描述
示例:

import java.io.File;
 
public class FileDemo1 {
    public static void main(String[] args) {
        File pFile = new File("d:\\");
 
        //构造方法1
        File file = new File(pFile, "a.txt");
        System.out.println(file.getPath());
 
        //构造方法2【重点-常用】
        File file2 = new File("d:\\b.txt");
        System.out.println("文件2路径:" + file2.getPath());
 
        //构造方法3
        File file3 = new File("d:\\", "c.txt");
        System.out.println(file3.getPath());
    }
}

在这里插入图片描述

2.3常用方法

在这里插入图片描述

2.3.1观察get系列的特点和差异

import java.io.File;
import java.io.IOException;
 
public class FileDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("../a.txt");
        System.out.println("文件名称:" + file.getName());
        System.out.println("文件目录(getPath):" + file.getPath());
        System.out.println("文件绝对路径:" + file.getAbsolutePath());
        System.out.println("文件标准路径:" + file.getCanonicalPath());
    }
}

在这里插入图片描述

1.绝对路径时,三者⼀致。
2.相对路径时:
getPath() 是相对路径本身。
getAbsolutePath() 是项目目录 + 相对路径本身。
getCanonicalPath() 可以解析相对路径,得到争取的路径。

2.3.2文件判断与创建

import java.io.File;
import java.io.IOException;
 
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("z.txt");
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
        System.out.println();
 
        boolean result = file.createNewFile(); //创建文件
        System.out.println("文件创建:" + result);
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是否为文件夹:" + file.isDirectory());
        System.out.println("是否为文件:" + file.isFile());
        System.out.println();
 
        File file2 = new File("c.txt");
        if(!file2.exists()) { //文件不存在,创建文件
            System.out.println("创建文件:" + file2.createNewFile());
        }
        System.out.println("是否为文件夹:" + file2.isDirectory());
        System.out.println("是否为文件:" + file2.isFile());
    }
}

在这里插入图片描述
如果文件或文件夹不存在,使用 isDirectory 和 isFile 判断都为 false.

2.3.3文件存在删除/不存在创建

import java.io.File;
import java.io.IOException;
 
public class FileDemo4 {
    public static void main(String[] args) throws IOException {
        //先得到一个file对象
        File file = new File("a.txt");
        //判断file对象是否存在
        if(file.exists()) {
            //如果存在则删除文件
            boolean result = file.delete();
            System.out.println("文件删除:" + result);
        } else {
            //如果不存在则创建文件
            boolean result = file.createNewFile();
            System.out.println("新建文件:" + result);
        }
    }
}

二、文件内容的读写(数据流)

2.1InputStream输入流

InputStream输入流是用来读取数据的

2.1.1 InputStream常用方法

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

2.1.2 FileInputStream

构造方法
在这里插入图片描述
读取文件中的内容:

方式1:每次只能读取一个字符

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
 
public class InputStreamDemo1 {
    public static void main(String[] args) {
        //1.创建流对象 try-catch
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("c.txt");
            //2.读写操作
            while(true) {
                int c = inputStream.read();
                //如果流返回的是-1,说明数据已经读取完了
                if(c == -1) break;
                Thread.sleep(200);
                System.out.printf("%c", c);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException exception) {
            exception.printStackTrace();
        } finally {
            //3.关闭流
            if(inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

改进版:在JDK1.7之后可以使用try-catch-resource

import java.io.FileInputStream;
import java.io.InputStream;
 
public class InputStreamDemo2 {
    public static void main(String[] args) {
        //1.创建流对象 try-catch-resource(诞生于JDK1.7)
        try(InputStream inputStream = new FileInputStream("c.txt")) {
            //2.读写操作
            while(true) {
                int c = inputStream.read();
                //如果流返回的是-1,说明数据已经读取完了
                if(c == -1) break;
                Thread.sleep(200);
                System.out.printf("%c", c);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
方式2:可以将字符一次性全部读取出来

import java.io.FileInputStream;
import java.io.InputStream;
 
/**
 * 一次性读取
 */
public class InputStreamDemo3 {
    public static void main(java.lang.String[] args) {
        try(InputStream inputStream = new FileInputStream("c.txt")) {
            byte[] bytes = new byte[1024];
            while(true) { //如果数据超过了byte容量,会读取多次
                int c = inputStream.read(bytes);
                if(c == -1) break;
                Thread.sleep(200);
                System.out.println(new String(bytes, "utf-8"));
            }
        } catch (Exception e) {
        }
    }
}

在这里插入图片描述

2.1.3使用scanner进行数据读取

在这里插入图片描述

import java.io.FileInputStream;
import java.util.Scanner;
 
public class InputStreamDemo4 {
    public static void main(String[] args) {
        try(FileInputStream inputStream = new FileInputStream("c.txt")) {
            try(Scanner scanner = new Scanner(inputStream, "utf8")) {
                while(scanner.hasNext()) {
                    System.out.println(scanner.nextLine());
                }
            }
        } catch (Exception e) {
        }
    }
}

在这里插入图片描述

2.2OutputStream:输出流

OutputStream输出流,是进行数据写入的

2.2.1OutputStream常用方法

在这里插入图片描述
OutputStream 同样只是⼀个抽象类,要使⽤还需要具体的实现类。我们现在还是只关心写入文件中,所以使用FileOutputStream。

2.2.2 FileOutputStream

示例一:每次写入一个数据

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
/**
 * 写入,每次写入一个字符
 */
public class OutputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if(!file.exists()) {
            //新建文件
            System.out.println("新建文件:" + file.createNewFile());
        }
        //文件写入操作
        try(OutputStream outputStream = new FileOutputStream(file)) {
            outputStream.write('H');
            outputStream.write('e');
            outputStream.write('l');
            outputStream.write('l');
            outputStream.write('o');
            outputStream.flush();
        }
    }
}

示例二:每次按批量进行数据写入

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
public class OutputStreamDemo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if(!file.exists()) {
            file.createNewFile();
        }
        //写入操作
        try(OutputStream outputStream = new FileOutputStream(file)) {
            byte[] bytes = new byte[]{
                    'H', 'i'
            };
            outputStream.write(bytes);
            outputStream.flush();
        }
    }
}

在这里插入图片描述

示例二另一个版本:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
 
public class OutputStreamDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if(!file.exists()) {
            file.createNewFile();
        }
        //写入操作
        try(OutputStream outputStream = new FileOutputStream(file)) {
            String msg = "hello, world";
            outputStream.write(msg.getBytes(StandardCharsets.UTF_8));
            outputStream.flush();
        }
    }
}

在这里插入图片描述

2.2.3使用PrintWriter进行写入

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
 
public class OutputStreamDemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if(!file.exists()) file.createNewFile();
        try(PrintWriter printWriter = new PrintWriter(file)) {
            printWriter.println("这是第一行数据");
            printWriter.println("这是第二行数据");
            printWriter.printf("我叫:%s,今年:%d,至今未婚", "张三", 22);
            printWriter.flush();
        }
    }
}

在这里插入图片描述
以上数据写入方式,都会进行数据的覆盖

2.2.4 使用FileWriter追加数据

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class OutputStreamDemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("mytest.txt");
        if(!file.exists()) file.createNewFile();
 
        //数据追加
        try(FileWriter fileWriter = new FileWriter(file, true)) {
            fileWriter.append("我是追加的数据II\n");
            fileWriter.flush();
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值