# 輸入輸出流(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
~~~
> 第四個?`../../`? ? ? ? ?這個代表的是返回到上一級,再向上返回一級,返回了兩級;
> 第五個?`../../../`? ? ? 這個比上面的多了一級,那么就是向上返回三級了;
- JAVA基礎
- JAVA開發準備
- JAVA介紹
- 開發JAVA的準備
- JAVA的運行原理
- JDK配置
- 我的第一個JAVA程序
- 類與對象
- 基礎語言要素
- 數據類型
- eclipse的安裝與使用
- 變量
- 直接量
- 運算符
- 流程控制
- 數組結構
- 面向對象
- 隱藏與封裝
- 深入構造器
- 類的繼承
- 多態
- 包裝類
- final修飾符
- 抽象類
- 接口
- 內部類
- 設計模式
- 單例模式
- 工廠模式
- 集合框架
- 集合排序
- 常用類學習
- 異常處理
- Java基礎測試
- 綜合案例一
- JAVA高級
- 泛型
- 多線程
- 線程的創建
- 線程的生命周期
- 線程同步
- 線程通信
- 輸入輸出流(I/O編程)
- File文件操作
- 字節流與字符流
- 數據庫
- 數據庫介紹
- 數據庫安裝
- SQL
- 表的基本操作
- 修改數據語句
- 數據檢索操作
- 多表數據操作
- 表結構設計
- 綜合應用