《JavaEE》InputStream, OutputStream 的用法

本文介绍了Java中的File类用于表示文件和路径,以及如何进行文件的基本操作,如创建、删除、重命名。还讨论了路径的概念,包括绝对路径和相对路径。此外,讲解了InputStream和OutputStream的基础用法,如何读取和写入文件内容。文章提供了多个示例代码,帮助初学者理解和应用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

File类

路径

绝对路径

相对路径

InputStream和OutputStream的使用

InputStream基本用法

OutputStream基本用法

功能实现

我们先来尝试着使用一些File类完成一些基本操作

我们查看这个文本是否存在 如果不存在我们创建一个新的文本出来

在当前文件夹中创建一个新的目录级别的文件

 我们尝试查找一下D盘下的所有文件名 

尝试读取一个文本中的内容

输入内容推送到文本文件中

 实现方法2

实现一个磁盘检索内容功能(会查找文本中的内容)

实现将A文件中的内容拷贝到B文件中


👑作者主页:Java冰激凌
📖专栏链接:JavaEE

        File类的用法和InputStream、OutputStream的用法都是Java编程中非常常见的操作,它们都可以帮助我们进行文件的读写和操作。本篇博客将对这些类的用法进行总结,方便Java初学者更好地学习和应用。


File类

        Java中的File类用于表示文件名和路径的抽象表示 并且可以对于文件进行基本的操作

  1. 文件的创建 删除 重命名等基本操作
  2. 文件信息的获取 如文件的路径 名称 大小等
  3. 文件目录的操作 列出当前目录下的所有文件
  4. 文件的过滤和搜索 可以按照文件的大小 文件的类型  文件的修改时间 甚至文件的内容

 File的方法也是很多的 我们介绍一下基本用法

下面是我们File类的基本用法 

Flie(String path) 根据指定文件路径创建File对象

getParent() 返回File对象的父目录文件路径

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

getPath() 返回File对象的文件路径

getAbsolutePath() 返回File对象的绝对路径

getCanonicalPath() 返回File对象修饰过的绝对路径

exists()判断File对象描述的文件是否存在

isDirectory() 判断File对象代表的文件是否是一个目录

isFile() 判断File对象代表的文件是否是一个普通文件

delete() 根据File对象 删除该文件

list() 返回File对象代表的目录下的所有文件名

createNewFile() 创建文件


路径

        我们不得不来介绍一下我们路径

在Java中,我们可以使用File类来读写文件。在操作文件时,路径是非常重要的,路径可以指定要读写的文件的位置。Java中可以使用绝对路径和相对路径来指定文件的位置

而且在File中 我们使用到的路径分为两种 绝对路径和相对路径

绝对路径

        从根目录开始的完整路径,包括盘符或者根路径和文件名。在Windows平台上,绝对路径通常以盘符开始,如C:\Program  Files\Java\jdk1.8.0_211\bin\java.exe;在Linux平台上,绝对路径通常以斜杠(/)开始,如/usr/java/jdk1.8.0_211/bin/java。其中有意思的是 windouws是支持两种/或者\\的 那么这是为啥 其实这是一个历史遗留的问题 当初为了做出windouws的特色 就这么规定了 导致现在在win系统对于这个左斜杠和右斜杠的使用没有统一起来 当然win现在是都支持的

相对路径

相对路径是相对于当前工作目录的路径。在Java中,当前工作目录是指Java虚拟机运行的目录。在命令行中启动Java程序时,当前工作目录通常是启动命令所在的目录。在Eclipse等IDE中运行Java程序时,当前工作目录通常是Java项目的根目录。我们可以使用.表示当前目录,..表示上一级目录,例如./src/表示当前目录下的src目录,../src/表示当前目录的上一级目录下的src目录。
 

使用绝对路径和相对路径都可以指定文件的位置,但是相对路径受到工作目录的限制,如果当前工作目录发生了变化,相对路径的指向也会发生变化。因此,使用相对路径时需要留意当前工作目录的位置,建议使用绝对路径以保证文件路径的正确性。


InputStream和OutputStream的使用

        InputStream和OutputStream分别是输入流和输出流 所以说 InputStream是对应的输入流 OutputStream是输出流 他们是Java IO的核心之一 InputStream用于读取数据 OutputStream用于写入数据 这两个类也是JavaIO中最基本的抽象类 其他更高级的IO类都是建立在他们之上的

InputStream基本用法

·read():从输入流中读取一个字节的数据

·read(byte[] b):从输入流中读取数据到字节数组中(此方法的做法在Java中并不常见 传入一个数组然后在方法中进行填充)

·available():返回输入流中可用的字节数

·close():关闭输入流

OutputStream基本用法

·write():写入一个字节的数据

·write(byte[] b):写入字节数组b到输入流中(也是比较特殊 但是是比较常用的之一)

·flush():刷新缓存池/将所有缓存的数据写入输出流中

·close():关闭输出流


功能实现

        我们来尝试着使用以上来完成一些操作

我们先来尝试着使用一些File类完成一些基本操作

public static void main (String[] args) throws IOException {
        File f = new File("./hello.txt");
        System.out.println(f.getParent());
        System.out.println(f.getPath());
        System.out.println(f.getName());
        System.out.println(f.getAbsoluteFile());
        System.out.println(f.getCanonicalFile());
    }

 

我们查看这个文本是否存在 如果不存在我们创建一个新的文本出来

public static void main (String[] args) throws IOException {
        File file = new File("./baga.txt");
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        System.out.println(file.exists());//是否存在
        if(!file.exists()){//如果不存在我们创建一个新的baga文本
            file.createNewFile();
        }
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        System.out.println(file.exists());//是否存在
    }

 

在当前文件夹中创建一个新的目录级别的文件

    public static void main (String[] args) {
        File file = new File("./aaa/bbb/ccc");
        //file.mkdir();
        //如果要创建多级目录 那么使用mkdir会创建失败 要使用mkdirs
        file.mkdirs();
    }

效果展示


 

 我们尝试查找一下D盘下的所有文件名 

list不会带索引 返回的是一个文件名 listFiles会带索引 返回的是文件

 public static void main (String[] args) {
        File file = new File("d:/");
        String[] list = file.list();
        System.out.println(Arrays.toString(list));
        File[] files = file.listFiles();
        System.out.println(Arrays.toString(files));
    }

 

尝试读取一个文本中的内容

public static void main (String[] args) {
        try(InputStream inputStream = new FileInputStream("d://hello.txt")){
            while(true){
                int b = inputStream.read();
                if(b == -1){
                    break;
                }
                System.out.print(b + " ");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

输入内容推送到文本文件中

public static void main (String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("D:\\hello.txt");
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        outputStream.write(str.getBytes());
        outputStream.flush();
    }

 实现方法2

public static void main (String[] args) {
        try(OutputStream outputStream = new FileOutputStream("D://hello.txt")) {
            PrintWriter printWriter = new PrintWriter(outputStream,true);
            //此处将printWriter设置为了自动刷新 就不需要最后的刷新了
            Scanner scanner = new Scanner(System.in);
            String str = scanner.nextLine();
            printWriter.println(str);
            //printWriter.flush();
            System.out.println("写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

实现一个磁盘检索内容功能(会查找文本中的内容)

 public static void main (String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查找的路径(绝对路径或相对路径都可以)");
        File file = new File(scanner.next());
        System.out.println("请输入要索引的内容");
        String str = scanner.next();
        if(!file.isDirectory()){//如果当前索引的不是一个目录 则直接返回
            System.out.println("您输入的路径不是一个目录!");
            return ;
        }
        //使用一个函数递归去查找
        isFiles(file,str);

    }

    private static void isFiles (File file , String str) throws IOException {
        if(file ==  null){
            return ;
        }
        File[] files = file.listFiles();
        for(File f : files){
            if(f.isFile()){//如果当前是一个普通文件 则打开进行访问
                //查找是否存在
                if(isContentContains(f,str)){
                    System.out.println(f.getCanonicalFile() + "存在索引的内容");
                }
            }else if(f.isDirectory()){//如果当前是一个目录 则进入递归
                //递归
                isFiles(f,str);
            }else {
                continue;
            }
        }
    }

    private static boolean isContentContains (File f , String str) {
        if(f == null){
            return false;
        }
        StringBuilder stringBuilder = new StringBuilder();
        try(InputStream inputStream = new FileInputStream(f)) {
            while(true){
                int b = inputStream.read();
                if(b == -1){
                    break;
                }
                stringBuilder.append((char)b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString().contains(str);
    }

我们这么写是比较低效率的 此处会存在大量的递归


实现将A文件中的内容拷贝到B文件中

 public static void main (String[] args) {
        try(InputStream inputStream = new FileInputStream("D://shuai.txt");
            OutputStream outputStream = new FileOutputStream("D://hello.txt")) {
            byte[] bytes = new byte[1024];
            inputStream.read(bytes);
            outputStream.write(bytes);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java冰激凌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值