IO流概述和分類
-
IO流介紹
-
IO:輸入/輸出(Input/Output)
-
流:是一種抽象概念,是對資料傳輸的總稱,流的本質是資料傳輸
-
IO流就是用來處理設備間資料傳輸問題的,常見的應用: 檔案復制; 檔案上傳;;檔案下載
-
-
IO流的分類
-
按照資料的流向
-
輸入流:讀資料【read】
-
輸出流:寫資料【write】
-
-
按照資料型別來分
-
位元組流
-
位元組輸入流 【read】
-
位元組輸出流【write】
-
-
字符流
-
字符輸入流
-
字符輸出流
-
-
-
-
IO流的使用場景
-
如果操作的是純文本檔案,優先使用字符流
-
如果操作的是圖片、視頻、音頻等二進制檔案,優先使用位元組流
-
如果不確定檔案型別,優先使用位元組流.位元組流是萬能的流
-
位元組流
-
位元組流抽象基類
-
InputStream:這個抽象類是表示位元組輸入流的所有類的超類
-
OutputStream:這個抽象類是表示位元組輸出流的所有類的超類
-
子類名特點:子類名稱都是以其父類名作為子類名的后綴
-
-
位元組輸出流
-
FileOutputStream(String name):創建檔案輸出流以指定的名稱寫入檔案,通過位元組的方式寫資料到檔案中,適合所有型別的檔案,Java 也提供了 FileWriter 專門寫入文本文
- FileInputStream(String name) : 通過位元組的方式讀取檔案,適合讀取所有型別的檔案(影像、視頻、文本檔案等),Java 也提供了 FileReader 專門讀取文本檔案,
-
-
使用位元組輸出流寫資料的步驟
-
創建位元組輸出流物件(呼叫系統功能創建了檔案,創建位元組輸出流物件,讓位元組輸出流物件指向檔案)【FileOutputStream(String name)】
- 注意點:
1.如果檔案不存在,會幫我們創建
2.如果檔案存在,會把檔案清空
- 注意點:
-
呼叫位元組輸出流物件的寫資料方法 【.write()】
-
釋放資源(關閉此檔案輸出流并釋放與此流相關聯的任何系統資源)【.close()】
-
| 方法名 | 說明 |
|---|---|
| void write(int b) | 將指定的位元組寫入此檔案輸出流 一次寫一個位元組資料 |
| void write(byte[] b) | 將 b.length位元組從指定的位元組陣列寫入此檔案輸出流 一次寫一個位元組陣列資料 |
| void write(byte[] b, int off, int len) | 將 len位元組從指定的位元組陣列開始,從偏移量off開始寫入此檔案輸出流 一次寫一個位元組陣列的部分資料 |
方法【write[int b]】代碼實列:
package io_bytetheflow;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo01 {
public static void main(String[] args) throws IOException{
//FileOutputStream(String name):創建檔案輸出流以指定的名稱寫入檔案
FileOutputStream fos = new FileOutputStream("java-studydemo\\fos.txt");
//void write(int b):將指定的位元組寫入此檔案輸出流
fos.write(97); // 一次寫一個位元組資料
fos.write(57);
fos.write(55);
System.out.println("寫入成功");
//最后都要釋放資源
//void close():關閉此檔案輸出流并釋放與此流相關聯的任何系統資源,
fos.close();
}
}

方法【write[byte[] b]】【write(byte[] b, int off, int len)】代碼實列:
package io_bytetheflow;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo02 {
public static void main(String[] args) throws IOException {
//FileOutputStream(String name):創建檔案輸出流以指定的名稱寫入檔案
FileOutputStream fos = new FileOutputStream("java-studydemo\\fos.txt");
// void write(byte[] b):將 b.length位元組從指定的位元組陣列寫入此檔案輸出流
// byte[] bys = {97, 98, 99, 100, 101};
//byte[] getBytes():回傳字串對應的位元組陣列, 就是在陣列中轉換成為位元組碼存盤
byte[] bys = "abcde".getBytes();
fos.write(bys);
//void write(byte[] b, int off, int len):將 len位元組從指定的位元組陣列開始,從偏移量off開始寫入此檔案輸出流
// fos.write(bys,0,bys.length);
// fos.write(bys,1,3);
System.out.println("成功!");
//釋放資源
fos.close();
}
}
如何寫換行
??呼叫write()方法,寫出”\r\n”.getBytes()即可
如何檔案續寫
- 使用FileOutputStream(String name,boolean append)構造方法
- 構造方法中第二個引數傳遞true,則在檔案末尾繼續寫資料
位元組流寫資料如何實作追加寫入
-
public FileOutputStream(String name,boolean append) // append 為true則為追加
-
創建檔案輸出流以指定的名稱寫入檔案,如果第二個引數為true ,則位元組將寫入檔案的末尾而不是開頭
package io_bytetheflow;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo03 {
public static void main(String[] args) throws IOException {
//創建位元組輸出流物件
// FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
FileOutputStream fos = new FileOutputStream("java-studydemo\\fos.txt",true);
fos.write(Integer.parseInt("97"));
//寫資料
for (int i = 0; i < 10; i++) {
fos.write("hello".getBytes());
fos.write("\r\n".getBytes()); // 添加換行, write 方法是追加
}
//釋放資源
fos.close();
}
}
位元組流寫資料加例外處理
-
例外處理格式
-
try-catch-finally
try{ // 可能出現例外的代碼; }catch(例外類名 變數名){ // 例外的處理代碼; }finally{ // 執行所有清除操作; } -
finally特點
-
被finally控制的陳述句一定會執行,除非JVM退出
-
-
import java.io.IOException
public class FileOutputStreamDemo04 {
public static void main(String[] args) {
//加入finally來實作釋放資源
FileOutputStream fos = null;
try {
fos = new FileOutputStream("java\\fos.txt");
fos.write("hello".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
位元組流讀資料(一次讀一個位元組資料)
-
位元組輸入流
-
FileInputStream(String name):通過打開與實際檔案的連接來創建一個FileInputStream,該檔案由檔案系統中的路徑名name命名
-
-
位元組輸入流讀取資料的步驟
-
創建位元組輸入流物件
-
呼叫位元組輸入流物件的讀資料方法
-
釋放資源
-
package io_bytetheflow;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo01 {
public static void main(String[] args) throws IOException {
// 創建位元組輸入流物件
// FileInputStream(String name)
FileInputStream fis = new FileInputStream("java-studydemo\\fos.txt");
int by;
/*
fis.read():讀資料
by=fis.read():把讀取到的資料賦值給by
read() 從這個輸入流讀取一個位元組的資料,回傳int型別
by != -1:判斷讀取到的資料是否是-1
*/
System.out.println(fis.read()); // 回傳int型別的位元組碼
while ((by=fis.read())!=-1) { // 當取到int型別的位元組碼,但沒有字符的位元組碼,會回傳-1,此時則退出
System.out.print((char)by);
}
//釋放資源
fis.close();
}
}
位元組流復制檔案
-
案例需求
把“E:\java\demo.txt”復制到模塊目錄下的“demo.txt”
-
實作步驟
-
復制文本檔案,其實就把文本檔案的內容從一個檔案中讀取出來(資料源),然后寫入到另一個檔案中(目的地)
-
資料源:
“E:\java\demo.txt”--- 讀資料 --- InputStream --- FileInputStream
-
目的地:
“E:\java1\demo.txt” --- 寫資料 --- OutputStream --- FileOutputStream
-
package io_bytetheflow;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
// 創建目錄檔案
File fl1 = new File("E:\\java");
System.out.println(fl1.mkdir());
File fl2 = new File("E:\\java\\demo.txt");
System.out.println(fl2.createNewFile());
File fl3 = new File("E:\\java1");
System.out.println(fl3.mkdir());
File fl4 = new File("E:\\java1\\demo.txt");
System.out.println(fl4.createNewFile());
//根據資料源創建位元組輸入流物件 讀資料的流read()
FileInputStream fis = new FileInputStream("E:\\java\\demo.txt");
FileOutputStream fos1 = new FileOutputStream("E:\\java\\demo.txt");
byte[] b = "qwertyui".getBytes(StandardCharsets.UTF_8);
fos1.write(b);
//根據目的地創建位元組輸出流物件 寫資料的流write()
FileOutputStream fos = new FileOutputStream("E:\\java1\\demo.txt");
//讀寫資料,復制文本檔案(一次讀取一個位元組,一次寫入一個位元組)
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
}
//釋放資源
System.out.println("寫入成功!!");
fos.close();
fis.close();
}
}
本文來自博客園,作者:link-零,轉載請注明原文鏈接:https://www.cnblogs.com/e-link/p/16870449.html???
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530508.html
標籤:Java
