天天看點

黑馬程式員-----IO(二)一、File類二、其他流介紹

------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------

一、File類

1、File類概述

該類對檔案系統的中的檔案以及檔案夾進行對象的封裝,友善對檔案檔案夾的屬性資訊如檔案名、建立修改時間、大小、可讀可寫屬性等進行操作,File對象可以作為參數傳遞給流的構造函數

File f1 = new file(“c:\\aaa\\a.txt”); 

File f2 = new File(“c:\\aaa”,”b.txt”); 

File d = new File(“c:\\abc”); 

File f3 = new File(d,”c.txt”);

名稱分隔符 

C:\\aaa\\eds.txt 同 “C:”+ File.separator+”abc”++ File.separator+“aaa.txt” 

2、File類常見方法:

1)建立

boolean createNewFile();在指定位置建立檔案,如果該檔案已經存在則不建立傳回false,和輸出流不一樣,輸出流對象一建立

boolean mkdir()建立檔案夾

boolean mkdirs()建立多級檔案夾

2)删除

boolean delete();删除失敗傳回false

Void deleteOnExit();在程式退出時删除指定檔案

3)判斷

boolean canExcause();是否可以執行

canRead();

canWrite();

boolean exist();

Boolean isFile();是否是檔案,不存在為false,判斷是檔案或檔案夾時必須判斷是否存在exist();

Boolean isDirectory()是否是目錄

Boolean isHidden() 是否是隐藏檔案

Boolean isAbsolute();是否是絕對路徑

4)擷取資訊

getName();

getPatn();擷取相對路徑

getParent();擷取父目錄,該方法傳回new File()裡的檔案上一級目錄

getAbsolutePath();擷取絕對路徑傳回值可以是String 或File類 

lastModified();最後修改時間

long Length();

5)移動 renameTo()例把“C:\\a.txt”) 移動到“D:\\a.txt”

File a = new File(“C:\\a.txt”);

File b = new File(“D:\\a.txt”);

a.renameTo(b);      

例:遞歸方法列出目錄下所有内容:

Public static void main(String[] args)
{
   File dir = new File(“D:\\JAVA基礎視訊”);
   showDir(dir);
}
Public static void showDir(File dir)
{
   System.out.println(dir);
   File[] files = dir.listFiles();
   For(int x= 0;x<files.length;x++)
   {
   if(file[x].isDirectory())
     showDir(files[x]);
   else
     System.out.println(files[x]);
   }
}
           

删除帶内容的目錄:

原理:windows删除從裡到外删除

Public static void removeDir(File dir)
{
   File[] files = dir.listFiles();
   For(int x=0;x<files.length;x++)
   {
      if(files[x].isHidden()&&files[x].isDirectory())
          removeDir(files[x]);
    }
}
           

二、其他流介紹

1、序列流

構造函數

SequenceInputStream(InputStream s1, InputStream s2)

SequenceOutputStream(OutputStream s1, OutputStream s2)

例:合并多個流:

public static void hebingSequenceInputStream() throws Exception {
		InputStream in1 = new FileInputStream("c:/a.txt");
		InputStream in2 = new FileInputStream("c:/b.txt");
		InputStream in3 = new FileInputStream("c:/c.txt");

		LinkedHashSet<InputStream> set = new LinkedHashSet<InputStream>();
		set.add(in1);
		set.add(in2);
		set.add(in3);
		final Iterator<InputStream> iter = set.iterator();

		SequenceInputStream sin = new SequenceInputStream(
				new Enumeration<InputStream>() {
					@Override
					public boolean hasMoreElements() {
						return iter.hasNext();
					}

					@Override
					public InputStream nextElement() {
						return iter.next();
					}
				});

		FileOutputStream out = new FileOutputStream("c:/z.txt");

		for (int b = -1; (b = sin.read()) != -1;) {
			out.write(b);
		}
        sin.close();
		out.close();
	}
           

例:切割檔案

FileInputStream fis = new FileInputStream(“C:\\123.bmp”);
FileOutputStream fos = null;
Byte[] buf = new byte[1024*1024];
Int len = 0;
Int count =1;
While(len = fis.read(buf)!=-1)
{
    Fos = new FileOutputStream((count++) +“.txt”);
    Fos.write(buf,0,len);
    Fos.close();
}
Fis.close();
           

2、對象的序列化

對象的序列化:将記憶體中的對象直接寫入到檔案裝置中 ;對象的反序列化: 将檔案裝置中持久化的資料轉換為記憶體對象。

ObjectInputStream ObjectOutputStream

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“abc.txt”))

oos.writeObject(new Person(“lisi”,39));

oos.close();

ObjectInputStream ois = new ObjectInputStream (new FileInputStream(“abc.txt”))

Person p = (Person)ois.readObject();

System.out.println(p);

ois.close();

注:需要被序列化的類必須是實作Serializable接口,該接口中沒有描述任何的屬性和方法,稱之為标記接口。如果對象沒有實作接口Serializable,在進行序列化時會抛出:NotSerializableException 異常。

3、Properties

Properties 是hashtable的子類,可用于鍵值對形式的配置檔案也就是說它具備map集合的特點.Properties:該集合不需要泛型,因為該集合中的鍵值對都是String類型。

Map

|--Hashtable

|--Properties

Properties常用方法:

1)存入鍵值對:setProperty(key,value);

Properties prop = new Properties();

prop.setProperty(“zhangsan”,”30”);

2)擷取指定鍵對應的值value getProperty(key); 

String value = prop.getProperty(“lisi”);

3)擷取集合中所有鍵元素:Enumeration  propertyNames();

在jdk1.6版本給該類提供一個新的方法。

Set<String> names = prop.stringPropertyNames();

For(String s:names)

{

String s = prop.getProperty(s);

]

4)列出該集合中的所有鍵值對,可以通過參數列印流指定列出到的目的地。

list(PrintStream);

list(PrintWriter);

5)可以将流中的規則資料加載進行集合,并稱為鍵值對。

load(InputStream):

jdk1.6版本。提供了新的方法load(Reader):

6,可以将集合中的資料進行指定目的的存儲。

store(OutputStram,String comment)方法。

jdk1.6版本。提供了新的方法 store(Writer ,String comment);使用該方法存儲時,會帶着當時存儲的時間。

4、列印流

1,位元組列印流PrintStream,System.out對應的類型就是PrintStream。

它的構造函數可以接收三種資料類型的值。

1)字元串路徑。

2)File對象。

3)OutputStream。

列印流的三種方法

void print(資料類型 變量)  

println(資料類型 變量) 提供換行,自動重新整理

printf(String format, Object... args) 可以自定資料格式

JDK1.5之後Java對PrintStream進行了擴充,增加了格式化輸出方式,可以使用printf()重載方法直接格式化輸出。但是在格式化輸出的時候需要指定輸出的資料類型格式。

2、PrintWriter是一個字元列印流。

構造函數可以接收四種類型的值。對于1,2類型的資料,還可以指定編碼表。也就是字元集。對于3,4類型的資料,可以指定自動重新整理。

1,字元串路徑。

2,File對象。

3,OutputStream

4,Writer

注意:該自動重新整理值為true時,隻有三個方法可以用:println,printf,format.

PrintWrter pw = newPrintWriter(new  BufferdWriter(new OutputSteamWriter(newFileOutputStream("a.txt"),"utf-8")),true);

5、 操作數組的流對象

1)位元組數組  ByteArrayInputStream以及ByteArrayOutputStream

toByteArray();

toString();

writeTo(OutputStream);

2)字元數組  CharArrayReader以及CharArrayWriter

對于這些流,源是記憶體。目的也是記憶體。而且這些流并未調用系統資源。使用的就是記憶體中的數組。是以這些在使用的時候不需要close。

注:操作數組的讀取流在構造時,必須要明确一個資料源。是以要傳入相對應的數組。

對于操作數組的寫入流,在構造函數可以使用空參數。因為它内置了一個可變長度數組作為緩沖區。 

6、操作基本資料類型的流對象

DataInputStream 從資料流讀取位元組,并将它們轉換為正确的基本資料類型值或字元串。

DataOutputStream 将基本類型的值或字元串轉換為位元組,并且将位元組輸出到資料流。

1)DataInputStream類繼承FilterInputStream類,并實作了DataInput接口。

DataInputStream

操作基本資料類型的方法:

int readInt():一次讀取四個位元組,并将其轉成int值。

boolean readBoolean():一次讀取一個位元組。

short readShort();

long readLong();

String readUTF():按照utf-8修改版讀取字元。注意,它隻能讀writeUTF()寫入的字元資料。

2)DataOutputStream(OutputStream):

操作基本資料類型的方法:

writeInt(int):一次寫入四個位元組。write(int)隻将該整數的最低一個8位寫入。剩餘三個8位丢棄。

writeBoolean(boolean);

writeShort(short);

writeLong(long);

writeUTF(String):按照utf-8修改版将字元資料進行存儲。隻能通過readUTF讀取。

繼續閱讀