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

本文详细介绍了Java中File类及其常用方法,包括属性、构造函数和各种操作如文件存在性检查、目录创建、文件重命名等。同时涵盖了InputStream和OutputStream的使用,以及按字节和字符读写数据的示例。
摘要由CSDN通过智能技术生成

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(); 
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值