《JavaEE》InputStream, OutputStream 的用法

news2024/11/19 19:37:08

目录

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();
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB函数封装1:生成QT可以调用的.dll动态链接库

在进行相关算法的开发和设计过程中,MATLAB具有特别的优势,尤其是对于矩阵运算的处理,具有很多现成的方法和函数可以进行调用,同时MATLAB支持把函数封装成不同的语言方便完成算法的集成。 这里记录利用MATLAB封装成C动态链接库&…

git 自学笔记

git 自学笔记 git 是一个开源的分布式版本控制软件,可以敏捷的处理任何大小项目。 git 的工作流程大体如下: 首先克隆一个git资源作为工作目录 在克隆的资源上添加或者修改文件 如果其他人也修改了,就要对资源进行更新 在提交时也要查看有没有…

通过使用生成对抗市场模型改进基于强化学习的交易的泛化

Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversarial Market Model | IEEE Journals & Magazine | IEEE Xplore Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversaria…

ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7

编辑:ll ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7 型号:ADG736BRMZ-REEL7 品牌:ADI /亚德诺 封装:MSOP-10 批号:2023 安装类型:表面贴装型 引脚数量:10 类型&#xff1…

c/c++:指针p+p-p*p/,数组a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针

c: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg 提…

IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

目录 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用 安装内核和模块到开发板上 Bootloader 介绍 编译 u-boot 镜像 为什么编译驱动程序之前要先编…

4.4 使用分组聚合进行组内计算

4.4 使用分组聚合进行组内计算 4.4.1 使用groupby方法拆分数据groupby方法的参数及其说明:groupby对象常用的描述性统计方法如下: 4.4.2 使用agg方法聚合数据agg函数和aggregate函数的参数说明1、使用agg求出当前数据对应的统计量2、使用agg分别求字段的…

X509证书中的Subject Public Key Info

SubjectPublicKeyInfo在TBSCertificate的第七项: 对于ECC id-ecPublicKey OBJECT IDENTIFIER :: { iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } id-ecPublicKey 是必须的 ECParameters :: CHOICE {namedCurve OBJECT IDENTIFIER -- implicitCurve NULL -…

java day10

第10章 创建Swing界面 10.1 Swing的特性10.1.1 标准对话框1. 确认对话框2. 输入对话框3.消息对话框4. 选项对话框 10.1.2 使用对话框10.1.3 滑块10.1.4 滚动窗格10.1.5 工具栏10.1.6 进度条10.1.7 菜单10.1.8 选项卡式窗格 10.1 Swing的特性 10.1.1 标准对话框 JOptionPane类…

HTML5 <rt> 标签、HTML5 <ruby> 标签

HTML5 <rt> 标签 实例 HTML5 <rt>标签用于表示为<ruby>标签中的注释内容。 一个 ruby 注释&#xff1a; <ruby> 漢 <rt> ㄏㄢˋ </rt> </ruby> 尝试一下 浏览器支持 IE 9、Firefox、Opera、Chrome 和 Safari 支持 <rt> 标…

增广拍卖——二跳页下的拍卖机制探索

1. 引言 本文提出的方案已被WSDM 2023接收&#xff0c;论文&#xff1a;Boosting Advertising Space: Designing Ad Auctions for Augment Advertising&#xff0c; 下载&#xff1a;https://dl.acm.org/doi/abs/10.1145/3539597.3570381 信息流产品为了保障用户体验通常会严格…

关于python爬虫解析的问题

在进行Python爬虫解析时&#xff0c;需要注意以下事项&#xff1a; 1、良好的网站使用协议&#xff1a;需要遵守网站的robots.txt文件&#xff0c;以确保你的爬虫程序不会将网站拦截下来。 2、编码问题&#xff1a;需要正确设置HTTP头和解析器的编码&#xff0c;以确保爬虫程…

低代码开发重要工具:jvs-logic(逻辑引擎)可视化设计要素

逻辑引擎可视化的交互 可视化的服务编排是逻辑引擎的核心功能&#xff0c;逻辑引擎的界面可视化设计是为了方便用户使用和操作逻辑引擎而设计的。一个好的界面设计能够提高用户的工作效率和使用体验&#xff0c;同时也能增加软件的可靠性和可维护性。 以下是逻辑引擎界面可视化…

python数据分析综合案列--星巴克门店数据分析及可视化

本实训针对一组关于全球星巴克门店的统计数据&#xff0c;分析了在不同国家和地区以及中国不同城市的星巴克门店数量。 获取数据&#xff0c;数据放在directory.csv 这个案例主要分为以下几个部分&#xff1a; 数据清洗和预处理&#xff1a;使用 Pandas 进行数据清洗和预处理&…

windows下安装emscripten

Qt系列文章目录 文章目录 Qt系列文章目录前言一、Emscripten SDK介绍二、Emscripten SDK安装Get the emsdk repoEnter that directory 前言 由于Web端需要处理大量图像&#xff0c;大量图片的分辨率8k*8k&#xff0c;使用Canvas API&#xff08;画布&#xff09;是在HTML5中新…

(二)app自动化脚本录制回放

上一篇&#xff1a;(一)app自动化测试环境搭建&#xff08;maciosairtest &#xff09;_airtest环境搭建_要开朗的spookypop的博客-CSDN博客 注&#xff1a;后续都是用IOS设备来介绍自动化测试&#xff0c;安卓就不赘述了。 接上一篇&#xff0c;搭建好自动化测试环境后&#…

如何去阅读Java源码,我总结了18条心法

大家好&#xff0c;我是Martin。 这篇文章我准备来聊一聊如何去阅读开源项目的源码。 在聊如何去阅读源码之前&#xff0c;先来简单说一下为什么要去阅读源码&#xff0c;大致可分为以下几点原因&#xff1a; 最直接的原因&#xff0c;就是面试需要&#xff0c;面试喜欢问源码…

Docker实战笔记4-安装jenkins

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130318679 本文出自【赵彦军的博客】 文章目录 拉取 jenkins 镜像排查问题验证结果总结 拉取 jenkins 镜像 在官方镜像仓库查询 jenkins 镜像 https://hub.docker.com/r/jenkins/jenkins 拉取镜…

linux 安装php8.1 ZipArchive和libzip最新版扩展安装

1、概述 安装前咱们先看下我本地环境 [rootelk php8]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.9 (Maipo) [rootelk php8]# [rootelk php8]# ./bin/php -v PHP 8.1.18 (cli) (built: Apr 17 2023 13:15:17) (NTS) Copyright (c) The PHP Group Z…

onnx手动操作

使用onnx.helper可以进行onnx的制造组装操作&#xff1a; 对象描述ValueInfoProto 对象张量名、张量的基本数据类型、张量形状算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)GraphProto对象用张量节点和算子节点组成的计算图对象ModelP…