java中InputStream, OutputStream 的用法

  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.rhkb.cn/news/389991.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…

DB-Engines Ranking 2024年8月数据库排行

DB-Engines Ranking 2024年8月数据库排行 DB-Engines排名根据数据库管理系统的受欢迎程度进行排名。排名每月更新一次。 2024年8月&#xff0c;共有423个数据库进入排行。 排行榜 前15名趋势图 关系型数据库前 10 名 键值数据库前 10 名 文档数据库前 10 名 时序数据库前 10 …

Google引领LLM竞赛:Gemini 1.5 Pro的创新与突破

在科技领域&#xff0c;语言模型&#xff08;LLM, Large Language Model&#xff09;的发展总是备受瞩目。多年来&#xff0c;Google在这场竞赛中一直处于追赶的状态&#xff0c;但这一次&#xff0c;他们终于站在了领先的位置。Google近日发布了Gemini 1.5 Pro实验版本&#x…

Nginx进阶-常见配置

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…

Unity后处理(Post-processing)

Unity post-processing 就像是对图片采用滤镜一样&#xff08;如下图对比&#xff09;对当前场景显示做一定的显示处理&#xff0c;使得场景更漂亮、有趣或者有型。 视觉风格与视觉保真 游戏场景后处理能够达到所需的视觉风格&#xff08;visual style&#xff09;同时也保证视…

文件解析漏洞

IIS解析漏洞 在windows Server 2003安装iis 1.IIS6.X 1.1 目录解析 在网站下建立文件夹的名字为 .asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 先创建一个1.asp文件夹 再创建一个1.txt 里面写 <%now()%> 2.1 畸形文件…

DTU、RTU和边缘计算网关的联系与区别

在工业4.0发展浪潮中&#xff0c;物联网助力工业逐渐向智能化发展&#xff0c;各种工业设备相互连接起来形成物联网。而传输层作为物联网体系中十分重要的一环&#xff0c;它是连接物理世界与数字世界的桥梁&#xff0c;是数据的第一入口。 其中&#xff0c;我们经常会使用到三…

jQuery入门(五)Ajax和json

一、Ajax 简介 AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML。 本身不是一种新技术&#xff0c;而是多个技术综合。用于快速创建动态网页的技术。 一般的网页如果需要更新内容&#xff0c;必需重新加载个页面。 而 AJAX 通过浏览器与服务器进行…

windows内存泄漏检查汇总

VLD(Visual Leak Detector) 下载 官方下载地址2.5 另一分支2.7 安装 点击运行安装

苹果手机升级iOS18测试版本后使用体验不好?怎么降级?

近期苹果发布了诸多的iOS18版本给用户提前尝鲜测试&#xff0c;许多果粉们都迫不及待的选择了升级&#xff0c;但是有不少的果粉升级时没有考虑到设备适配性问题&#xff0c;导致升级之后手机变得有些卡顿&#xff0c;使用体验不好时&#xff0c;想要降级回到正式的版本&#x…

ubuntu安装nginx以及php的部署

1.安装依赖包 apt-get install gcc apt-get install libpcre3 libpcre3-dev apt-get install zlib1g zlib1g-dev sudo apt-get install openssl sudo apt-get install libssl-dev 2.安装nginx cd /usr/local mkdir nginx cd nginx tar -xvf nginx-1.21.6.tar.gz 3.编译…

【考研高数】反函数的那些事

在这里给同学们推荐来自「荒原之梦考研数学」网的三篇文章&#xff0c;分别是反函数的性质汇总&#xff0c;以及两道相关习题&#xff0c;有需要加强这部分练习的同学&#xff0c;可以点击下方链接&#xff0c;在「荒原之梦考研数学」官网中打开对应的文章&#xff1a; 《反函…

【算法】双指针-OJ题详解1

双指针-OJ题 移动零&#xff08;点击跳转&#xff09;原理讲解代码实现 复写零&#xff08;点击跳转&#xff09;原理讲解代码实现 快乐数&#xff08;点击跳转&#xff09;原理讲解代码实现 盛最多水的容器&#xff08;点击跳转&#xff09;原理讲解代码实现 有效三角形的个数…

C语言自定义类型结构体与位段超详解

文章目录 1. 结构体类型的声明1. 1 结构体声明1. 2 结构体变量的创建和初始化1. 3 结构体的特殊声明1. 3 结构体的自引用 2. 结构体内存对齐2. 1 对齐规则2. 2 为什么存在内存对齐2. 3 修改默认对齐数 3. 结构体传参4. 结构体实现位段4. 1 什么是位段4. 2 位段成员的内存分配4.…

吴恩达老师机器学习作业-ex7

导入库&#xff0c;读取数据&#xff0c;查看数据类型等进行分析&#xff0c;可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…

Java | Leetcode Java题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; class Solution {public String removeDuplicateLetters(String s) {boolean[] vis new boolean[26];int[] num new int[26];for (int i 0; i < s.length(); i) {num[s.charAt(i) - a];}StringBuffer sb new StringBuffer();for (in…

nginx续1:

八、虚拟主机配置 基于域名的虚拟主机 [rootserver2 ~]# ps -au|grep nginx //查看进程 修改Nginx服务配置&#xff0c;添加相关虚拟主机配置如下 1. [rootproxy ~]# vim /usr/local/nginx/conf/nginx.conf 2. .. .. 3. server { 4. listen …

第15课 Scratch少儿编程 入门篇:师生问候

师生问候 故事背景&#xff1a; 魔法学院的期末考核刚刚考完&#xff0c;魔法老师在教室里碰到小明&#xff0c;老师问小明考的怎么样&#xff1f; 程序原理&#xff1a; 找一个教室的背景&#xff0c;小精灵角色和魔法师的角色&#xff0c;将魔法师的角色造型左右反转&…

MyBatis 源码学习 | Day 1 | 了解 MyBatis

什么是 MyBatis 在对一项技术进行深入学习前&#xff0c;我们应该先对它有个初步的认识。MyBatis 是一个 Java 持久层框架&#xff0c;用于简化数据库的操作。它通过 XML 或注解的方式配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objects&#xff0c;普通…