# 输入输出流(I/O编程)
[TOC]
## I/O编程
I/O编程指的是操作文件流(Input/Output,输入/输出)编程,可以实现数据的读取和写入操作,Java针对I/O操作的实现提供了java.io工具包。
### 什么是流
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
**程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件**。
**流就是指一连串流动的字符,以先进先出的的方式发送信息的通道。**
在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)
>[info]在一开始我们学习Java的时候,实际上就接触过输出流,比如我们的`system.out.println()`
## 什么是文件
文件是计算机中基本的数据存储形式,在实际的存储数据中,如果对数据的读写速度要求不高,而且存储的数据量也不是很大,此时,可以选择使用文件这种持久化的存储方式。
所谓**持久化**,就是当程序退出,或者计算机关机以后,数据还是存在的。但是在程序内存中的数据会在程序关闭或计算机退出时丢失。
文件的组成:路径+文件的全名(文件名和文件后缀)。
关于文件后缀:只是定义了文件的打开方式不一样,如果更改后缀不会对文件的内部数据产生变化。
在不同的操作系统中,文件的路径表示形式是不一样的。
比如:
`windows c:\windows\system\driver.txt`
`Linux /user/my/tomcat/startup.txt`
>[warning] 如果程序需要在不同的操作系统中运行,那么如果出现文件路径相关的设置时,必须要进行操作系统的判断,特别是windows和Linux关于斜杠的区别。
>[success]针对于不同操作系统的斜杠我们可以使用File类的路径分隔符常量`File.separator`
## 绝对路径与相对路径
### 绝对路径
**绝对路径:是指文件在硬盘上真正存在的路径。(指对站点的根目录而言某文件的位置)————以web站点为根目录为参考基础的目录路径,之所以成为绝对,意指当所有网页引用同一文件时,所引用的路径都是一样的。**
#### 引用本地文件
~~~
Windows系统中的文件绝对路径
E:\companyWorkSpace\braun\bin\src\main\resources\js\dicList.js
当我们想要引入这样本地的一个js文件的时候。
写法:
<script src="file:///E:/companyWorkSpace/braun/bin/src/main/resources/js/dicList.js"></script>
~~~
`file:///`:本地超文本传输协议
注意点:需要将路径中的反斜杠\\改为斜杆/
#### 引用网络文件
~~~
写法:
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" />
~~~
`https://`:网络安全超文本协议
### 相对路径
**相对路径:就是相对于自己的目标文件的位置。(指以当前文件所处目录而言文件的位置)————以引用文件之间网页所在位置为参考基础,而建立出的目录路径。因此当保存于不同目录的网页引用同一个文件时,所使用的路径将不相同,故称之为相对。**
#### 相对路径的点与斜杠概念
**/、./、../、../../**
* `/`这个斜杠代表的是根目录的意思,什么是根目录呢?
**先看例子:**
~~~
F盘中有个文件夹vue_bamboos和一张图片 test-me.png
vue_bamboos下有一个文件夹 a , a文件夹中有一个文件夹b;
b文件夹下有一个index.html文件;
F-------------------------------------------
vue_bamboos-------------------------
a--------------------------
b-----------------
index.html-
test-me.png-------------------------
index.html:显示一张图片test-me.png, 这里我们使用就是根目录,也就是我们项目目录的上一级,也就是 F 盘是我们的根目录;
注意,我们的项目目录是vue_bamboos,但是vue_bamboos不是根目录,它的上一级才是!!!
<body>
<img src="/test-me.png" alt="测试根目录">
</body>
~~~
* `/`这个代表的是当前目录,也就是和我们的index.html 在同一级上
**先看例子**
~~~
假设我们的项目目录:
F---------------------------------
vue_bamboos---------------
index.html------
test-me.png-----
<body>
<img src="./test-me.png" alt="测试当前目录">
<img src="test-me.png" alt="测试当前目录">
</body>
也就是说我们可以这样写 ./test-me.png 或者省略 ./ 也是可以的, 直接写 test-me.png
~~~
* `../` 这个代表的意思是返回到上一级目录;
**先看例子**
~~~
假设我们的项目目录:
F-------------------------------------
vue_bamboos-------------------
index.html----------
b------------------------------
test-me.png---
<body>
<img src="../b/test-me.png" alt="测试父目录">
</body>
也就是说我们先找到index.html所在的vue_bamoos这个文件夹,再在vue_bamoos文件夹的上级目录F盘中,找到b文件夹,最后找到test-me.png
~~~
> 第四个 `../../` 这个代表的是返回到上一级,再向上返回一级,返回了两级;
> 第五个 `../../../` 这个比上面的多了一级,那么就是向上返回三级了;