Java对外部数据的操作都是通过流的方式

input 读入数据: 把外部数据读取到java程序中来

output 写出数据: 把java数据写出去 保存到外部

IO流按照操作的内容不同分为:

  1. 1.字节流<br /> 2.字符流

IO流按照方向不同分为:

    1.输入流(input)<br />        2.输出流(output)

字节是指当前数据在计算机内存中所占的空间<br />    字符是指 一个汉字或者一个字母 都算是一个字符<br />    由于Idea开发工具的原因 目前我们使用的编码是UTF-8(后面讲)<br />    所以 **一个汉字占3个字节 一个字母占两个字节**

所有字节输入流的超类:
InputStream
所有字节输出流的超类:
OutputStream

先学习一个简单的子类:

FileOutputStream 文件字节输出流

构造方法:
FileOutputStream(File file)
传入一个File对象 关联一个本地文件
FileOutputStream(String name)
传入一个路径 关联一个本地文件
文件字节输出流关联的文件如果不存在 则 自动创建
如果文件存在 则打开输出流 关联该文件image.png
如果路径不存在 则报错 FileNotFoundException
报目录未找到异常image.png

文件字节输出流的输出方法

1.void write(int b)

将指定的字节写入此文件输出流。//注意: 字节不要超出范围![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200117449-93cecaf0-31cd-4352-8402-e3308643bcf9.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=42&id=u7ca30724&margin=%5Bobject%20Object%5D&name=image.png&originHeight=52&originWidth=678&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8721&status=done&style=none&taskId=u77ffa970-1ae9-4fab-9590-2a74ef7b725&title=&width=542.4)![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200141766-24d14a0d-935c-4c0c-93d7-ca8176034a69.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=123&id=u48143b11&margin=%5Bobject%20Object%5D&name=image.png&originHeight=154&originWidth=381&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9955&status=done&style=none&taskId=uaaff8770-59cd-4fc3-9f3b-371bd151270&title=&width=304.8)

2. void write(byte[] b)

将 b.length个字节从指定的字节数组写入此文件输出流。![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200530873-93eb66b6-8670-4537-a650-ae588769cda0.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=56&id=ub0875128&margin=%5Bobject%20Object%5D&name=image.png&originHeight=79&originWidth=645&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11516&status=done&style=none&taskId=ud6f502aa-0aca-4406-b8d7-217da7e451b&title=&width=461) ![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200560509-134b6abf-1b63-492a-b31d-cb50418e6160.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=90&id=u0151d1c0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=150&originWidth=298&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9055&status=done&style=none&taskId=u774d45df-97ef-4ee7-b663-59f645cd40c&title=&width=179)

3.void write(byte[] b, int off, int len)

将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200923491-f9b66e5f-984e-4d1d-824f-ce43f9307b9a.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=101&id=u0bbec97b&margin=%5Bobject%20Object%5D&name=image.png&originHeight=126&originWidth=651&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14714&status=done&style=none&taskId=uc0f1f90e-1c11-4040-81cb-6a62f971548&title=&width=520.8)<br />输出汉字 :  //因为汉字一个占三个字节 所以从0开始传五个字节 会乱码<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655200999359-6983670a-3bea-4d59-8c66-bbee04298c03.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=25&id=ub4eaa525&margin=%5Bobject%20Object%5D&name=image.png&originHeight=31&originWidth=674&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6431&status=done&style=none&taskId=ue4776e21-8f52-4cdc-a2fc-69414d115fa&title=&width=539.2)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1655201066610-57b1804f-cdd7-4aa9-b6ff-25261827b2e6.png#clientId=ua9fe6900-aecc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=72&id=ue7079a72&margin=%5Bobject%20Object%5D&name=image.png&originHeight=90&originWidth=352&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5660&status=done&style=none&taskId=ucfe5bb75-ac05-4f41-847e-7395128b1a7&title=&width=281.6)