1、字节流详解

文章目录

  • 一、字节流
    • 1、字节输出流:OutputStream
    • 2、字节输入流:InputStream
    • 3、使用字节流复制数据
    • 4、字节缓冲流

一、字节流


文件字节流
字节流的两个抽象父类:字节输出流:OutputStream字节输入流:InputStream


1、字节输出流:OutputStream

这个抽象类是表示字节输出流的所有类的超类。 输出流接收输出字节并将其发送到某个接收器。
  • 查看API可以知道,字节流写数据一共有三种方式:
    • public void write(int b) :写入一个字节
    • public void write(byte[] b):写入一个字节数组
    • public void write(byte[] b,int off,int len):写入一个字节数组的一部分
    • close():关闭此文件输入流,并释放与流相关的所有系统资源

  • 使用字节输出流写入数据:使用 OutputStream 它的子类 FileOutputStream
    • FileOutputStream 类的构造方法:
      • FileOutputStream(File file)
      • FileOutputStream(String name)


  • 字节输出流写入数据的操作步骤:
    • 第一步:创建字节输出流对象 ,并指定文件路径,不指定文件路径默认在项目路径。如果该路径没有该文件,创建字节输入流对象会将该文件创建出来
    • 第二步:用输出流对象点 write() 方法,根据传入的参数确认调用的那个写入的方法,并将参数内容写入流对象指定的文件中
    • 第三步:关闭流对象

  • Demo代码示例

     public class FileOutputStreamDemo {public static void main(String[] args) throws IOException {// 创建字节输出流对象(FileOutputStream的这两种构造方法效果是一样的用那个都可以)// FileOutputStream(File file)// File file = new File("fos.txt");// FileOutputStream fos = new FileOutputStream(file);//构造方法: FileOutputStream(String name)FileOutputStream fos = new FileOutputStream("fos.txt");try {// 调用write()方法,向fos文件中写入数据,写入一个字节fos.write(97); //输出结果是97 -- 底层二进制数据 -- 通过记事本打开 -- 找97对应的字符值 -- a//换行fos.write("\r\n".getBytes());//public void write(byte[] b):写一个字节数组byte[] bys={97,98,99,100,101};fos.write(bys);//输出结果是abcde//换行fos.write("\r\n".getBytes());//public void write(byte[] b,int off,int len):写一个字节数组的一部分,存储数据下标范围fos.write(bys,1,3);//输出结果是bcd//换行fos.write("\r\n".getBytes());//调用write()方法,向fos文件中写入数据,写入一段字符串并转换成 Byte 数组fos.write("HelloWorld\t".getBytes());fos.write("JAVA\t".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//释放资源,这一步很重要,如果不关闭流,流对象就会始终存在,占用的内容空间!!!//关闭此文件输出流并释放与此流有关的所有系统资源。fos.close();}}
    }
    

运行结果:
在这里插入图片描述

运行程序,完成之后刷新项目,就可以看到创建的fos.txt的文件,并且里面的内容是写入数据的内容 :
a
abcde
bcd
HelloWorld	JAVA

最后,为什么使用完流之后一定要使用 close() 方法将流关闭呢?
如果不关闭流,流对象就会始终存在,占用的内容空间!所以使用该方法让流对象变成垃圾,这样就可以被垃圾回收器回收了。

       字节输出流操作步骤:
              A:创建字节输出流对象
              B:写数据
              C:释放资源


       我们在写代码时候,一定要先将问题总结出来,不然容易将自己搞得很混乱,代码质量也不高。所以要一步一步的将功能的整体实现步骤总结出来,这样会让你的思路更清晰,代码写的更流畅!


2、字节输入流:InputStream

这个抽象类是表示字节输入流的所有类的超类。
  • 使用字节输入流读取数据:使用 InputStream的子类FileInputStream

    • FileInputStream 类的构造方法
      • FileInputStream(File file)
      • FileInputStream(String name)
    • FileInputStream的成员方法
      • public int read():一次读取一个字节
      • public int read(byte[] b):一次读取一个字节数组
  • 字节输入流读取数据的操作步骤:

    • 第一步:创建字节输入流对象 ,并指定文件路径,不指定文件路径默认在项目路径。如果该路径没有该文件,便会报出找不到文件的错误
    • 第二步:调用read()方法读取数据,并把数据显示在控制台
    • 第三步:关闭流对象

  • Demo代码示例
//读取数据//字节读取流
public class Demo02_IO_FileInputStream {public static void main(String[] args) throws IOException {//创建字节输入流对象,并且在 () 中填写文件名称,在创建对象时会在指定项目中已经存在的文件,准备读取文件中内容FileInputStream fileInputStream = new FileInputStream("fos.txt");/*数据量小时候使用单个字节读取即可,假如我们要读取字节数比较大的文件的时候,我们就不能一次读取一个字节了,就要一次读取一个字节数组。并且因为中文在utf-8编码中文占三个字节,GBK占两个字节,所以单个字符读取会乱码
*//*   int in = 0;// 读取,赋值,判断while ((in =  fileInputStream.read()) != -1){System.out.print((char) in);}*/try {//数据量大时,推荐使用下面这个方法,读取快且不会乱码// 数组的长度一般是1024或者1024的整数倍//注:此处数组长度设置为1024的原因,是因为 read(byte[] b)方法一次读取的是一整个字节数组,也就是一次读取1024个字节byte[] bys = new byte[1024];int len = 0;while ((len = fileInputStream.read(bys)) != -1) {System.out.print(new String(bys, 0, len));}} catch (IOException e) {e.printStackTrace();} finally {// 释放资源fileInputStream.close();}}
}

运行结果:在这里插入图片描述




3、使用字节流复制数据


学习了文件操作类 File 类,以及上面的字节流读取和写入数据,接下来学习如何使用 File 类和字节流读取和写入数据实现数据的复制功能。

               在实现复制功能时候,需要注意两点:
               1、数据源:从哪里来
                            从 fos.txt 中读取数据,然后将读取到的数据存储到 FileInputStream 对象中。
               2、目的地:到哪里去
                            通过 FileOutputStream 对象找到数据封装地,然后将从数据源读取出来的数据写入数据封装地。

Demo代码示例:

   
public class IO_CopyFile {public static void main(String[] args) throws IOException{IO_CopyFile  cf  = new IO_CopyFile ();cf .copyFile();}//公共变量FileInputStream copy = null;FileOutputStream paste = null;// 文件复制方法public void copyFile() throws IOException{try {//指定封装数据源,该数据源需要是真实存在的,从该数据源中获取数据copy = new FileInputStream("fos.txt");//指定封装目的地,将从数据源获取到的数据存储在此文件中paste = new FileOutputStream("copy.txt");//使用这个方法可以将文件复制过去,但是效率会很慢,一个字节一个字节复制/*  int by = 0;while ((by = copy.read()) != -1) {paste.write(by);}*///在实际开发中要是写复制文件的功能的话通常使用下面这个方法,一个复制1024个字节,会大大提升复制的效率// 数组的长度一般是1024或者1024的整数倍byte[] bys = new byte[1024];int len = 0;//copy对象调用read(),将copy对象所指定的文件中的字节数据内容读取出来,并存储在len变量中while ((len = copy.read(bys)) != -1) {//paste对象调用write方法,将len变量中的内容写入paste对象所指定的文件中paste.write(bys, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {// 释放字节输出流和输入流资源copy.close();paste.close();}}
}

运行结果:
项目路径下会出现新创建的封装地文件–copy.txt
在这里插入图片描述

并且也成功的将文件内的数据复制到了封装地文件中。
在这里插入图片描述





4、字节缓冲流

在实现字节流复制数据的时候,可以发现字节一个一个读取和写入数据的效率要比一次读取和写入一个数组的效率要低。这是因为数组有着缓冲区的效果,所以使用数组读写数据会有效的提高效率。
       java 本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式),所以提供了字节缓冲区流。
       这种类被称为:缓冲区类(高效类),其实和字节输入流和输出流的使用方法差不多,就是在原本的基础上提供了一个缓冲区。有效的提高我们在使用 IO 流时数据的流通效率。
  • 缓冲区类(高效类)
    • 字节缓冲输出流

      • BufferedOutputStream
        • 使用字节缓冲输入流写入数据
          • Demo代码示例:
            public class BufferedOutputStreamDemo {public static void main(String[] args) throws IOException {// BufferedOutputStream(OutputStream out)// 创建字节缓冲输出流对象,将字节输出流对象放入缓冲区中BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));// 写数据bos.write("hello".getBytes());// 释放资源bos.close();}
            }
            
            运行结果:
            在这里插入图片描述
    • 字节缓冲输入流

      • BufferedInputStream
    • 使用字节缓冲输入流读取数据

      • Demo代码示例:
        	public class BufferedInputStreamDemo {public static void main(String[] args) throws IOException {// BufferedInputStream(InputStream in)// 创建字节缓冲输入流对象,将字节输入流对象放入缓冲区中BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "bos.txt"));// 读取数据byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {// 将读取出来的数据打印在控制台System.out.print(new String(bys, 0, len));}// 释放资源bis.close();}}
        
        运行结果:
        在这里插入图片描述

  • 使用字节缓冲流复制数据
    • Demo代码示例:
        public class BufferedCopy {public static void main(String[] args) {BufferedCopy bc = new BufferedCopy();bc.bfCopy();}public void bfCopy(){BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//数据源bis = new BufferedInputStream(new FileInputStream( "bs.txt"));//封装地bos = new BufferedOutputStream(new FileOutputStream("copyBs.txt"));byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {try {bis.close();} catch (IOException e) {e.printStackTrace();}try {bos.close();} catch (IOException e) {e.printStackTrace();}}}}
    

运行结果:
在这里插入图片描述

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

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

相关文章

PS美工教程:制作真实水面倒影效果详细步骤

倒影效果是电商海报和广告类海报常用的表现手法,倒影可以填充画面的空白区域和营造真实的视觉感受,给受众带来更好的视觉体验。 在海报合成中倒影效果可谓是必不可少的存在,那今天潇洒模具学院的老师就教大家通过PS自带的功能打造出真实的环…

CSS图片倒影效果

先看一下效果图 废话不多说直接上代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style lang"scss">img {-webkit-box-reflect: below 0px -webkit-linear-gradient(bottom, rgba(25…

3、水面倒影效果

水面倒影效果 概要 我们会使用 Matplotlib 的 pyplot 模块创建图并显示图像&#xff1a; 用以下魔术命令&#xff0c;以便将图像显示在笔记本中而不是在新的显示窗口中&#xff1a; 如果要显示彩色图像&#xff0c;可以使用以下命令将图像从 BGR 转换为 RGB。 最后使用 plt…

CSS3实现倒影效果

css的功能很强大&#xff0c;可以实现很多效果。比如图像的倒影和文字的倒影等&#xff0c;利用的是box-reflect&#xff0c;因为浏览器兼容问题&#xff0c;目前主要采用-webkit-box-reflect来实现&#xff08;谷歌浏览器&#xff09;。 倒影的属性&#xff1a; box-reflect&…

HTML里面设置文本倒影,文字倒影怎么做

现在的文字如果仅仅是在一个平面上,不加任何效果,那就真的是太死板、太单调了,尤其追求艺术的小伙伴们啊,细心的话你就会发现那些神马广告之类的文字都讲究有个性,让人过目不忘的效果,有木有!那么接下来就教大家制作文字效果,就是文字倒影效果制作。广告时间: 人物素描…

倒影(reflections)效果的实现

1、简介 当站在湖畔岸边或者镜子面前的时候&#xff0c;都可以看到倒着的自己&#xff0c;那种效果就叫倒影&#xff0c;或者叫镜面反射。在SPE中也支持这种效果&#xff0c;实现的基本思路是把物体根据反射平面镜像之后再绘制一遍&#xff0c;绘制镜像时有几个问题需要注意&a…

渐变加蒙版做倒影

平面设计是PHOTOSHOP应用最为广泛的领域&#xff0c;无论是我们正在阅读的图书封面&#xff0c;还是大街上看到的招帖、海报&#xff0c;这些具有丰富图像的平面印刷品&#xff0c;基本上都需要PHOTOSHOP软件对图像进行处理。用Photoshop 为图片添加倒影&#xff0c;这个效果不…

联想IBM ThinkPad X201i 笔记本显示屏上方中间的键盘灯不亮解决办法

这款小黑&#xff0c;不记得13年还是14年买的&#xff0c;当年就要7千大洋&#xff0c;那时候觉得很贵咬牙买了下来&#xff0c;今天回头看来贵有贵的道理。因为现在用起来还是很爽&#xff0c;去年安装Win10&#xff0c;然后在上面开发JavaEE项目&#xff0c;很快、畅顺。最近…

ibm 服务器 总显示f1,联想ThinkPad笔记本中F1/F4键盘指示灯一直常亮着如何解决

有不少使用联想ThinkPad笔记本的小伙伴们在使用电脑的时候&#xff0c;发现遇到这样一个情况&#xff0c;就是键盘上的F1/F4键盘状态指示灯常亮&#xff0c;按FNESC组合键也无法取消&#xff0c;按FN和对应的功能键也不行&#xff0c;这可该怎么解决呢&#xff0c;一般是由于热…

联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC

联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC 文章目录 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC说明一、我的电脑二、详细过程1.BIOS选项2.查阅改BIOS的资料3.修改BIOS失败4.换个思路&#xff1a;不修改BIOS?…

联想键盘sk8821的Fn功能键

1. 联想键盘sk8821的Fn功能键 1.1. 恢复 F1-F12实际功能 F1-F12系统下会默认为快捷键&#xff08;功能键&#xff09;&#xff0c;而非F1-F12实际功能。可能会导致您在使用习惯上的不适应。 键盘驱动安装目录&#xff1a;X:\LX_KEY\Yangtian\Low Profile Keyboard\setup.exe …

如何关闭联想台式机电脑USB键盘的FN功能

如何关闭联想台式机电脑USB键盘的FN功能 现在很多单位配备的联想台式机所配的USB键盘&#xff0c;F1-F12系统下会默认为快捷键&#xff08;功能键&#xff09;&#xff0c;而非F1-F12实际功能。可能会导致您在使用习惯上的不适应。 通过查询联想官网有如下解决方案&#xff0c;…

禁用联想笔记本电脑自带的键盘

最近电脑键盘出现故障&#xff0c;只要一开机&#xff0c;删除键就一直被按着&#xff0c;按其它键后&#xff0c;偶尔就恢复正常状态。被逼无奈&#xff0c;今天拿去电脑维修店&#xff0c;老板说是键盘的问题&#xff0c;需要换键盘。询问价格&#xff0c;说要&#xffe5;30…

杜蕾斯鞋套?又污又高级!

阳历四月雨纷纷&#xff0c;噼里啪啦湿鞋袜。 杜蕾斯专注“防水”九十多年。眼看大家进入了雨季&#xff0c;杜蕾斯上演一出《典中典》&#xff0c;上线经典鞋套。 我怀疑你在招风惹雨&#xff0c;只是我没证据。 穿这个鞋套出门会不会社死不知道&#xff0c;但谁用这玩意儿绝对…

压缩包.zip暴力破解方法

一: 前言 本方法基于虚拟机下的kali系统,软件为kali自带的fcrackzip,有兴趣的童鞋请自行研究下载. 二:方法说明 fcrackzip -help常用参数中文说明&#xff1a; -b 暴力破解模式 -D 使用字典破解模式 -v 就是可以看到更多的信息 -u 用zip去尝试 -l 密码长度 -c 指定掩码类型&…

python暴力破解zip加密文件

前言&#xff1a; 日常工作中&#xff0c;会遇到一些加密的zip文件&#xff0c;但是因为某些原因或者时间过长&#xff0c;密码不知道了。 但是zip文件中文件有很重要很必须。那么&#xff0c;我们试一试万能的Python&#xff0c;暴力破解密码。 一、破解zip加密文件的思路&a…

《在路上 …》 金山卫士开源 , 人生很多感慨

最近写日记少了很多, 主要是很多情绪化的东西, 都汇入了某条有去无回的地下河. 好吧, 不说这些, 来说说金山卫士开源. 相比360安全卫士那种作秀式的开源 (代码只对极少极少的人开放, 隐隐藏藏), 金山这次显得很真诚. 你可以直接看到代码 http://code.ijinshan.com/ http://code…

【Opencv实战】Python神器 | ps做印章太麻烦?无法拒绝的提取印章神技能,很多人都不知道~(附源码)

前言 哈喽&#xff0c;大家好&#xff0c;我是你们的栗子同学鸭~ 更新了很久的爬虫内容啦&#xff0c;已经吸收完了没&#xff1f; 印章作是我们工作中和生活中会经常接触到的东西&#xff0c;一般用来代表某个个体或者群体&#xff0c;有时候 我们需要复刻一些文件&#x…

PS制作印章

本文使用Photoshop制作古典印章。印章形式大体分阳文和阴文两种&#xff0c;也称朱文和白文。 1、新建一400X400像素&#xff0c;白色背景的文档&#xff0c;在图层面板双击解锁变成图层0。 2、设前景色为R230&#xff0c;G30,B30。这是模仿印泥的颜色&#xff0c;没有一定的…