【Java】File 文件

文件操作

File 类

属性

修饰符及类型属性说明
static StringpathSeparator路径分隔符,String 类型表示
static charpathSeparator路径分隔符,char 类型表示

构造方法

方法签名说明
File(File parent, String child)根据父目录 File 对象 + 孩子路径,创建 File 对象
File(String pathname)根据文件的绝对路径或相对路径创建 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()判断用户是否有可写权限

get 方法的使用

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("../test.txt");
        System.out.println("所处目录名 " + file.getParent());
        System.out.println("文件名 " + file.getName());
        System.out.println("路径 " + file.getPath());
        System.out.println("绝对路径 " + file.getAbsolutePath());
        System.out.println("经过处理的绝对路径 " + file.getCanonicalPath());
    }
}

运行结果

c2d67fc2555440f2b1e3aa29fa65374f.png

文件创建删除

public class Test {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
        System.out.println();
        System.out.println("使用 createNewFile() 创建文件");
        System.out.println(file.createNewFile());
        System.out.println();
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
        System.out.println();
        System.out.println("使用 delete() 删除文件");
        System.out.println(file.delete());
        System.out.println();
        System.out.println("是否存在 " + file.exists());
        System.out.println("是否为文件夹 " + file.isDirectory());
        System.out.println("是否为文件 " + file.isFile());
    }
}

运行结果

5b431ca103dc40629148cf79f4f5b228.png

文件读写

InputStream

方法

修饰符及返回类型方法签名说明
intread()读取一个字节的数据,当内容读完后再读将返回 -1
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回读到的字节数,返回 -1 表示文件读完
intread(byte[] b, int off, int len)读取 len 个字节,最多读取 b.length - off 个字节,数据从 b[off] 开始储存,返回 -1 表示文件读完
voidclose()关闭字节流输入

InputStream 是一个抽象类,需要使用实现类来调用具体方法,我们这里需要文件相关的Input Stream 实现类 —— FileInputStream 类

FileInputStream

构造方法

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

使用 read() 一个一个字节读取

public class Test {
    public static void main(String[] args) throws IOException {
        // test.txt 与 src 在同一层中
        // test.txt 内容为 test
        // 使用 try-with-resources 语句打开 FileInputStream 资源
        // try 语句执行完毕后 自动释放 FileInputStream 资源
        try (InputStream inputStream = new FileInputStream("test.txt")) {
            // 使用 read() 一个一个字节的读取直到文件读取结束
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    // 当 read() 返回 -1
                    // 文件读取完毕,break 退出循环
                    break;
                }
                // 将每次读取到的字节值以字符形式输出
                System.out.printf("%c", b);
            }
        }
    }
}

运行结果

ffae4d8957564521bf428c73b63073a1.png

e050bc38404940e2ab70975d7a9cc194.png

cebdc74535b443a4893639f49f6e3a13.png  

bb0ff1904bab454d8cc6576d277fe11e.png

使用 read(byte[] b) 一次读取所有字节

public class Test {
    public static void main(String[] args) throws IOException {
        // test.txt 与 src 在同一层中
        // test.txt 内容为 test
        // 使用 try-with-resources 语句打开 FileInputStream 资源
        // try 语句执行完毕后 自动释放 FileInputStream 资源
        try (InputStream inputStream = new FileInputStream("test.txt")) {
            byte[] bytes = new byte[4];
            while (true) {
                int len = inputStream.read(bytes);
                if (len == -1) {
                    // 当 read() 返回 -1
                    // 文件读完
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.printf("%c", bytes[i]);
                }
            }
        }
        System.out.println();
    }
}

运行结果

dc9b58011c98454c8b7fede39008906a.png

注意:由于中文字符的编码原因,一个字节并不能对应一个字符,使用这种方法读取中文需要将 bytes 数组使用 String 类的构造方法 String(byte bytes[], int offset, int length, String charsetName)  将 bytes[] 转换为字符串 (UTF-8  的一个字符大小为 3 个字节)

for (int i = 0; i < len; i+=3) {
    String s = new String(bytes, i, 3, "UTF-8");
    System.out.print(s);
}

运行结果

3836b22819be44c390819adc88bcd86f.png

Scanner

构造方法

构造方法说明
Scanner(InputStream inputStream, String charset)使用 charset 字符集进行 inputStream 的扫描读取

代码实现

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

运行结果

4026777fb15a4e19b23c964ea8a915a6.png

OutputStream

方法

修饰符及返回值类型方法签名说明
voidwrite(int b)写入要给的字节数据
voidwrite(byte[] b)将字节数据中的数据全部写入
intwrite(byte[] b, int off, int len)写入字节数组中从 off 开始的 len 个字节数据
voidclose()关闭字节流
voidflush()刷新缓冲区

缓冲区:对程序来讲 I/O 速度是比较慢的。因此为了减少 I/O 次数,写数据的时候会先将数据写入到一个指定的缓冲区中。缓冲区满了或是满足了某些特定条件的时候,将缓冲区的数据一次性写入到目标中,大大减少 I/O 次数。但可能就会出现写入数据时,数据写入到缓冲区中了,但不满足条件,没有写入真正的目的地,数据被遗留在了缓冲区中。所以我们有时需要使用 flush() 刷新缓冲区,强行将缓冲区的数据写到目的地中

OutputStream 同样是一个抽象类,所以我们应该使用 FileOutputStream 类

OutputStreamWriter

一个一个字节写入

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

运行结果

42287e7e126042e7b99615a5dfa990a4.png

字节数组写入

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

运行结果

b982e104e0464281bb5c251994e8a4d3.png

使用字符串写入

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("test.txt")) {
            String s = "Hello 世界";
            byte[] b = s.getBytes(StandardCharsets.UTF_8);
            outputStream.write(b);
            outputStream.flush();
        }
    }
}

运行结果

506c29d16b884f54bbc8978a369ad1f7.png

PintWriter

PintWriter 类的对象,提供了几种我们比较熟悉的输出方法,包括 print/println/printf

public class Test {
    public static void main(String[] args) throws IOException {
        try (OutputStream outputStream = new FileOutputStream("test.txt")) {
            OutputStreamWriter osWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
            PrintWriter writer = new PrintWriter(osWriter);

            writer.print("Hello ");
            writer.println("你好");
            writer.printf("%s: %d\n", "一百", 100);

            writer.flush();
        }
    }
}

运行结果

3137ba37b6dd475c9523f53c7ccaf489.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件文件流的形式下载可以通过以下步骤完成: 1. 首先,确保你已经引入了Java的`java.io`和`java.net`包。 2. 创建一个URL对象,传入文件的URL地址。 ```java URL url = new URL("http://example.com/file.txt"); ``` 3. 打开连接并获取输入流。 ```java URLConnection connection = url.openConnection(); InputStream inputStream = connection.getInputStream(); ``` 4. 创建一个输出流,用于将文件写入到本地磁盘。 ```java String savePath = "path/to/save/file.txt"; // 替换为你想要保存文件的路径 OutputStream outputStream = new FileOutputStream(savePath); ``` 5. 声明一个缓冲区,用于取输入流并写入输出流。 ```java byte[] buffer = new byte[1024]; int bytesRead; ``` 6. 循环取输入流中的数据,并将其写入输出流。 ```java while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } ``` 7. 关闭输入流和输出流。 ```java inputStream.close(); outputStream.close(); ``` 完整的示例代码如下: ```java import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; public class FileDownloadExample { public static void main(String[] args) { try { URL url = new URL("http://example.com/file.txt"); URLConnection connection = url.openConnection(); InputStream inputStream = connection.getInputStream(); String savePath = "path/to/save/file.txt"; // 替换为你想要保存文件的路径 OutputStream outputStream = new FileOutputStream(savePath); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } inputStream.close(); outputStream.close(); System.out.println("文件下载完成。"); } catch (Exception e) { e.printStackTrace(); } } } ``` 请将"http://example.com/file.txt"替换为你要下载的实际文件的URL地址,并将"path/to/save/file.txt"替换为你想要保存文件的路径。运行代码后,文件将被下载并保存到指定的路径中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值