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

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

File常见方法和属性

属性

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

构造方法

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

方法

返回值 方法名 说明
String getParent() 返回 File 对象的父目录文件路径
String getName() 返回 FIle 对象的纯文件名称
String getPath() 返回 File 对象的文件路径
String getAbsolutePath() 返回 File 对象的绝对路径
String getCanonicalPath() 返回 File 对象的修饰过的绝对路径
boolean exists() 判断 File 对象描述的文件是否真实存在
boolean isDirectory() 判断 File 对象代表的文件是否是一个目录
boolean isFile() 判断 File 对象代表的文件是否是一个普通文件
boolean createNewFile() 根据 File 对象,自动创建一个空文件。成功创建后返 回 true
返回值 方法名 说明
boolean delete() 根据 File 对象,删除该文件。成功删除后返回 true
void deleteOnExit() 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
String[] list() 返回 File 对象代表的目录下的所有文件名
File[] listFiles() 返回 File 对象代表的目录下的所有文件,以 File 对象表示
boolean mkdir() 创建 File 对象代表的目录
boolean mkdirs() 创建 File 对象代表的目录,如果必要,会创建中间目录
boolean renameTo(File dest) 进行文件改名,也可以视为我们平时的剪切、粘贴操 作
boolean canRead() 判断用户是否对文件有可读权限
boolean canWrite() 判断用户是否对文件有可写权限

观察下面的代码:

示例一:

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。

方法

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

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。

返回值 方法名 说明
void write(int b) 写入要给字节的数据
void write(byte[] b) 将 b 这个字符数组中的数据全部写入 os 中
int write(byte[] b, int off, int len) 将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
void close() 关闭字节流
void flush() 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(); 
    }
  }
}
相关文章
|
22天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件
|
2月前
|
缓存 Linux API
文件IO和标准IO的区别
文件IO和标准IO的区别
22 2
|
6天前
|
Java Unix Windows
|
29天前
|
缓存 Linux
Linux 文件IO简单实例
Linux 文件IO简单实例
12 1
|
1天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
5 0
|
2天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
19天前
|
存储 固态存储 Java
文件IO讲解
文件IO讲解
33 0
|
3月前
|
API
使用commons-io-2.0 API来实现监听文件变化
使用commons-io-2.0 API来实现监听文件变化
|
3天前
|
存储 Java 测试技术
Java基础IO总结(下)
Java基础IO总结(下)
7 0
|
3天前
|
存储 Java
Java基础IO总结(上)
Java基础IO总结(上)
8 0