文件操作---IO详解

文件流

File类

相关方法:

exists():判断文件是否存在

getPath():返回文件的路径

getAbsolutePath:返回文件所在的绝对路径

isDirectory:代表File对象所代表的是否是一个目录

createNewFile():根据File对象,自动创建一个空文件,创建成功后返回true

getName():返回File类对象的纯文件名

getParent:返回File类对象父级目录文件路径

mkdir:创建File对象代表的目录(只能一级一级地创建)

mkdirs:创建File对象代表的目录,如果必要,会创建中间目录(如果上一级路径不存在的话,会先创建出上一级路径)

createNewFile():

public class IODemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("./text.txt");
        file.createNewFile();
    }
}

mkdir:

public class IODemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("./aaa");
        file.mkdir();
    }
}

mkdirs():

public class IODemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("./aaa/bbb/ccc/ddd");
        file.mkdirs();
    }
}

getAbsolutePath:

public class IODemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("./aaa/bbb/ccc/ddd");
        file.mkdirs();
        System.out.println(file.getAbsolutePath());
    }
}

字节流

读文件(InpurStream)

public static void main(String[] args) throws IOException {
    File file = new File("D:/text.txt");
    InputStream inputStream = new FileInputStream(file);
    while(true){
        int b = inputStream.read();
        if(b == -1){
            break;
        }
        System.out.print((char)b+" ");
    }
}

read()方法:

read无参时,一次读一个,当读完时返回-1

当然也可以提供一个字节数组,将读的内容先放在这个数组中,那么一次读的个数就是字节数组的长度,减少了读的次数,提高了效率

public static void main(String[] args) throws IOException {
    File file = new File("D:/text.txt");
    InputStream inputStream = new FileInputStream(file);
    while(true){
        byte[] bytes = new byte[5];
        int b = inputStream.read(bytes);
        if(b == -1){
            break;
        }
        System.out.print(Arrays.toString(bytes));
    }
}


写文件(OutputStream)

public static void main(String[] args) throws IOException {
    File file1 = new File("D:/text2.txt");
    OutputStream outputStream = new FileOutputStream(file1);
    byte[] bytes = {97,98,99,100,101,102};
    outputStream.write(97);
    outputStream.write(98);
    outputStream.write(99);
    outputStream.write(100);
    outputStream.write(101);
}


当然写文件也可以传字节数组,一次性写多个

public static void main(String[] args) throws IOException {
    File file1 = new File("D:/text2.txt");
    OutputStream outputStream = new FileOutputStream(file1);
    byte[] bytes = {97,98,99,100,101,102};
    outputStream.write(97);
    outputStream.write(98);
    outputStream.write(99);
    outputStream.write(100);
    outputStream.write(101);
    outputStream.write(10);//换行的ASCII码值为10 
    outputStream.write(bytes);
}


字符流

读文件(Read)

public static void main(String[] args) throws IOException {
    File file = new File("D:/text.txt");
    Reader reader = new FileReader(file);
    while(true){
        int b = reader.read();
        if(b == -1){
            break;
        }
        System.out.print((char)b+" ");
    }
}

代码结构与字节流类似


写文件

public static void main(String[] args) throws IOException {
    File file = new File("D:/text.txt");
    Writer writer = new FileWriter(file);
    writer.write(100);
    writer.write(101);
    writer.write(101);
    writer.write(101);
    writer.write(101);
}

代码结构依然和字节流类似,但是这次的执行结果出现了问题

我们发现文件里面并没有写数据,这是为什么呢?

--->:这是由于Writer处理数据的时候会用到缓冲区,当我们用到流资源的时候,用完之后是要将流对象资源关闭的(close),而这个操作就会同时带动缓冲区的刷新。

所以字节流和字符流的区别也就在这:字节流即使没有执行关闭流对象操作,其结果依然运行得出来,而字符流就不行了,需要刷新缓冲区才能看得见结果,这里我们可以使用flush方法和close方法均可。

相关题目

1.给出搜索目录,删除指定文件

package IO;

import java.io.File;
import java.util.Scanner;

//删除指定文件
public class IODemo1 {
    public static void main(String[] args) {
        System.out.println("请输入路径");
        Scanner sc = new Scanner(System.in);
        File root = null;
        while (true) {
            String basePath = sc.next();
            root = new File(basePath);
            if (!root.isDirectory()) {
                //路径错误或者是个文件
                System.out.println("路径错误,请重新输入");
            } else {
                break;
            }
        }
        System.out.println("请输入要删除的文件名");
        String nameToDelete = sc.next();

        scanDir(root, nameToDelete);
    }
        public static void scanDir(File root,String nameToDelete){
            File[] files = root.listFiles();
            if(files == null){
                //双击后目录为空
                return;
            }else{
                for(File file : files){
                    if(file.isDirectory()){
                        //还是目录
                        scanDir(file,nameToDelete);
                        //打印递归过程
                        System.out.println(file.getAbsolutePath());
                    }else{
                        if(file.getName().equals(nameToDelete)){
                            System.out.println("找到文件,是否确定删除");
                            System.out.println("Y : 确定  N : 取消");
                            Scanner sc = new Scanner(System.in);
                            String option = sc.next();
                            if(option.equals("Y")){
                                file.delete();
                                System.out.println("删除成功");
                                return;
                            }
                            if(option.equals("N")){
                                System.out.println("取消成功");
                                return;
                            }
                        }
                    }
                }
                System.out.println("没有找到该文件");
            }
        }
}


2.拷贝文件

//复制文件
public class IODemo2 {
    public static void main(String[] args) throws IOException {
        try(InputStream inputStream = new FileInputStream("D:/code/tmp/fsh.jpg");
            OutputStream outputStream = new FileOutputStream("D:/code/fsh1.jpg")){

            while(true){
                byte[] bytes = new byte[1024];
                int b = inputStream.read(bytes);
                if(b == -1){
                    break;
                }
                outputStream.write(bytes);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值