1.簡介
1.1繼承結構
in/out相對于程序而言的輸入(讀取)和輸出(寫出)的過程爆雹。
在Java中愕鼓,根據處理的數據單位不同钙态,分為字節(jié)流和字符流菇晃。
java.io包:
File
字節(jié)流:針對二進制文件
InputStream
--FileInputStream
--BufferedInputStream
--ObjectInputStream
OutputStream
--FileOutputStream
--BufferedOutputStream
--ObjectOutputStream
字符流:針對文本文件册倒。讀寫容易發(fā)生亂碼現象,在讀寫時最好指定編碼集為utf-8
Reader
--FileReader
--BufferedReader
--InputStreamReader
--PrintWriter/PrintStream
Writer
--FileWriter
--BufferedWriter
--OutputStreamWriter
1.2流的概念
- 數據的讀寫抽象成數據磺送,在管道中流動灿意。
- 流只能單方向流動
- 輸入流用來讀取in
- 輸出流用來寫出Out
-
數據只能從頭到尾順序的讀寫一次
2.File文件流
2.1 概述
封裝一個磁盤路徑字符串崇呵,對這個路徑可以執(zhí)行一次操作。
可以用來封裝文件路徑荒辕、文件夾路徑犹褒、不存在的路徑。
2.2 創(chuàng)建對象
File(String pathname):通過將給定路徑名字符串轉換為抽象路徑名來創(chuàng)建一個新 File 實例化漆。
2.3 常用方法
文件、文件夾屬性
length():文件的字節(jié)量
exists():是否存在疙赠,存在返回true
isFile():是否為文件朦拖,是文件返回true
isDirectory():是否為文件夾,是文件夾返回true
getName():獲取文件/文件夾名
getParent():獲取父文件夾的路徑
getAbsolutePath():獲取文件的完整路徑
創(chuàng)建捍岳、刪除
createNewFile():新建文件睬隶,文件夾不存在會異常,文件已經存在返回false
mkdirs():新建多層不存在的文件夾\a\b\c
mkdir():新建單層不存在的文件夾\a
delete():刪除文件苏潜,刪除空文件夾
文件夾列表
list():返回String[],包含文件名
listFiles():返回File[]贴唇,包含文件對象
2.4 練習:測試常用方法
package cn.tedu.bigdecimal;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
//測試文件流
public class Test2_File {
public static void main(String[] args) throws IOException {
//1,創(chuàng)建文件對象
//參數是具體的路徑飞袋,這個路徑可以是文件路徑也可以是文件夾路徑
File file = new File("D:\\teach\\1.txt");
//2巧鸭,測試常用方法
// 文件、文件夾屬性
System.out.println(file.length());
System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getAbsolutePath());
// 創(chuàng)建、刪除
file = new File("D:\\teach\\2.txt");
System.out.println(file.createNewFile());//創(chuàng)建不存在的文件P痉簟压鉴!
file = new File("D:\\teach\\m");
System.out.println(file.mkdir());//創(chuàng)建不存在的單級文件夾!!
file = new File("D:\\teach\\o");
System.out.println(file.mkdirs());//創(chuàng)建不存在的多級文件夾M裨住心包!
System.out.println(file.delete());//刪除文件或者刪除空的文件夾
// 文件夾列表
file = new File("D:\\teach\\a");
String[] names = file.list();
//列出文件夾中的所有文件的 名稱
System.out.println(Arrays.toString(names));
File[] fs = file.listFiles();
//列出文件夾中的所有文件的 文件對象
System.out.println(Arrays.toString(fs));
}
}
3.字節(jié)流讀取
字節(jié)流是由字節(jié)組成的,字符流是由字符組成的. Java里字符由兩個字節(jié)組成.字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是痕惋,主要用在處理二進制數據娃殖。
流式傳輸主要指將整個音頻和視頻及三維媒體等多媒體文件經過特定的壓縮方式解析成一個個壓縮包,由視頻服務器向用戶計算機順序或實時傳送堕虹。在采用流式傳輸方式的系統(tǒng)中芬首,用戶不必像采用下載方式那樣等到整個文件全部下載完畢,而是只需經過幾秒或幾十秒的啟動延時即可在用戶的計算機上利用解壓設備對壓縮的A/V郁稍、3D等多媒體文件解壓后進行播放和觀看。此時多媒體文件的剩余部分將在后臺的服務器內繼續(xù)下載昼钻。
3.1 InputStream抽象類
此抽象類是表示字節(jié)輸入流的所有類的超類/抽象類封寞。
常用方法:
abstract int read():從輸入流中讀取數據的下一個字節(jié)仅财。
int read(byte[] b):從輸入流中讀取一定數量的字節(jié)盏求,并將其存儲在緩沖區(qū)數組 b 中亿眠。
int read(byte[] b, int off, int len):將輸入流中最多 len 個數據字節(jié)讀入 byte 數組磅废。
void close():關閉此輸入流并釋放與該流關聯的所有系統(tǒng)資源。
3.2 FileInputStream子類
直接插在文件上拯勉,直接讀取文件數據宫峦。
創(chuàng)建對象:
FileInputStream(File file)
通過打開一個到實際文件的連接來創(chuàng)建一個 FileInputStream,該文件通過文件系統(tǒng)中的 File 對象 file 指定导绷。
FileInputStream(String pathname)
通過打開一個到實際文件的連接來創(chuàng)建一個 FileInputStream妥曲,該文件通過文件系統(tǒng)中的路徑名 name 指定。
3.3 BufferedInputStream子類
BufferedInputStream 為另一個輸入流添加一些功能檐盟,即緩沖輸入以及支持 mark 和 reset 方法的能力。在創(chuàng)建 BufferedInputStream 時箱玷,會創(chuàng)建一個內部緩沖區(qū)數組(默認8M大小)陌宿。在讀取或跳過流中的字節(jié)時,可根據需要從包含的輸入流再次填充該內部緩沖區(qū)舶得,一次填充多個字節(jié)爽蝴。
創(chuàng)建對象:
BufferedInputStream(InputStream in)
創(chuàng)建一個 BufferedInputStream 并保存其參數,即輸入流 in九孩,以便將來使用发框。
4.字符流讀取
常用于處理純文本數據。
4.1Reader抽象類
用于讀取字符流的抽象類。
常用方法:
int read():讀取單個字符仿野。
int read(char[] cbuf):將字符讀入數組她君。
abstract int read(char[] cbuf, int off, int len):將字符讀入數組的某一部分。
int read(CharBuffer target):試圖將字符讀入指定的字符緩沖區(qū)鳖枕。
abstract void close():關閉該流并釋放與之關聯的所有資源桨螺。
4.2FileReader子類
用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節(jié)緩沖區(qū)大小都是適當的魏烫。要自己指定這些值肝箱,可以先在FileInputStream上構造一個InputStreamReader。
創(chuàng)建對象:
FileReader(String fileName)
在給定從中讀取數據的文件名的情況下創(chuàng)建一個新 FileReader呐赡。
FileReader(File file)
在給定從中讀取數據的 File 的情況下創(chuàng)建一個新 FileReader骏融。
4.3 InputStreamReader子類
InputStreamReader 是字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定怀泊,或者可以接受平臺默認的字符集误趴。
創(chuàng)建對象:
InputStreamReader(InputStream in, String charsetName)
創(chuàng)建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in)
創(chuàng)建一個使用默認字符集的 InputStreamReader枣申。
4.4 BufferedReader子類
從字符輸入流中讀取文本看杭,緩沖各個字符,從而實現字符熄驼、數組和行的高效讀取烘豹。
可以指定緩沖區(qū)的大小,或者可使用默認的大小携悯。大多數情況下,默認值就足夠大了龟劲。
創(chuàng)建對象:
BufferedReader(Reader in)
創(chuàng)建一個使用默認大小輸入緩沖區(qū)的緩沖字符輸入流轴或。
5.測試:文件的讀取
5.1字節(jié)流讀取
package cn.tedu.in;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
//測試文件的讀取
public class Test5_In {
public static void main(String[] args) {
method();// 字節(jié)流讀取
method2();// 高效的字節(jié)流讀取
}
private static void method2() {
try {
//BufferedInputStream是高效的讀取流:原因在于底層維護了一個byte[]照雁,默認大小是8*1024字節(jié)是8K。
// 1饺蚊,創(chuàng)建字節(jié)流的讀取對象
InputStream in2 = new BufferedInputStream( new FileInputStream("D:\\teach\\1.txt") ) ;
// 2污呼,開始讀取,read()讀取到數據的末尾燕酷,返回-1
// 需求:重復的讀取每個字節(jié)
int b;// 定義變量,記錄讀取到的數據
while ((b = in2.read()) != -1) {// b!=-1静浴,也就是有數據就一直讀取
System.out.println(b);
}
// 3挤渐,釋放資源
in2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void method() {
try {
// 1浴麻,創(chuàng)建字節(jié)流的讀取對象
// InputStream in = new InputStream();//InputStream是字節(jié)讀取流的父類,但是是抽象類软免,不能new
// InputStream in = new FileInputStream(new File("D:\\teach\\1.txt"));
InputStream in2 = new FileInputStream("D:\\teach\\1.txt");
// 2,開始讀取漓骚,read()讀取到數據的末尾,返回-1
// System.out.println( in2.read() );//一個字節(jié)一個字節(jié)開始讀
// System.out.println( in2.read() );
// System.out.println( in2.read() );
// System.out.println( in2.read() );//-1噩斟,沒數據了
// System.out.println( in2.read() );//-1孤个,沒數據了
// 需求:重復的讀取每個字節(jié)
int b;// 定義變量,記錄讀取到的數據
while ((b = in2.read()) != -1) {// b!=-1斥废,也就是有數據就一直讀取
System.out.println(b);
}
// 3给郊,釋放資源
in2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.2字符流讀取
package cn.tedu.in;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
//測試字符流讀取
public class Test6_In2 {
public static void main(String[] args) {
method();// 字符流的讀取
method2();// 高效的字符流讀取
}
private static void method2() {
try {
//BufferedReader是高效的字符讀取流,原因是荚板,底層維護了一個char[]吩屹,默認的容量也是8*1024字節(jié)就是8K
// 1、創(chuàng)建對象
Reader in2 = new BufferedReader( new FileReader("D:\\teach\\1.txt") );
// 2免绿、開始讀取
int b;// 定義變量擦盾,記錄讀取到的數據
while ((b = in2.read()) != -1) {// 只要有數據,就一直讀
System.out.println(b);
}
// 3辽故、釋放資源
in2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void method() {
try {
// 1腐碱、創(chuàng)建對象
// Reader in = new Reader();//Reader是字符流讀取的父類,但是是一個抽象類喂走,不能new
// Reader in = new FileReader(new File("D:\\teach\\1.txt"));
Reader in2 = new FileReader("D:\\teach\\1.txt");
// 2谋作、開始讀取
// System.out.println(in2.read());//一個字符一個字符讀取
// System.out.println(in2.read());
// System.out.println(in2.read());
// System.out.println(in2.read());//-1,沒數據了
// System.out.println(in2.read());//-1帖池,沒數據了
int b;// 定義變量,記錄讀取到的數據
while ((b = in2.read()) != -1) {// 只要有數據肴甸,就一直讀
System.out.println(b);
}
// 3帮孔、釋放資源
in2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}