日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

33.JAVA编程思想——JAVA IO File类

發(fā)布時(shí)間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 33.JAVA编程思想——JAVA IO File类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

33.JAVA編程思想——JAVA IO File類

RandomAccessFile用于包括了已知長度記錄的文件。以便我們能用 seek()從一條記錄移至還有一條;然后讀取或改動(dòng)那些記錄。

各記錄的長度并不一定同樣;僅僅要知道它們有多大以及置于文件何處就可以。

首先。我們有點(diǎn)難以相信RandomAccessFile 不屬于InputStream 或者OutputStream 分層結(jié)構(gòu)的一部分。除了恰巧實(shí)現(xiàn)了DataInput 以及DataOutput(這兩者亦由 DataInputStream和DataOutputStream實(shí)現(xiàn))接口之外,它們與那些分層結(jié)構(gòu)并無什么關(guān)系。它甚至沒實(shí)用到現(xiàn)有InputStream 或OutputStream 類的功能——採用的是一個(gè)全然不相干的類。

該類屬于全新的設(shè)計(jì),含有自己的全部(大多數(shù)為固有)方法。

之所以要這樣做,是由于RandomAccessFile 擁有與其它 IO類型全然不同的行為。由于我們可在一個(gè)文件中向前或向后移動(dòng)。無論在哪種情況下。它都是獨(dú)立運(yùn)作的,作為Object 的一個(gè)“直接繼承人”使用。

從根本上說,RandomAccessFile 相似DataInputStream和 DataOutputStream的聯(lián)合使用。

當(dāng)中,getFilePointer()用于了解當(dāng)前在文件的什么地方。seek()用于移至文件內(nèi)的一個(gè)新地點(diǎn)。而 length()用于推斷文件的最大長度。

此外,構(gòu)建器要求使用還有一個(gè)自變量(與C 的fopen()全然一樣)。指出自己僅僅是隨機(jī)讀("r")。還是讀寫兼施("rw")。這里沒有提供對(duì)“僅僅寫文件”的支持。也就是說,假如是從DataInputStream繼承的,那么 RandomAccessFile也有可能能非常好地工作。

還有更難對(duì)付的。非常easy想象我們有時(shí)要在其它類型的數(shù)據(jù)流中搜索,比方一個(gè)ByteArrayInputStream。但搜索方法僅僅有RandomAccessFile 才會(huì)提供。而后者僅僅能針對(duì)文件才干操作,不能針對(duì)數(shù)據(jù)流操作。此時(shí)。BufferedInputStream 確實(shí)同意我們標(biāo)記一個(gè)位置(使用mark(),它的值容納于單個(gè)內(nèi)部變量中)。并用reset()重設(shè)那個(gè)位置。但這些做法都存在限制。并非特別實(shí)用。

1.??File類

File 類有一個(gè)欺騙性的名字——一般會(huì)覺得它對(duì)付的是一個(gè)文件。但實(shí)情并非如此。它既代表一個(gè)特定文件的名字,也代表文件夾內(nèi)一系列文件的名字。若代表一個(gè)文件集。便可用list()方法查詢這個(gè)集,返回的是一個(gè)字串?dāng)?shù)組。之所以要返回一個(gè)數(shù)組,而非某個(gè)靈活的集合類。是由于元素的數(shù)量是固定的。并且若想得到

一個(gè)不同的文件夾列表。僅僅需創(chuàng)建一個(gè)不同的File 對(duì)象就可以。其實(shí),“FilePath”(文件路徑)似乎是一個(gè)更好的名字。

1.1?????????????文件夾列表器

如果想觀看一個(gè)文件夾列表。可用兩種方式列出File 對(duì)象。若在不含自變量(參數(shù))的情況下調(diào)用list(),會(huì)獲得 File 對(duì)象包括的一個(gè)完整列表。

然而。若想對(duì)這個(gè)列表進(jìn)行某些限制,就須要使用一個(gè)“文件夾過濾器”,該類的作用是指出應(yīng)怎樣選擇File 對(duì)象來完畢顯示。

樣例的代碼:

l? 代碼例如以下

import java.io.*;

public classDirList {

??? public static void main(String[] args) {

??????? try {

??????????? Filepath= newFile(".");

??????????? String[]list;

??????????? if (args.length == 0)

??????????????? list = path.list();

??????????? else

??????????????? list = path.list(new DirFilter(args[0]));

??????????? for (int i = 0; i < list.length; i++)

??????????????? System.out.println(list[i]);

??????? }catch(Exception e) {

??????????? e.printStackTrace();

??????? }

??? }

}

class DirFilter implements FilenameFilter {

??? Stringafn;

??? DirFilter(Stringafn){

??????? this.afn = afn;

??? }

??? public boolean accept(File dir, String name) {

??????? // Strip path information:

??????? Stringf = new File(name).getName();

??????? return f.indexOf(afn) != -1;

??? }

} /// :~

l? 運(yùn)行

.classpath

.project

.settings

bin

src

DirFilter 類“實(shí)現(xiàn)”了interface FilenameFilter。

以下讓我們看看FilenameFilter接口有多么簡單:

public interface FilenameFilter {

boolean accept(文件文件夾, 字串名);

}

它指出這樣的類型的全部對(duì)象都提供了一個(gè)名為 accept()的方法。之所以要?jiǎng)?chuàng)建這樣的一個(gè)類,背后的全部原因就是把a(bǔ)ccept()方法提供給 list()方法。使list()可以“回調(diào)”accept(),從而推斷應(yīng)將哪些文件名稱包括到列表中。因此,通常將這樣的技術(shù)稱為“回調(diào)”,有時(shí)也稱為“算子”(也就是說,DirFilter 是一個(gè)算子,由于它唯一的作用就是容納一個(gè)方法)。

由于 list()採用一個(gè) FilenameFilter 對(duì)象作為自己的自變量使用。所以我們能傳遞實(shí)現(xiàn)了FilenameFilter 的不論什么類的一個(gè)對(duì)象,用它決定(甚至在運(yùn)行期)list()方法的行為方式。

回調(diào)的目的是在代碼的行為上提供更大的靈活性。

通過DirFilter。我們看出雖然一個(gè)“接口”僅僅包括了一系列方法。但并不局限于僅僅能寫那些方法(可是。至少必須提供一個(gè)接口內(nèi)全部方法的定義。

在這樣的情況下,DirFilter 構(gòu)建器也會(huì)創(chuàng)建)。accept()方法必須接納一個(gè) File 對(duì)象,用它指示用于尋找一個(gè)特定文件的文件夾;并接納一個(gè)String,當(dāng)中包括了要尋找之文件的名字。可決定使用或忽略這兩個(gè)參數(shù)之中的一個(gè)。但有時(shí)至少要使用文件名稱。

記住list()方法準(zhǔn)備為文件夾對(duì)象中的每一個(gè)文件名稱調(diào)用accept(),核實(shí)哪個(gè)應(yīng)包括在內(nèi)——詳細(xì)由 accept()返回的“布爾”結(jié)果決定。

為確定我們操作的僅僅是文件名稱,當(dāng)中沒有包括路徑信息,必須採用String對(duì)象,并在它的外部創(chuàng)建一個(gè)File 對(duì)象。

然后調(diào)用 getName()。它的作用是去除全部路徑信息(採用與平臺(tái)無關(guān)的方式)。隨后,accept()用String 類的indexOf()方法檢查文件名稱內(nèi)部是否存在搜索字串"afn"。

若在字串內(nèi)找到 afn,那么返回值就是afn 的起點(diǎn)索引;但假如沒有找到,返回值就是-1。

注意這僅僅是一個(gè)簡單的字串搜索樣例。未使用常見的表達(dá)式“通配符”方案,比方"fo?.b?r*";這樣的方案更難實(shí)現(xiàn)。

list()方法返回的是一個(gè)數(shù)組。

可查詢這個(gè)數(shù)組的長度,然后在當(dāng)中遍歷,選定數(shù)組元素。

與 C 和C++的相似行為相比,這樣的于方法內(nèi)外方便游歷數(shù)組的行為無疑是一個(gè)顯著的進(jìn)步。

1.2?????????????匿名內(nèi)部類

l? 代碼例如以下

用一個(gè)匿名內(nèi)部類來重寫顯得非常理想。首先創(chuàng)建了一個(gè)filter()方法,它返回指向FilenameFilter 的一個(gè)句柄:

import java.io.*;

public classDirList2 {

??? public static FilenameFilter filter(final String afn) {

??????? // Creation of anonymous inner class:

??????? return new FilenameFilter() {

??????????? Stringfn = afn;

??????????? public boolean accept(File dir, String n) {

??????????????? // Strip path information:

??????????????? Stringf = new File(n).getName();

??????????????? return f.indexOf(fn) != -1;

??????????? }

??????? };// End of anonymous inner class

??? }

??? public static void main(String[] args) {

??????? try {

??????????? Filepath= newFile(".");

??????????? String[]list;

??????????? if (args.length == 0)

??????????????? list = path.list();

??????????? else

??????????????? list = path.list(filter(args[0]));

??????????? for (int i = 0; i < list.length; i++)

??????????????? System.out.println(list[i]);

??????? }catch(Exception e) {

??????????? e.printStackTrace();

??????? }

??? }

} /// :~

?

l? 運(yùn)行

.classpath

.project

.settings

bin

src

注意filter()的自變量必須是final。

這一點(diǎn)是匿名內(nèi)部類要求的,使其能使用來自本身作用域以外的一個(gè)對(duì)象。

之所以覺得這樣做更好,是由于FilenameFilter 類如今同DirList2 緊密地結(jié)合在一起。然而,我們可採取進(jìn)一步的操作,將匿名內(nèi)部類定義成list()的一個(gè)參數(shù),使其顯得更加精簡。

l? 代碼2

import java.io.*;

?

public classDirList3 {

??? public static void main(final String[] args) {

??????? try {

??????????? Filepath= newFile(".");

??????????? String[]list;

??????????? if (args.length == 0)

??????????????? list = path.list();

??????????? else

??????????????? list = path.list(new FilenameFilter() {

??????????????????? public boolean accept(File dir, String n) {

??????????????????????? Stringf = new File(n).getName();

??????????????????????? return f.indexOf(args[0]) != -1;

??????????????????? }

??????????????? });

??????????? for (int i = 0; i < list.length; i++)

??????????????? System.out.println(list[i]);

??????? }catch(Exception e) {

??????????? e.printStackTrace();

??????? }

??? }

} /// :~

l? 運(yùn)行

.classpath

.project

.settings

bin

src

main()如今的自變量是 final。由于匿名內(nèi)部類直接使用args[0]。

這展示了怎樣利用匿名內(nèi)部類高速創(chuàng)建精簡的類。以便解決一些復(fù)雜的問題。由于Java 中的全部東西都與類有關(guān),所以它無疑是一種相當(dāng)實(shí)用的編碼技術(shù)。它的一個(gè)優(yōu)點(diǎn)是將特定的問題隔離在一個(gè)地方統(tǒng)一解決。但在還有一方面,這樣生成的代碼不是十分easy閱讀,所以使用時(shí)必須謹(jǐn)慎。

1.3?????????????順序文件夾列表

常常都須要文件名稱以排好序的方式提供。由于 Java 1.0 和Java 1.1 都沒有提供對(duì)排序的支持(從 Java 1.2開始提供),用創(chuàng)建的 SortVector將這一能力直接添加自己的程序。

l? 代碼

import java.io.*;

public classSortedDirList {

??? private File path;

??? private String[] list;

??? public SortedDirList(final String afn) {

??????? path = new File(".");

??????? if (afn == null)

??????????? list = path.list();

??????? else

??????????? list = path.list(new FilenameFilter() {

??????????????? public boolean accept(File dir, String n) {

??????????????????? Stringf = new File(n).getName();

??????????????????? return f.indexOf(afn) != -1;

??????????????? }

??????????? });

??????? sort();

??? }

??? void print() {

??????? for (int i = 0; i < list.length; i++)

??????????? System.out.println(list[i]);

??? }

??? private void sort() {

??????? StrSortVectorsv = new StrSortVector();

??????? for (int i = 0; i < list.length; i++)

??????????? sv.addElement(list[i]);

??????? // The first time an element is pulled from

??????? // the StrSortVector the list is sorted:

??????? for (int i = 0; i < list.length; i++)

??????????? list[i] = sv.elementAt(i);

??? }

??? // Test it:

??? public static void main(String[] args) {

??????? SortedDirListsd;

??????? if (args.length == 0)

??????????? sd = new SortedDirList(null);

??????? else

??????????? sd = new SortedDirList(args[0]);

??????? sd.print();

??? }

} /// :~

l? 運(yùn)行

.classpath

.project

.settings

bin

src

這里進(jìn)行了另外少許改進(jìn)。不再是將path(路徑)和 list(列表)創(chuàng)建為main()的本地變量,它們變成了類的成員。使它們的值能在對(duì)象“生存”期間方便地訪問。其實(shí)。main()如今僅僅是對(duì)類進(jìn)行測(cè)試的一種方式。

一旦列表創(chuàng)建完畢,類的構(gòu)建器就會(huì)自己主動(dòng)開始對(duì)列表進(jìn)行排序。

這樣的排序不要求區(qū)分大寫和小寫,所以終于不會(huì)得到一組全部單詞都以大寫字母開頭的列表。跟著是全部以小寫字母開頭的列表。

然而,我們注意到在以同樣字母開頭的一組文件名稱中。大寫字母是排在前面的——這對(duì)標(biāo)準(zhǔn)的排序來說仍是一種不合格的行為。

Java 1.2 已成功攻克了這個(gè)問題。

1.4?????????????檢查與創(chuàng)建文件夾

File 類并不僅僅是對(duì)現(xiàn)有文件夾路徑、文件或者文件組的一個(gè)表示。亦可用一個(gè) File 對(duì)象新建一個(gè)文件夾,甚至創(chuàng)建一個(gè)完整的文件夾路徑——假如它尚不存在的話。

亦可用它了解文件的屬性(長度、上一次改動(dòng)日期、讀/寫屬性等),檢查一個(gè)File 對(duì)象究竟代表一個(gè)文件還是一個(gè)文件夾。以及刪除一個(gè)文件等等。下列程序完整展示了怎樣運(yùn)用File 類剩下的這些方法:

l? 代碼

import java.io.*;

?

public classMakeDirectories {

??? private final static String usage = "Usage:MakeDirectories path1 ...\n" + "Creates each path\n"

??????????? +"Usage:MakeDirectories -d path1...\n" + "Deleteseach path\n" + "Usage:MakeDirectories -r path1 path2\n"

??????????? +"Renames from path1 to path2\n";

??? private static void usage() {

??????? System.err.println(usage);

??????? System.exit(1);

??? }

??? private static void fileData(File f) {

??????? System.out.println("Absolute path: "+ f.getAbsolutePath()+ "\n Can read: " + f.canRead() + "\n Can write: "

??????????????? +f.canWrite() + "\n getName: "+ f.getName() + "\n getParent: "+ f.getParent() + "\n getPath: "

??????????????? +f.getPath() + "\n length: "+ f.length() + "\n lastModified: "+ f.lastModified());

??????? if (f.isFile())

??????????? System.out.println("it's a file");

??????? else if (f.isDirectory())

??????????? System.out.println("it's a directory");

??? }

?

??? public static void main(String[] args) {

??????? if (args.length < 1)

??????????? usage();

??????? if (args[0].equals("-r")) {

??????????? if (args.length != 3)

??????????????? usage();

??????????? Fileold= newFile(args[1]),rname= newFile(args[2]);

??????????? old.renameTo(rname);

??????????? fileData(old);

??????????? fileData(rname);

??????????? return; // Exit main

??????? }

??????? int count = 0;

??????? boolean del = false;

??????? if (args[0].equals("-d")) {

??????????? count++;

??????????? del = true;

??????? }

??????? for (; count < args.length; count++) {

??????????? Filef = new File(args[count]);

??????????? if (f.exists()) {

??????????????? System.out.println(f + " exists");

??????????????? if (del) {

??????????????????? System.out.println("deleting..."+ f);

??????????????????? f.delete();

??????????????? }

??????????? }else{ // Doesn't exist

??????????????? if (!del) {

??????????????????? f.mkdirs();

??????????????????? System.out.println("created "+ f);

??????????????? }

??????????? }

??????????? fileData(f);

??????? }

??? }

} /// :~

l? 運(yùn)行

Usage:MakeDirectories path1 ...

Creates each path

Usage:MakeDirectories -d path1 ...

Deletes each path

Usage:MakeDirectories -r path1 path2

Renames from path1 to path2

加上運(yùn)行參數(shù):-rtest1.txt test2.txt

然后在文件夾中添加test1.txt文件,運(yùn)行后

Absolute path: F:\java_test\test1.txt

?Can read: false

?Can write: false

?getName: test1.txt

?getParent: null

?getPath: test1.txt

?length: 0

?lastModified: 0

Absolute path: F:\java_test\test2.txt

?Can read: true

?Can write: true

?getName: test2.txt

?getParent: null

?getPath: test2.txt

?length: 0

?lastModified: 1460890496589

it's a file

?

在fileData()中。可看到應(yīng)用了各種文件調(diào)查方法來顯示與文件或文件夾路徑有關(guān)的信息。

main()應(yīng)用的第一個(gè)方法是 renameTo(),利用它可以重命名(或移動(dòng))一個(gè)文件至一個(gè)全新的路徑(該路徑由參數(shù)決定),它屬于還有一個(gè)File 對(duì)象。這也適用于不論什么長度的文件夾。

若試驗(yàn)上述程序。就可發(fā)現(xiàn)自己能制作隨意復(fù)雜程度的一個(gè)文件夾路徑,由于mkdirs()會(huì)幫我們完畢全部工作。在Java 1.0 中,-d標(biāo)志報(bào)告文件夾雖然已被刪除,但它依舊存在。但在 Java 1.1 中,文件夾會(huì)被實(shí)際刪除。

2.??附SortVector.java

import java.util.*;

public classSortVector extends Vector {

??? private Compare compare; // To hold the callback

??? public SortVector(Compare comp) {

??????? compare = comp;

??? }

??? public void sort() {

??????? quickSort(0,size() - 1);

??? }

??? private void quickSort(int left, int right) {

??????? if (right > left) {

??????????? Objecto1 = elementAt(right);

??????????? int i = left - 1;

??????????? int j = right;

??????????? while (true) {

??????????????? while (compare.lessThan(elementAt(++i), o1))

??????????????????? ;

??????????????? while (j > 0)

??????????????????? if (compare.lessThanOrEqual(elementAt(--j), o1))

??????????????????????? break; // out of while

??????????????? if (i >= j)

??????????????????? break;

??????????????? swap(i, j);

??????????? }

??????????? swap(i, right);

??????????? quickSort(left, i - 1);

??????????? quickSort(i + 1, right);

??????? }

??? }

??? private void swap(int loc1, int loc2) {

??????? Objecttmp= elementAt(loc1);

??????? setElementAt(elementAt(loc2), loc1);

??????? setElementAt(tmp, loc2);

??? }

} /// :~

3.??附StrSortVector.java

import java.util.*;

interface Compare {

??? boolean lessThan(Object lhs, Object rhs);

?

??? boolean lessThanOrEqual(Object lhs, Object rhs);

} /// :~

public classStrSortVector{

??? private SortVector v = new SortVector(

??????????? // Anonymous inner class:

??????????? new Compare() {

??????????????? public boolean lessThan(Object l, Object r) {

??????????????????? return ((String) l).toLowerCase().compareTo(((String)r).toLowerCase())< 0;

??????????????? }

??????????????? public boolean lessThanOrEqual(Object l, Object r) {

??????????????????? return ((String) l).toLowerCase().compareTo(((String)r).toLowerCase())<= 0;

??????????????? }

??????????? });

??? private boolean sorted = false;

??? public void addElement(String s) {

??????? v.addElement(s);

??????? sorted = false;

??? }

??? public String elementAt(int index) {

??????? if (!sorted) {

??????????? v.sort();

??????????? sorted = true;

??????? }

??????? return (String) v.elementAt(index);

??? }

??? public Enumerationelements() {

??????? if (!sorted) {

??????????? v.sort();

??????????? sorted = true;

??????? }

??????? return v.elements();

??? }

??? // Test it:

??? public static void main(String[] args) {

??????? StrSortVector sv = new StrSortVector();

??????? sv.addElement("d");

??????? sv.addElement("A");

??????? sv.addElement("C");

??????? sv.addElement("c");

??????? sv.addElement("b");

??????? sv.addElement("B");

??????? sv.addElement("D");

??????? sv.addElement("a");

??????? Enumeratione = sv.elements();

??????? while (e.hasMoreElements())

??????????? System.out.println(e.nextElement());

??? }

} /// :~

?

?

總結(jié)

以上是生活随笔為你收集整理的33.JAVA编程思想——JAVA IO File类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。