InputStream和OutputStream

抽象类InputStream和OutputStream是IO流最底层的两个抽象类,所有输入/输出流的类都基于这两个类.

这两个类里最核心的三个方法是read()和write(),以及close()

read() : InputStream类里的方法, 负责读取内容到输入流

write() : OutputStream类里的方法, 负责将内容输出.

close() : 两个类里都有这个方法, 负责关闭流,先关闭输入流,再关闭输出流

read()有3个重载方法,分别是:

public abstract int read() throws IOException : 每次读取1字节,以int形式返回这一字节的数据内容,全部读取完成时返回-1表示读取完毕

public int read(byte b[]) throws IOException : 读取数据到传入的byte数组中,返回读取的字节数,全部读取完毕时返回-1,该方法相当于read(b[], 0, b.length)

public int read(byte b[], int off, int len) throws IOException : off:表示从数组中的第几位开始存储数据 len:表示数组中使用的字节数. b[].length= off+len+剩余的字节数 ,返回值等同于read(byte b[])

***一个byte类型变量是1个字节,所以new byte[1024]是1KB(1024字节),1个英文字母或数字对应1字节容量***

FileInputStream和FileOutputStream的实例

	@Test
public void test() {
//新建一个byte数组用来存储读到的数据,大小是1KB(1024字节)
byte[] oneByte = new byte[1024];
try {
//创建输入和输出流
FileInputStream inStream = new FileInputStream("C:/test/aaa.txt");
FileOutputStream outStream = new FileOutputStream("C:/test/bbb.txt");
//循环读取(read)aaa.txt文件的内容到oneByte,并输出到bbb.txt
//当文件读取完成时(返回-1),结束循环
while (inStream.read(oneByte) != -1) {
//把刚读到的内容输出到bbb.txt
outStream.write(oneByte);
}
//最后一定记得关闭输入输出流,先输入,在输出
inStream.close();
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

注意:

1.如果文件体积小于byte数组(),输出时仍将完整的输出byte数组中的数据,包括未赋值的null,看下图

文件体积6字节,byte数组容量调整为8字节.

     

2.如果文件体积大于byte数组,但最后一次读取的数据体积小于byte数组,这将造成一些问题,因为byte数组在赋值前并未被清空,所以byte数组中仍会保留一部分上次循环中存储的数据.看下图

文件体积字节,把byte数组容量调成字节,可以看到,byte数组中未被覆盖的数据(上次循环时的数据)在第二次循环中被输出(红框部分)

     

使用public int read(byte b[], int off, int len) throws IOException

还是上边的代码,read(byte b[])改成用read(byte b[], int off, int len)方法,其他不变,罗列情况如下

1.文件体积6字节,byte数组容量8字节,read(b[], 0, 8)

    

2.文件体积6字节,byte数组容量8字节,read(b[], 1, 6)

    

3.文件体积6字节,byte数组容量8字节,read(b[], 1, 8)

数组下标越界,因为1+8>b[].length

IO流-输入输出的简单实例的更多相关文章

  1. 呆呆的io流输入输出的一些基础

    关于io流的File类,下面来码一些基础属性: 文件的属性: /* public String getName() 获取文件的名字 public boolean canRead() 判断文件是否可以读 ...

  2. Java学习笔记43(打印流、IO流工具类简单介绍)

    打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...

  3. java io 流 输入输出 大牛经典总结

    在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下I/O,数据库操作 一:从数据流开始 首先先有一个结构图看一下整 ...

  4. Java通过IO流输入输出 向文件中存入大量三个属性的值,并通过验证前两个属性输出第三个属性

    package ABC1; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import ...

  5. 使用IO流实现一个简单的小Dome

    (一) 在电脑D盘下创建一个文件为HelloWorld.txt文件,判断他是文件还是目录,在创建一个目录IOTest,之后将HelloWorld.txt移动到IOTest目录下去:之后遍历IOTest ...

  6. IO流-输入输出

    java的I/O技术可以将数据保存到文本.二进制.ZIP压缩文件中,下面来说说一些基本的常识(今天只讲理论).先来说说流,何为流?“流就是一组有序的数据序列,根据操作的类型,可以分为输入(Input) ...

  7. 【Java】Swing+IO流实现一个简单的文件加密程序(较完整版)

    留着参考 beans package com.my.bean; import java.io.Serializable; public class EncryptedFile implements S ...

  8. 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)

    留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...

  9. IO流读写数据简单示例

    常用的字节输入流有:InputStream ,FileInputStream,BufferedInputStream 常用的字节输出流有:OutputStream,FileOutputStream,B ...

随机推荐

  1. 从壹开始微服务 [ DDD ] 之十 ║领域驱动【实战篇·中】:命令总线Bus分发(一)

    烽火 哈喽大家好,老张又见面了,这两天被各个平台的“鸡汤贴”差点乱了心神,博客园如此,简书亦如此,还好群里小伙伴及时提醒,路还很长,这些小事儿就随风而去吧,这周本不打算更了,但是被群里小伙伴“催稿”了 ...

  2. k8s经典实战—搭建WordPress

    k8s经典实战—搭建WordPress说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了.首先看下效果图 ...

  3. Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇

    背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...

  4. Android WebView 缓存

    android很多情况是使用webView用来显示界面,但是webview的加载速度略慢,想让这个webview更快一些所以需要使用缓存,在没有更新的时候使用缓存技术来提高速度.总体来讲有两个方案可以 ...

  5. Flutter的初体验--初次配置的问题

    首先参照官方文档进行搭建Mac下的环境 ,然后就会遇到以下问题:   1.在下载了Flutter 之后,执行Flutter doctor之后,报错: Could not resolve URL &qu ...

  6. 读懂 Gradle 的 DSL

    现在 Android 开发免不了要和 Gradle 打交道,所有的 Android 开发肯定都知道这么在 build.gradle 中添加依赖,或者添加配置批量打包,但是真正理解这些脚本的人恐怕很少. ...

  7. RMAN优缺点及RMAN备份及恢复步骤

    RMAN优缺点及RMAN备份及恢复步骤--以下部分来自网络转摘,仅供参考和OS命令备份方式相比,使用RMAN的优点1 备份执行期间不需要人工干预,因此减少了误操作的机会:2 可以有效的将备份和恢复结合 ...

  8. 必看!如何让你的LBS服务性能提升十倍!

    本文由云+社区发表 作者:腾讯云数据库团队 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.MongoDB对LB ...

  9. python3 字符编码与转码的理解

    额...上通识课讲到了NLP12条,感觉讲的挺好的,照着抄一条先... 1,没有两个人是一样的 没有两个人的人生经验会完全一样,所以没有两个人的信念,价值和规条系统会是一样. 因此没有两个人对同一件事 ...

  10. ajax data属性传值的方式总结

    在和后台同事对接口的时候,有一个小问题一直困扰着我.那就是用ajax请求后台接口数据,需要用data属性传值的时候,data属性传值的方式感觉没有统一用一种方式. 后来仔细想想,其实哪种方式都可以,主 ...