字節(jié)流和字符流:
1字節(jié)流(均為抽象類):在字節(jié)流中定義了方法read(),用于從字節(jié)流中讀取對象:
public abstract int read() throws IOException;
這是抽象方法,它從字節(jié)流中讀取一個(gè)字節(jié),到了末尾返回-1,否則返回讀入的字節(jié),它會一直
阻塞,直到返回讀取的是字節(jié)或是-1,字節(jié)流不支持緩存,每次調(diào)用都會伴隨著一次磁盤io,
效率低,要想使用內(nèi)存緩沖區(qū)提高讀取效率,應(yīng)該使用BufferedInputStream
(1)字節(jié)輸入流:inputStream
(2)字節(jié)輸出流:outputStream
2 字符流
字符流處理的最基本單位是Unicode碼元(2字節(jié)),它用來處理文本數(shù)據(jù)
字符輸出流:把要寫入文件的字符序列(實(shí)際上是Unicode碼元序列)轉(zhuǎn)為指定編碼方式下的字節(jié)序列,然后再寫入到文件中;
輸入字符流:把要讀取的字節(jié)序列按指定編碼方式解碼為相應(yīng)字符序列(實(shí)際上是Unicode碼元序列從)從而可以存在內(nèi)存中催式。
由于字符流在輸出前實(shí)際上是要完成Unicode碼元序列到相應(yīng)編碼方式的字節(jié)序列的轉(zhuǎn)換,
所以它會使用內(nèi)存緩沖區(qū)來存放轉(zhuǎn)換后得到的字節(jié)序列喘蟆,等待都轉(zhuǎn)換完畢再一同寫入磁盤文件中摩骨。
3字符流和字節(jié)流的區(qū)別:
字節(jié)流操作的基本單元為字節(jié)擎椰;字符流操作的基本單元為Unicode碼元秉沼。
字節(jié)流默認(rèn)不使用緩沖區(qū)州刽;字符流使用緩沖區(qū)呕寝。
字節(jié)流通常用于處理二進(jìn)制數(shù)據(jù)勋眯,實(shí)際上它可以處理任意類型的數(shù)據(jù),但它不支持直接寫入或讀取Unicode碼元下梢;
字符流通常處理文本數(shù)據(jù)客蹋,它支持寫入及讀取Unicode碼元。
對象流
Java中可以通過對象流將一個(gè)序列化的對象保存到硬盤中孽江,或者硬盤中讀取一個(gè)對象讶坯。對象流的存儲和讀取包含以下幾點(diǎn)內(nèi)容:
1、所保存的對象必須實(shí)現(xiàn)Serializable接口岗屏。
2辆琅、 所保存的對象的屬性也必須實(shí)現(xiàn)Serializable接口。
3这刷、 最好要給該對象提供一個(gè)版本號婉烟,private static final long serialVersionId。
例:
class Person implements Serializable {
//實(shí)現(xiàn)序列化接口暇屋,其中的String隅很,int也都是實(shí)現(xiàn)了Serializable的,不然就會報(bào)錯(cuò)
? private static final long serialVersionUID = 7072662597320618920L;
? String name;
? int age;
? public Person(String name, int age) {
? ? this.name = name;
? ? this.age = age;
? }
? @Override
? public String toString() {
? ? return "Person [name=" + name + ", age=" + age + "]";
? }
}
public class ObjectStreamTest {
? private ObjectInputStream ips;
? @Test
? public void outStreamTest() throws Exception {
? ? File file = new File("D:/person.txt");
? ? Person p1 = new Person("hanking", 24);
? ? Person p2 = new Person("Hust", 120);
? ? FileOutputStream fos = new FileOutputStream(file);
? ? ObjectOutputStream ops = new ObjectOutputStream(fos);
? ? ops.writeObject(p2);
? ? ops.writeObject(p1);
? ? ops.flush();
? ? ops.close();
? }
? @Test
? public void InStreamTest() throws Exception {
? ? ips = new ObjectInputStream(new FileInputStream("D:/person.txt"));
? ? Person p1 = (Person) ips.readObject();
? ? System.out.println(":" + p1);
? ? Person p2 = (Person) ips.readObject();
? ? System.out.println(":" + p2);
? ? ips.close();
? }
}
輸入輸出流
file類File類是IO包中唯一代表磁盤文件本身的對象率碾。通過File來創(chuàng)建,刪除屋彪,重命名文件所宰。
File類對象的主要作用就是用來獲取文本本身的一些信息。如文本的所在的目錄畜挥,文件的長度仔粥,讀寫權(quán)限等等
file構(gòu)造方法
File(String pathname):根據(jù)一個(gè)路徑得到File對象
File(String parent, String child):根據(jù)一個(gè)目錄和一個(gè)子文件/目錄得到File對象
File(File parent, String child):根據(jù)一個(gè)父File對象和一個(gè)子文件/目錄得到File對象
File類(File類的創(chuàng)建功能)
A:創(chuàng)建功能
public boolean createNewFile():創(chuàng)建文件 如果存在這樣的文件,就不創(chuàng)建了
public boolean mkdir():創(chuàng)建文件夾 如果存在這樣的文件夾蟹但,就不創(chuàng)建了
public boolean mkdirs():創(chuàng)建文件夾,如果父文件夾不存在躯泰,會幫你創(chuàng)建出來
File類(File類的重命名和刪除功能)
File類的重命名和刪除功能
public boolean renameTo(File dest):把文件重命名為指定的文件路徑
public boolean delete():刪除文件或者文件夾
重命名注意事項(xiàng)
如果路徑名相同,就是改名华糖。
如果路徑名不同麦向,就是改名并剪切。
刪除注意事項(xiàng):
Java中的刪除不走回收站客叉。
要?jiǎng)h除一個(gè)文件夾诵竭,請注意該文件夾內(nèi)不能包含文件或者文件夾
File類(File類的判斷功能)
判斷功能
public boolean isDirectory():判斷是否是目錄
public boolean isFile():判斷是否是文件
public boolean exists():判斷是否存在
public boolean canRead():判斷是否可讀
public boolean canWrite():判斷是否可寫
public boolean isHidden():判斷是否隱藏
File類(File類的獲取功能)
獲取功能
public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取路徑
public String getName():獲取名稱
public long length():獲取長度话告。字節(jié)數(shù)
public long lastModified():獲取最后一次的修改時(shí)間,毫秒值
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
過濾器:
? public class FileTest {
? public static void main(String[] args){
? ? ? ? ? File file=new File("C:\\Users\\biehongli\\Pictures\\Camera Roll");
? ? ? ? String[] str=file.list(new FilenameFilter() {//過濾器卵慰,匿名內(nèi)部類
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean accept(File dir, String name) {
? ? ? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? ? ? //System.out.println(dir);//獲取文件的路徑
? ? ? ? ? ? ? ? //System.out.println(name);//獲取文件的名字
? ? ? ? ? ? ? ? File f=new File(dir,name);
? ? ? ? ? ? ? ? return f.isFile() && f.getName().endsWith(".jpg");
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? for(String s : str){
? ? ? ? ? ? System.out.println(s);
? ? ? ? }
? ? }
}
1 read () 方法沙郭,這個(gè)方法 從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)。返回 0 到 255 范圍內(nèi)的 int 字節(jié)值裳朋。如果因?yàn)橐呀?jīng)到達(dá)流末尾而沒有可用的字節(jié)病线,則返回值 -1 。
2read (byte[] b,int off,int len) 方法鲤嫡, 將輸入流中最多 len 個(gè)數(shù)據(jù)字節(jié)讀入 byte 數(shù)組送挑。嘗試讀取 len 個(gè)字節(jié),但讀取的字節(jié)也可能小于該值泛范。
以整數(shù)形式返回實(shí)際讀取的字節(jié)數(shù)让虐。
3read (byte[] b) 方法, 從輸入流中讀取一定數(shù)量的字節(jié)罢荡,并將其存儲在緩沖區(qū)數(shù)組 b 中赡突。以整數(shù)形式返回實(shí)際讀取的字節(jié)數(shù)。
IO流(BufferedInputStream和BufferOutputStream拷貝)
* A:緩沖思想
* 字節(jié)流一次讀寫一個(gè)數(shù)組的速度明顯比一次讀寫一個(gè)字節(jié)的速度快很多区赵,
* 這是加入了數(shù)組這樣的緩沖區(qū)效果惭缰,java本身在設(shè)計(jì)的時(shí)候,
* 也考慮到了這樣的設(shè)計(jì)思想笼才,所以提供了字節(jié)緩沖區(qū)流
* B.BufferedInputStream
* BufferedInputStream內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)
* 從BufferedInputStream中讀取一個(gè)字節(jié)時(shí)
* BufferedInputStream會一次性從文件中讀取8192個(gè), 存在緩沖區(qū)中, 返回給程序一個(gè)
* 程序再次讀取時(shí), 就不用找文件了, 直接從緩沖區(qū)中獲取
* 直到緩沖區(qū)中所有的都被使用過, 才重新從文件中讀取8192個(gè)
* C.BufferedOutputStream
* BufferedOutputStream也內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)
* 程序向流中寫出字節(jié)時(shí), 不會直接寫到文件, 先寫到緩沖區(qū)中
* 直到緩沖區(qū)寫滿, BufferedOutputStream才會把緩沖區(qū)中的數(shù)據(jù)一次性寫到文件里
:小數(shù)組的讀寫和帶Buffered的讀取哪個(gè)更快?
* 定義小數(shù)組如果是8192個(gè)字節(jié)大小和Buffered比較的話
* 定義小數(shù)組會略勝一籌,因?yàn)樽x和寫操作的是同一個(gè)數(shù)組
* 而Buffered操作的是兩個(gè)數(shù)組
8:字符流FileReader和FileWriter
字符流是什么
* 字符流是可以直接讀寫字符的IO流
* 字符流讀取字符, 就要先讀取到字節(jié)數(shù)據(jù), 然后轉(zhuǎn)為字符. 如果要寫出字符, 需要把字符轉(zhuǎn)為字節(jié)再寫出.
IO流(什么情況下使用字符流)
* 字符流也可以拷貝文本文件, 但不推薦使用. 因?yàn)樽x取時(shí)會把字節(jié)轉(zhuǎn)為字符, 寫出時(shí)還要把字符轉(zhuǎn)回字節(jié).
* 程序需要讀取一段文本, 或者需要寫出一段文本的時(shí)候可以使用字符流
* 讀取的時(shí)候是按照字符的大小讀取的,不會出現(xiàn)半個(gè)中文
* 寫出的時(shí)候可以直接將字符串寫出,不用轉(zhuǎn)換為字節(jié)數(shù)組
IO流(字符流是否可以拷貝非純文本的文件)
* 不可以拷貝非純文本的文件
* 因?yàn)樵谧x的時(shí)候會將字節(jié)轉(zhuǎn)換為字符,在轉(zhuǎn)換過程中,可能找不到對應(yīng)的字符,就會用?代替,寫出的時(shí)候會將字符轉(zhuǎn)換成字節(jié)寫出去
* 如果是?,直接寫出,這樣寫出之后的文件就亂了,看不了了
字符流的使用
public class FileTest {
? ? public static void main(String[] args) throws Exception{
? ? ? ? BufferedReader br=new BufferedReader(new FileReader("aaa.txt"));
? ? ? BufferedWriter bw=new BufferedWriter(new FileWriter("bbb.txt"));
? ? ? ? //BufferedReader和BufferedWriter的使用:
? ? ? ? int b;
? ? ? ? while((b=br.read())!=-1){
? ? ? ? ? ? bw.write((char)b);
? ? ? ? }
? ? ? ? br.close();
? ? ? ? bw.close();
? ? }
}