java中InputStream, OutputStream 的用法

news2024/9/19 10:34:22

  java针对文件的操作有两种1.文件系统操作 File类指定的路径可以使一个不存在的路径。2,文件内容操作,流对象。

  流也分为两种1)字节流(二进制文件):以字节为基本单位读写的使用InputStream()和OutputStream进行读写。

 2) 字符流(文本文件):以字符为基本读写单位使用Reader() 和 Writer()进行读写。

  文件操作内容有很多,比如打开文件,关闭文件在java中允许一种方法是为了防止我们打开过多的文件导致指定进程描述符表长度不够实用导致程序出现问题,因为每打开一个文件,都需要消耗制定进程描述符表上的一个项文件描述符表的长度是有限的(不同的系统不一样,也是可以配置的)。

        try(InputStream inputStream = new FileInputStream("./test.txt")){
            
        }catch(IOException e){
            e.printStackTrace();
        }

    通过这种方法我们在try{}内部就可以使用我们所打开的文件除了try的{}那么这个文件将会自动关闭,避免因为开启的文件过多导致文件描述符表不共用,当然我们也可以通过close()方法直接关闭,但是当使用这种方法的时候要注意当代码比较多的时候,不要忘记关闭文件。

在文件中我们可以使用read()方法进行读操作,这种方法有三种形式:

  接下来我们逐个介绍,没有参数的read()方法 :

   这个方法有一个int类型的返回值,表示的是读取的字节个数,如果个数在0到255之间,表示读取的字节的ASCll值,如果达到流的末尾,则返回-1,表示没更多的数据可供读取,它的用法也十分简单:

 public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        file.createNewFile();
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            int n = inputStream.read();
            while(n!=-1){
                System.out.println((char)n);
                n = inputStream.read();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

 通过这种方式我们就可以访问test.txt中的内容了,如果文件中是 此类数据:

那么返回的是各个字符的ASCll值,强转为char类型后自然就是一个字节,但是如果文本文件里是字符那么就无法通过这种方式进行输出了,因为在java中字符所占字节是有所不同的,比如汉字等字符。

  如果是汉字

  需要通过另一方式更好描述:

 

public static void main(String[] args) throws IOException {
        File file = new File("./test.txt");
        file.createNewFile();
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            int n = inputStream.read();
            while(n!=-1){
                System.out.println(Integer.toHexString(n));
                n = inputStream.read();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

 通过这种方式运行结果为:

   由此可知一个汉字占据三个字节,接下来的方法我们使用字母来表示更加简单一些,至于汉字的读写我们有其他的方法进行表述之后我们会逐一进行介绍。

 read(byte[] b)  这个版本可以理解为工厂不仅有输出还有输入,将所读的内容输入到 b 数组中,我们可以同过访问b数组中的内容即可知到文件中的内容,需要贴别注意的是这里的数组不一定会用完也可能会有剩余,:

public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            byte[] buf = new byte[1024];
            while(true){
                int n = inputStream.read(buf);
                if(n==-1) break;;
            }
            System.out.println(Arrays.toString(buf));

        }catch(IOException e){
            e.printStackTrace();
        }
    }

   通过这种方式就把test.txt文件中的内容以ASCll值形式存储到buf数组当中了,输出的结果为:

 

  文件里放的为:aaabbbccddd所以他们的ASCll值预支对应,我们可以看到buf数组显然没有用完仍有很大一本分没有使用。 

 read(byte[] b,int off,int len)在这里off :从数组的哪个偏移量开始存储数据,len:要读取道德最大字节数注意这里的len包含off,假设len原本位置为a也就意味这len = off+a也就意味这len不能草果数组的长度;

 public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./test.txt")){
            byte[] buf = new byte[1024];
            while(true){
                int n = inputStream.read(buf,0,buf.length);
                if(n==-1) break;;
                for (int i=0;i<n;i++){
                    System.out.println(buf[i]);
                }
            }

        }catch(IOException e){
            e.printStackTrace();
        }
    }

   这种方法的结果同只有一个参数的方法作用效果除了变异量的差别其他的并无二异,方法是从0偏移量为0开始存储的所以,这里第一次直接将文本中的内容放到buf数组当中,第二次n等于-1循环停止,过程结束;

OutputStream 写文件

写文件同样也有许多方法:

   写文件有这三个冲在版本使用同输出相比是大同小异;

 

  1. write(int b): 写入一个字节(范围从 0 到 255)。
  2. write(byte[] b): 将字节数组写入输出流。
  3. write(byte[] b, int off, int len): 从字节数组的指定偏移量 (off) 开始写入指定长度 (len) 的字节。

 相对应的是write(byte[] b)是只输入不输出,数组b中的内容放到文本文件中后就结束了。

   需要特别注意的是这里每输入一次文本中的内容就重置一次,如果我们想要保存我们之前输入的内容,那么我们需要加入一个参数true:

 public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("./test.txt",true)){

        }catch(IOException e){
            e.printStackTrace();
        }
    }

  通过这种方式我们就可以不断地进行输入并保存我们之前输入过的内容。

  另外读取文件是还有一个十分有用的工具类Scanner:

 public static void main(String[] args) {
        File file = new File("./test.txt");
        try(OutputStream outputStream = new FileOutputStream("./test.txt",true)){
            Scanner scanner = new Scanner(file);
            String str = scanner.next();
            System.out.println(str);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

   通过这种方式就更好的读取文本,并可以方便地进行分隔和格式化。 

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

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

相关文章

什么是kafka的重平衡机制?

背景 kafka重平衡的主要发生在消费者端&#xff0c;重平衡的目的&#xff0c;主要是为了均衡消费者消费kafka的消息而设计的&#xff0c;对于动态加入消费者&#xff0c;减少消费者&#xff0c;以及消息分区变化这些场景中&#xff0c;若不设计消费者重平衡&#xff0c;容易出…

第十五章 数据管理成熟度评估

定义&#xff1a; 能力成熟度评估: 是是一种基于能力成熟度模型框架的能力提升方案&#xff0c;描述了数据管理能力初始状态发展到最优化的过程。 数据管理成熟度评估&#xff1a;&#xff08;Data Management Maturity Assessment&#xff0c; DMMA&#xff09;可用于全面评估…

MySQL——数据表的基本操作(一)创建数据表

数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表。需要注意的是&#xff0c;在操作数据表之前&#xff0c;应该使用 “ USE 数据库名 ” 指定操作是在哪个数据库中进行&#xff0c;否则会抛出 “ No database selected ” 错误。创建数据表…

大路灯护眼灯有必要买吗?五款护眼大路灯推荐

大路灯护眼灯有必要买吗&#xff1f;许多消费者对护眼大路灯的了解不够&#xff0c;总是被不专业产品“耍”得团团转。就比如市面上很多声称用了眼睛就不近视的产品&#xff0c;实际上它们毫无专业技术沉淀&#xff0c;还疏于调校光线稳定性、光线均匀度等上百项核心参数&#…

【海贼王航海日志:前端技术探索】HTML你学会了吗?(二)

目录 1 -> HTML常见标签 1.1 -> 表格标签 1.1.1 -> 基本使用 1.1.2 -> 合并单元格 1.2 -> 列表标签 1.3 -> 表单标签 1.3.1 -> form标签 1.3.2 -> input标签 1.4 -> label标签 1.5 -> select标签 1.6 -> textarea标签 1.7 -> …

C++类和对象——中

1. 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载不…

数字孪生赋能智慧城市大脑智建设方案(可编辑65页PPT)

引言&#xff1a;随着科技的飞速发展&#xff0c;智慧城市的建设已成为全球城市发展的新趋势。数字孪生技术作为其中的关键技术之一&#xff0c;正逐步赋能智慧城市大脑的建设&#xff0c;推动城市治理从数字化向智能化、智慧化转型升级。本方案旨在简要介绍数字孪生赋能智慧城…

“七人拼团:共赢与互助的奖励之旅“

在七人拼团策略中&#xff0c;其精心构建的奖励体系无疑是吸引并激励参与者踊跃参与的核心驱动力。接下来&#xff0c;我们将深入剖析该策略中三种核心奖励类型——直推奖、滑落奖与团队奖&#xff0c;并探讨它们如何促进成员间的互助合作机制。 奖励体系深度剖析 直推奖&…

python爬虫实践

两个python程序的小实验&#xff08;附带源码&#xff09; 题目1 爬取http://www.gaosan.com/gaokao/196075.html 中国大学排名&#xff0c;并输出。提示&#xff1a;使用requests库获取页面的基本操作获取该页面&#xff0c;运用BeautifulSoup解析该页面绑定对象soup&#x…

股票多因子模型实战之因子行业中性化(附python代码)

原创文章第607篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 今天开始&#xff0c;咱们从ETF、可转债正式转到大家最熟悉、最常见的股票市场。 而且切入的方向&#xff0c;仍然是——“多因子模型”。 01 什么是因子&#xff1f; 因子是什么…

qml教程:qml视频播放组件介绍

更多qml教程,请参考QML入门进阶教程专栏:https://mingshiqiang.blog.csdn.net/category_9951228_2.html 文章目录 MediaPlayerVideoOutput视频播放代码示例增加视频效果图片二值化处理视频帧本篇博客介绍qml如何播放视频,以及视频特效处理。 本篇博客提供的代码全部通过Qt6.…

64位Office API声明语句第121讲(终了)

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

【Mind+】掌控板入门教程02 趣味相框

光影重叠&#xff0c;时间和回忆定格在在一张张相片里。人们通常会用相框把相片装裱起来&#xff0c;展示在家中或者工作的地方&#xff0c;来回味往日的美好时光。但是一个相框只能放一张照片&#xff0c;怎么才能让它展示不同的照片呢&#xff1f;正好此时我们的手边有一块掌…

Python 爬虫项目实战(一):破解网易云 VIP 免费下载付费歌曲

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

World of Warcraft [RETAIL] UI Setting

/*测试魔兽世界正式服&#xff0c;界面UI编辑器&#xff0c;UI布局文本 World of Warcraft [RETAIL] UI Setting开头的&#xff1a;1 39 某种类型 &#xff1a; 序号&#xff08;默认-1&#xff0c;有多个从0开始计数0,1,2,3 未知类型 未知类型 未知类型 控件类型&#xff1…

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.8项目管理知识领域

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

vue2-04-利用VueCli脚手架搭建vue2项目步骤、目录解读、eslint缩进配置、自适应配置、less

目录 前置信息创建vue2项目目录解读在VSCode中启动项目eslint配置自适应配置&#xff08;px自动转rem&#xff09;less配置 前置信息 我用的代码编译器是VSCode&#xff0c;node版本是16.20.2&#xff0c;npm版本是8.19.4&#xff0c;项目选用的是less预处理&#xff0c;npm安…

EyouCMS响应式高端网站建设互联网营销网站模板/易优CMS网站建设类企业网站模板源码

EyouCMS响应式高端网站建设互联网营销网站模板&#xff0c;易优CMS网站建设类企业网站模板源码。适用于IT、软件、互联网、游戏类企业网站建设使用。 模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手工书写DIVCSS&#xff0c;完美兼容IE7、Firefo…

链式二叉树的实现

文章目录 &#x1f3af;引言&#x1f453;链式二叉树的实现1.链式二叉树的结构2.链式二叉树相关操作实现2.1源码展示2.2函数实现详解2.2.1前中后序遍历2.2.2二叉树的其他方法实现2.2.3二叉树的层序遍历和判断是否是完全二叉树 &#x1f947;结语 &#x1f3af;引言 欢迎来到Ha…

论文笔记:InternImage—基于可变形卷积的视觉大模型,超越ViT视觉大模型,COCO 新纪录 64.5 mAP!

文章信息 Title&#xff1a;InternImage: Exploring Large-Scale Vision Foundation Models with Deformable ConvolutionsPaper Link&#xff1a;https://arxiv.org/abs/2211.05778 Code Link&#xff1a;https://github.com/OpenGVLab/InternImage 写在前面 拿到文章之后先看…