序文
この記事から始めて、基本的にファイルの読み取りと書き込みであるJava IOシステムの学習を開始します。簡単に聞こえますが、簡単ではありません。 JavaのIOシステムは改善および改善されており、多数のクラスを設計しています。設計されているこれらのタイプの意味とそれぞれのアプリケーションシナリオを理解することによってのみ、ファイルIOの理解を深めることができます。
したがって、最初のステップは、ファイルを表現する方法の問題を解決することです。 Javaの世界では、「すべてはオブジェクトです」であり、Javaオブジェクトへの実際のディスクファイルまたはディレクトリにどのように対応するかが私たちの主要な問題です。
ファイルは、通常のファイルであろうとディレクトリであろうと、ファイルを抽象化するためにJavaで使用されます。ファイルオブジェクトに対応できます。ファイルタイプの配置において誰もが正確である必要があると思います。それは単にディスク上のファイルまたはディレクトリを抽象的に表し、実際にはプラットフォームに依存しないローカルファイルシステムクラスに依存しており、ファイルはそれが表すファイルコンテンツで読み取り操作を実行できません(つまり、ストリームが行うことです)。
ファイルインスタンスを作成します
実際にファイルインスタンスコンストラクターメソッドを導入する前に、そのいくつかの重要な属性メンバーを調べる必要があります。
プライベート静的最終ファイルシステムfs = defaultfilesystem.getFilesystem();
これは、ファイルクラスの最もコアメンバーであり、現在のシステムのファイルシステムAPIとして表されます。ディスクに発行されたすべての操作は、このプロパティに基づいています。
プライベートファイナルストリングパス。
パスは、現在のインスタンスのフルパス名を表します。現在のファイルインスタンスがディレクトリを表す場合、パスの値は完全なディレクトリ名です。純粋なファイルを表す場合、このパスの値はファイル +ファイル名のフルパスに等しくなります。
public static final chartarChar = fs.getSeparator(); public static final char pathseparatorchar = fs.getpathseparator();
SeparatorCharはディレクトリ間のセパレーターを表し、PathSeparatorCharは異なるパスの下でセパレーターを表します。これらの2つの値は、システムプラットフォームが異なる場合に異なります。たとえば、これら2つのウィンドウの値は、「 "" and ";"であり、禁止が複数の異なるパスを分離するために使用されます。
ファイルクラスは、ファイルオブジェクトをインスタンス化するための4つの異なるコンストラクターを提供しますが、より一般的に使用されるのは3つだけです。また、最初の3つのコンストラクターの学習にも焦点を当てています。
パブリックファイル(StringPathName)
これは、ファイルオブジェクトをインスタンス化する最も一般的な方法です。 PathName値は、ディレクトリまたはプレーンファイル名です。例えば:
file file = new file( "c:// users // yanga // desktop"); file file1 = new file( "c://users/yanga//desktop//a.txt"); file file2 = new file( "a.txt");
もちろん、親のパスを明示的に指定することもできます。
パブリックファイル(String Parent、StringChild)
コンストラクターの内部では、プログラムは私たちのための完全なファイルパスをスプライスします。たとえば
file file = new file( "c:// users // yanga // desktop"、 "a.txt"); file file1 = new file( "c:// users // yanga // desktop"、 "java");
3番目のコンストラクターは、親ファイルインスタンスのカプセル化プロセスを追加することを除いて、本質的に2番目のコンストラクターと同じです。
パブリックファイル(ファイルの親、文字列子)
同様の状況については説明しません。ここでは、これらのコンストラクターの内部具体的な実装を掘り下げていません。それが単純であるということではありません。代わりに、ファイルはローカルファイルシステムに依存しすぎており、多くの方法の実装を直接見ることができません。したがって、ファイルを学習するためには、ファイルを習得するのに熟練するだけで十分であり、当面の間、特定の実装を深く学ぶことはできません。
ファイル名またはパスに関連する情報を取得します
getNameメソッドを使用してファイル名を取得できます。
public string getName(){int index = path.lastindexof(separatorchar); if(index <prefixlength)return path.substring(prefixlength); retur path.substring(index + 1);}私たちのセパレーターチャールが表すものを覚えていますか?
パスセパレーターとして表され、Windowsのシンボル「」はパス属性に保存され、現在のファイルインスタンスのフルパス名が保存されるため、最後の発生後のすべての文字はファイル名でなければなりません。
もちろん、純粋なファイルの場合、このメソッドはファイルの単純な名前を返すことができることを発見した必要がありますが、ディレクトリの場合、返品値は最新のディレクトリ名になります。例えば:
file file = new file( "c://users//yanga//desktop//a.txt"); system.out.println(file.getName()); file1 = new file( "c:// users // yanga // desktop"); system.out.out.out.println(file1.getName());
出力はあなたを驚かせません:
a.txtdesktop
GetParentメソッドは、現在のファイルの親ディレクトリを返すために使用されます。あなたがプレーンファイルであろうとディレクトリであろうと、最終的には親ディレクトリがあります(もちろん、仮想マシンによって生成される一時ファイルはもちろんではありません)。
public string getParent(){int index = path.lastindexof(separatorchar); if(index <prefixlength){if((prefixlength> 0)&&(path.length()> prefixlength))return path.substring(0、prefixLength); nullを返します。 } path.substring(0、index);}を返すメソッドの実装は非常に簡単なので、詳細は説明しません。
getPathメソッドは、現在のファイルインスタンスのファイル名全体名を返すことができます。
public string getPath(){return path;}以下は、ディレクトリに関連するいくつかの関連操作であり、実装が比較的簡単です。簡単なリストは次のとおりです。
ここでは、GetCanonicalPathの説明を説明する必要があります。標準的なパスは何ですか、そして絶対的なパスに違いはありますか?
一般的に言えば、「../」とは、ソースファイルが配置されているディレクトリの以前のディレクトリを意味します。「../../」とは、ソースファイルが配置されているディレクトリの以前のディレクトリなどを意味します。 getabsolutepathメソッドはそのような変換操作を実行しませんが、getCanonicalPathメソッドはこれらの特殊文字を認識し、適切なセマンティクスを取得します。
例えば:
file file = new file( "..// a.txt"); system.out.println(file.getabsolutepath()); system.out.println(file.getCanonicalPath());
出力結果:
c:/users/yanga/desktop/java/workspace2017/testfile/../ a.txt
c:/users/yanga/desktop/java/workspace2017/a.txt
前者はファイルパス名の一部として「../a.txt」を使用しますが、後者は「../a.txt」が「a.txt」が現在のディレクトリの上部ディレクトリにあることを意味することを認識できます。これは、さまざまな状況に適した2つの最大の違いです。
ファイルの属性情報を取得します
ファイルのこの部分の操作は実際には非常に単純であり、ファイル許可、読みやすいかどうか、書くかどうか、隠されたファイルなどに関するいくつかの質問にすぎません。これらの方法を詳細に見てみましょう。
長さのメソッドは、純粋なファイルのファイルのバイトの総数を正しく返すことができますが、ディレクトリの場合、返品値は「不特定の」値になります。
ファイル操作
ファイルの操作は、「追加、削除、変更、検索」にすぎません。一緒に見てみましょう。
もちろん、上記の2つの簡単な新しい作成と削除操作を扱う場合、ファイルクラスはいわゆる「クエリ」操作も提供します。例えば:
public string [] list(){securitymanager security = system.getSecurityManager(); if(security!= null){security.checkread(path); } if(isinvalid()){return null; } return fs.list(this);}このメソッドは、現在のインスタンスで表されるディレクトリ内の「純粋なファイル」と「ディレクトリ」のすべての単純な名前を取得します。例えば:
file file = new file( "c:// users // yanga // desktop"); string [] list = file.list(); for(string str:list){system.out.println(str);}プログラムの出力結果は、コンピューターデスクトップディレクトリ内のすべてのファイルの単純な名前を印刷するため、表示しません。
注意すべきことの1つは、ファイルインスタンスがディレクトリではなくプレーンファイルに対応する場合、リストがNULLを返すことです。
次に、ディレクトリファイルを取得する方法を見てみましょう。
public string [] list(filenamefilterフィルター){string names [] = list(); if((names == null)||(filter == null)){return names; } list <string> v = new ArrayList <>(); for(int i = 0; i <names.length; i ++){if(filter.accept(this、names [i])){v.add(names [i]); }} return v.toarray(new String [v.size()]);}この方法は、実際には過負荷のバージョンのリストであり、フィルターを渡してディレクトリを検索するときに必要なファイルとディレクトリのみをフィルタリングできます。
しかし、FilenameFilterインターフェイスの定義はとても簡単です。
public interface filenamefilter {boolean accept(file dir、string name);}この受け入れ方法をオーバーライドするだけです。ループのリストがファイルまたはディレクトリを取得するたびに、このフィルタリング方法を最初に呼び出すようにします。フィルタリングを渡すと、現在のファイルの単純な名前が返されたコレクションに追加されます。
したがって、この受け入れメソッドの書き換えにより、どのファイルがフィルタリングに渡すことができ、どちらができないかが決まります。例を見てみましょう:
デスクトップのテストフォルダーのファイルは次のとおりです。
ファイルfile = new file( "c:// users // yanga // desktop // test"); string [] list = file.list(new filenamefilter(){@override public boolean accept(file dir、string name){// dirで表される現在のファイルオブジェクトは、現在トラバースされているファイル項目の単純な名前です。 for(string str:list){system.out.println(str); }ここでは、匿名のインナークラスを使用して、FilenameFilterのサブクラスインスタンスを作成し、その後のメソッドを実装します。特定の実装は非常にシンプルで、すべてのディレクトリをフィルタリングし、すべてのプレーンファイルの単純な名前を取り出します。
最終出力の結果は次のとおりです。
3.txt
4.txt
もちろん、次のような2つの「変異」リストメソッドもあります。
ターゲットディレクトリに「純粋なファイル」と「ディレクトリ」の単純な名前を返すのではなく、対応するファイルオブジェクトを返します。実際、それは何もありません。ターゲットディレクトリ +単純な名前は、これらのファイルインスタンスを構築できます。
したがって、基本的に、リストメソッドは、ターゲットディレクトリ内のすべてのファイルを通過しません。つまり、ターゲットディレクトリのサブディレクトリ内のファイルにアクセスされて移動しません。
したがって、第1レベルのサブディレクトリのディープファイルを含む、ターゲットディレクトリ内のすべてのファイルを通過する方法について考える必要があります。答えは記事の最後に記載されます。
次の2つの方法は、フォルダーの作成に関連しています。
どちらも、フォルダーを作成するための現在のファイルインスタンスに基づいています。それらの違いについては、まずコードを見てみましょう。
file file = new file( "c:// users // yanga // desktop // test2"); system.out.println(file.mkdir()); file file2 = new file( "c:// users // yanga // desktop // test3 // hello"); system.out.out.println(file2.mkdir());
その中で、Test2とtest3はプログラムが実行されるまで存在しません。
出力の結果は次のとおりです。
真実
間違い
後者が作成できなかったのはなぜですか?
これは、MKDIRメソッドが一度に1つのフォルダーのみを作成できるという事実によるものであり、指定されたディレクトリの親またはより高いディレクトリが未作成のディレクトリが存在する場合、作成の故障を引き起こします。
MKDIRSメソッドは、この状況を解決するために使用されます。ターゲットパスにすべての未作成のディレクトリが作成されます。コードを参照してください。
file file3 = new file( "c:// users // yanga // desktop // test3 // hello // 231"); system.out.println(file3.mkdirs());
Test3フォルダーが存在しなくても、プログラムが実行された後、3つのフォルダーtest3、hello、および231が作成されます。
さらに、ファイルには一時ファイルを作成する方法もあります。いわゆる一時的なファイルは次のとおりです。ランタイム中に存在し、仮想マシンがシャットダウンされると破壊されます。あなたはそれを自分で勉強することができます。使用は比較的簡単なので、ここでは詳細に説明しません。
この時点で、ファイルタイプファイルについて大まかに学習しました。同じタイプを使用して純粋なファイルとディレクトリを表現するデザインは、少し混乱して不合理に思えると、誰もが多かれ少なかれ感じると思います。 JDK1.7 Sunがファイルとパスを別々のファイルとディレクトリに起動したことを知っています。将来の記事で詳細を学びます。
記事のすべてのコード、画像、ファイルは、私のgithubのクラウドに保存されます。
(https://github.com/singleyam/overview_java)
ローカルでダウンロードすることもできます。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。