什么是流
* 數(shù)據(jù)的流動稀颁,稱為流,硬盤和內(nèi)存之間的數(shù)據(jù)交互
* 流按照方向分楣黍,分為輸入流和輸出流匾灶,以內(nèi)存作為參照物。將數(shù)據(jù)從數(shù)據(jù)源讀取到內(nèi)存租漂,為輸入流阶女,也稱為讀取流。將數(shù)據(jù)從內(nèi)存中寫入數(shù)據(jù)源哩治,為輸出流秃踩,也稱為寫入流。
* 流放在I/O包里
流的分類
按照類型分類可以分為字節(jié)流业筏,字符流和對象流憔杨。
1. 字節(jié)流:以字節(jié)方式傳輸,所有類型均能傳輸
2. 字符流:只能傳輸字符串
3. 對象流:傳輸對象
由于計算機采用二進制蒜胖。數(shù)據(jù)的傳輸都是以字節(jié)為單位傳輸消别。所以,無論那種流台谢,其本質(zhì)都是字節(jié)流寻狂。不過,為了方便字符數(shù)據(jù)和對象數(shù)據(jù)的傳輸朋沮,可以在字節(jié)流基礎(chǔ)上進行封裝蛇券,形成字符流和對象流,所有的流都使用int類型去接收
InputStream和OutputStrem
InputStream和OutpuuStrem是字節(jié)流的兩個父類,這個兩個類是抽象類纠亚,提供了read()和write()兩個抽象方法塘慕。由子類根據(jù)自己數(shù)據(jù)源的特點分別做實現(xiàn)
流操作的步驟
1. 建立流
2. 操作流
3. 關(guān)閉流
當(dāng)做文件流操作時,讀取流會拋出文件問找到FileNotFoundException異常菜枷。寫入流會新建文件苍糠,但是前提是文件所在目錄必須存在叁丧。否則也會拋出FileNotFoundException
創(chuàng)建讀取流
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputText {
public InputText() {
//外面聲明變量啤誊,內(nèi)部實例化,方便在finlly中關(guān)閉
InputStream in = null;
try {
//創(chuàng)建文件讀取字節(jié)流
in = new FileInputStream("D:\\文檔\\圖片\\素材\\1.jpg");
int data=0;
//一次只讀一個字節(jié)拥娄,讀取完畢返回-1
// while((data=in.read())!=-1){
// System.out.println(data);
// }
//使用byte數(shù)組接收
int len=0;
byte[]by=new byte[1024];
//一次讀取1024個字節(jié)蚊锹,放入byte數(shù)組,返回本次讀取的字節(jié)數(shù)
while((len=in.read(by))!=-1){
System.out.println(len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//關(guān)閉流通道方法
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 對象沒有被變量指向會被垃圾回收稚瘾,但是當(dāng)對象正在運行則不會回收
new InputText();
}
}
創(chuàng)建寫入流
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutputTest {
public OutputTest(){
OutputStream out=null;
try {
//創(chuàng)建寫入字節(jié)流
out =new FileOutputStream("1.txt");
//默認(rèn)為覆蓋寫入牡昆,如果第二個參數(shù)為真,表示追加寫入
out =new FileOutputStream("1.txt",true);
// //寫入數(shù)據(jù),只能是byte類型
// out.write(100);
//寫入字節(jié)數(shù)組
out.write("努力一點摊欠,多掙點錢丢烘。".getBytes());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
OutputTest o=new OutputTest();
}
}
Reader和Write
Reader和Write是字符流的兩個父類⌒┙罚可以直接對字符串進行操作
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class ReaderTest {
public ReaderTest() {
// 字符流只能讀取文本文件
Reader r = null;
//Reader與BufferedReader配合使用
BufferedReader br = null;
try {
r = new FileReader("img/1.txt");
br = new BufferedReader(r);
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
br.close();
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ReaderTest r = new ReaderTest();
}
}
Write代碼
import java.io.FileWriter;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;
public class WriteTest {
public WriteTest(){
Writer w=null;
try {
//第二個參數(shù)如果不寫表示默認(rèn)覆蓋播瞳,寫了真表示換行輸入
w=new FileWriter("3.txt");
w.write("你好,歡迎光臨\n");
w.write("今天下雨");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
w.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
WriteTest w=new WriteTest();
}
}
File 文件類
寫入流會新建文件免糕,但是前提是文件所在目錄必須存在赢乓。否則也會拋出FileNotFoundException
import java.io.File;
public class FileText {
public static void main(String[] args) {
// 創(chuàng)建一個文件對象
File f = new File("D:/文檔/JAVA/朗沃/作業(yè)");
// 得到文件對象描述的絕對路徑
System.out.println(f.getAbsolutePath());
// 判斷文件是否存在,返回boolean值,存在返回真
boolean isHas = f.exists();
System.out.println(isHas);
// 判斷指定目錄是否存在石窑,如果不存在牌芋,系統(tǒng)自動創(chuàng)建一個對應(yīng)目錄
if (f.exists() == false) {
f.mkdirs();
}
// 判斷文件對象代表的是文件還是目錄, 是文件返回真,目錄返回假
System.out.println(f.isFile());
// 判斷文件對象代表的是文件還是目錄松逊,是目錄返回真躺屁,文件返回假
System.out.println(f.isDirectory());
//刪除文件或目錄,如果刪除文件可以直接刪除经宏,刪除目錄必須保證目錄為空目錄
File s=new File("D:/文檔/JAVA/朗沃/作業(yè)/Test.txt");
s.delete();
File w=new File("C:/Recovery");
//得到目錄中的所有文件對象犀暑,不包括子目錄中的文件或目錄
File[] farray=w.listFiles();
for(File x:farray){
System.out.println(x.getAbsolutePath());
}
// list(new File("C:/Recovery"));
}
//遞歸循環(huán),自己調(diào)用自己
public static void list(File dirFile){
File[] farray=dirFile.listFiles();
for(File f: farray){
if(f.isFile()){
System.out.println(f.getAbsolutePath());
}else{
list(f);
}
}
}
//遞歸循環(huán)烛恤,刪除所有文件
public static void delList(File dirFile){
File[] farray=dirFile.listFiles();
for(File f: farray){
if(f.isFile()){
f.delete();
}else{
delList(f);
}
}
dirFile.delete();
}
}