パスインターフェイス
1。パスは、ディレクトリ名のシーケンスを表し、その後にファイル名が続きます。パス内の最初のコンポーネントがルートコンポーネントである場合、それは /またはC: /などの絶対パスであり、アクセスできるルートコンポーネントはファイルシステムによって異なります。
2。ルートコンポーネントから始まるパスは絶対パスです。そうでなければ、相対的なパスです。
3.静的パス。Getメソッドは1つ以上の文字列を受け入れ、文字列はデフォルトファイルシステムのパスセパレーター(UNIX IS /、Windows IS /)によって自動的に接続され、クロスプラットフォームの問題を解決します。次に、接続された結果を解析します。それが法的パスでない場合は、InvalidPathExceptionの例外を投げます。そうしないと、パスオブジェクトが返されます。
//それがunixファイルシステムパスabsolute = paths.get( "/home"、 "cat")であるとします。 // Absolute Path Path relative = pahts.get( "ixenos"、 "config"、 "user.properties"); //相対パス
4.文字列パスからパスオブジェクトを取得します
GETは、パス全体(つまり、複数のコンポーネントで構成される単一の文字列)を取得できます。たとえば、構成ファイルからパスを読み取ります。
string basedir = properties.getProperty( "base.dir"); //取得できます/opt/ixenosまたはc:/program files/ixenos path basepath = paths.get(beadir);
5。パスの組み合わせまたは解析
1)P.RESOLVE(Q)の呼び出しは、次のルールに従ってパスを返します。Qが絶対パスの場合、Qを返す、それ以外
PATH workReLevative = paths.get( "work"); path workpath = basepath.resolve(workReLative); // Resolveは、文字列パラメーターPATH WORKPATH = basepath.Resolve( "work")を受け入れることもできます。
2)p.Resolvesibling( "q")を呼び出すと、指定されたパスPの親パスoが解決され、兄弟パスo/qが生成されます
Path temppath = workpath.resolvesibling( "temp"); / * workpath is/opt/ixenos/workの場合、/opt/ixenos/tempが作成されます */
3)p.Relativize(r)を呼び出すと、冗長パスが生成されますq。 qを解析すると、相対パスrが生成されます。最終的に、rにはpとの交差パスが含まれていません。
/* patha is/home/misty pathb is/home/ixenos/config nowaは相対化されたパスを持っています。これは冗長パスを生成します*/path pathc = patha.relativize(pathb); //この時点で、pathcは../ixenos/config/*正規化メソッドは冗長部分を削除します*/path pathd = pathc.normalize(); // pathd is/ixenos/config
4)toabsolutepathは、ルートコンポーネントから始まる指定されたパスの絶対パスを生成します
5)パスクラスには、getParent、getFileName、getRoot //ルートディレクトリを取得するなど、パスを切断および結合するためのいくつかの有用な方法もあります。
6)PATHにはレガシーファイルのクラスを扱うための積極的な方法があり、ファイルクラスにはTopathメソッドもあります
ファイルツールクラス
1。ファイルの読み取りと書き込み
メソッド署名:
静的パス書き込み(パスパス、バイト[]バイト、オープンオプション...オプション)
静的パス書き込み(パスパス、イテラブル<?charsequence>ライン、openoption ... options)
以下は、以下で使用される方法のみです。その他の方法については、APIドキュメントを参照してください...
その中でも、OpenOptionはNIOインターフェイスであり、StandardOpenoptionは列挙の実装クラスです。各列挙インスタンス関数のAPIドキュメントを確認してください。
/*ファイルによって提供されるシンプルな方法は、中程度の長さのテキストファイルを処理するのに適しています。処理されるファイルが大きい場合またはバイナリの場合、クラシックIOストリーム*///ファイルのすべての内容をバイト配列バイト[] bytes = files.readallbytes(path); //パスオブジェクトに渡す//後に文字列に従って文字列を構築できますか文字列content = new String(bytes、charset); // list <string> lines = files.readalllines(path、charset); // with ride files.write files.get(path); // byte [] //コンテンツを追加すると、パラメーターfiles.write(path、content.getBytes(charset)、stardentopenoption.append)に基づいて追加の追加関数を決定します。 //列挙オブジェクトを一時停止し、付録スイッチをオンにします
2。コピー、カット、削除
メソッド署名:
静的パスコピー(パスソース、パスターゲット、コピーオプション...オプション)
静的パス移動(パスソース、パスターゲット、コピーオプション...オプション)
static void delete(パスパス)//パスが存在しない場合、例外がスローされます。この時点で次のものを呼び出す方が良いです
static boolean deletefifexists(パスパス)
以下は、以下で使用される方法のみです。その他の方法については、APIドキュメントを参照してください...
その中で、コピーオプションはNIOインターフェイスであり、StandardCopyoptionはその列挙実装クラスです。各列挙インスタンス関数のAPIドキュメントを確認してください。
Atomic_moveが埋め込まれているAtomic_moveがあり、アトミック動作を確保することができます。動きが正常に完了するか、ソースファイルが元の位置に保持されます。
// files.copy(frompath、topath); // cut files.move(frompath、topath);/* topathが既に存在する場合、操作は失敗します。上書きしたい場合は、Parameter Leplage_Existingを渡す必要があります。また、ファイル属性をコピーし、copy_attributes*/files.copy(frompath、topath、stardandcopyoption.replace_existing、stardandCopyOption.copy_attributes)に渡します。
3.ファイルとディレクトリを作成します
//最後のコンポーネントを除き、新しいディレクトリを作成すると、その他は既存のfiles.createdirectory(path)である必要があります。 //パスで中間ディレクトリを作成します。これにより、存在しない中間コンポーネントファイルを作成できます。CreateDirectories(PATH);/*空のファイルを作成して、ファイルの存在を確認します。既に存在する場合は、ファイルの存在を確認するために例外がスローされます。したがって、ファイルの作成操作はプロセス*/files.createfile(path); // pre-/suffixを追加して一時ファイルまたは一時ディレクトリパスnewpath = files.createTempfile(dir、prefix、suffix); path newpath = files.createTempdirectory(dir、prefix);
4.ファイル情報を取得します
省略して、詳細についてはAPIドキュメントをご覧ください、またはCoreJava Page51
5。ディレクトリ内のファイルを反復します
古いファイルクラスには、ディレクトリ内のすべてのファイルで構成される文字列アレイを取得する2つのメソッド、string [] list()and string [] list(filefilterフィルター)がありますが、ディレクトリに多数のファイルが含まれている場合、これら2つの方法のパフォーマンスは非常に低くなります。
原因分析:
1。 //ファイルシステム許可はif(security!= null){security.checkread(path); } if(isinvalid()){return null; } return fs.list(this); //ファイルシステムのリストへの基礎となるコール} if(isinvalid()){return null; } return fs.list(this); //ファイルシステムのリストへの基礎となるコールWindowsプラットフォーム用のファイルシステムオブジェクト。 */ public static Filesystem getFilesystem(){return new winntfilesystem(); }} // winntfilesystemクラスは、ファイルシステム抽象クラスから継承します。ここでは、主にそのリスト(ファイルファイル)メソッド@OverRidePublicネイティブ文字列[]リスト(ファイルF);/*これはネイティブメソッドであり、リストの動作がオペレーティングシステムのファイルシステムによって制御されていることを示しています。ディレクトリに多数のファイルが含まれている場合、このメソッドのパフォーマンスは非常に低くなります。したがって、それを置き換えるために、NIOのファイルクラスはNewDirectoryStream(PATH DIR)とその過負荷のメソッドを設計し、反復可能なオブジェクトを生成します(Eachのために繰り返すことができます) */// 〜2。 //すべてのリストすべて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])){// callback filenamefileter object v.add(names [i]); }} return v.toarray(new String [v.size()]); }現時点では、ハイテクが来る - ファイルは反復可能なディレクトリストリームを取得します、
ディレクトリパスを渡し、子孫ディレクトリを通過し、ディレクトリパスストリームを返します。ここに関係するすべてのパスは、ファイルではなくディレクトリであることに注意してください!
したがって、ファイルクラスはNewDirectoryStream(PATH dir)とその過負荷のメソッドを設計します。
ディレクトリを繰り返して、子孫ファイルの反復コレクションを取得する
staticDirectoryStream<Path> | newDirectoryStream(Path dir)はディレクトリを開き、 DirectoryStreamを返してディレクトリ内のすべてのエントリを反復します。 |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter)ディレクトリを開き、 DirectoryStreamを返してディレクトリのエントリを反復します。 |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
ディレクトリストリームを返すことは、反復可能なすべてのパスを保存するコレクションと見なすことができます。
したがって、反復因子またはforeachは反復しますが、反復器を使用する場合は、別のイテレーターを呼び起こさないように注意してください。
DirectoryStreamは反復可能ですが、単一のイテレーターのみをサポートするため、汎用反復ではありません。 Iteratorメソッドを呼び出して、2番目または後続のIteratorを取得すると、IllegalStateExceptionをスローします。
例:
try(directorystream <ath> entries = files.newdirectorystream(dir)){for(path entrives:entries){...}}グローブパラメーターを渡すことができます。つまり、グローブモードを使用してファイルをフィルタリングします(filefilterフィルター):
newDirectoryStream(Path dir、string glob)それは文字列タイプであることに注意してください
try(directorystream <ath> entries = files.newdirectorystream(dir、 "*.java"))// {...}グローブモード
いわゆるGLOBパターンは、シェルが使用する単純化された正規表現を指します。
1。アスタリスク*パスコンポーネントの0以上の文字に一致します。たとえば、 *.javaは現在のディレクトリ内のすべてのJavaファイルと一致します
2。2つのアスタリスク**ディレクトリの境界を越えて0以上の文字を一致させます。たとえば、**。Javaは、すべてのサブディレクトリのJavaファイルと一致します
3。疑問符(?)は、1つの文字のみに一致します。たとえば、????。Javaは、拡張機能を除く4つの文字すべてのJavaファイルと一致します。使用 ? *はワイルドカードの文字であり、数字を指定していないため
4。[...]文字セットと一致するには、接続[0-9]と逆文字[!0-9]を使用できます。たとえば、testx.javaに一致するテスト[0-9a-f] .javaは、xが16進数であると仮定して、[0-9a-f]は単一の文字を16進数として一致させるためです。
正方形の括弧でDashを使用して2つの文字を分離する場合、これら2つの文字の範囲内のすべての文字が一致できることを意味します(たとえば、[0-9]は0〜9のすべての数字を一致させることを意味します)。
5。{...}コンマで区切られた複数のオプションオプションのいずれかを一致させます。たとえば、 *。{Java、class}すべてのJavaファイルとクラスファイルと一致します
6./上記のパターンのいずれかで文字を逃がします。たとえば、 */**ファイルをすべてのサブディレクトリのファイル名で一致させます *、ここには**エスケープがあり、先行する0文字以上が一致します
以下は、ネチズンによって要約されたグローブモデルです。
| グローブモード | 説明する |
|---|---|
| *。TXT | すべてのファイルを拡張機能と一致させます。txt |
| *。{html、htm} | すべてのファイルを.htmlまたは.htmの拡張機能と一致させます。 {}はグループモードに使用され、コンマで分離されています |
| ?。TXT | ファイル名と拡張機能として単一の文字を一致させます。txt |
| 。 | すべてのファイルを拡張機能と一致させます |
| c:/users/* | Cドライブのユーザーディレクトリ内のすべてのファイルを一致させます。 Backslash "/"は、次のキャラクターを逃れるために使用されます |
| /家/** | UNIXプラットフォーム上のサブディレクトリの下で、すべて /ホームディレクトリとファイルを一致させます。 **現在のディレクトリとそのすべてのサブディレクトリに一致するために使用されます |
| [xyz] .txt | すべての単一文字をファイル名として一致させ、単一の文字には「x」または「y」または「z」の1つのみが含まれ、.txtの拡張機能があります。正方形の括弧[]は、コレクションを指定するために使用されます |
| [ac] .txt | すべての単一文字をファイル名として一致させ、単一の文字には3種類の「a」または「b」または「c」のうちの1つだけが含まれ、.txtの拡張機能があります。マイナスサイン「 - 」は範囲を指定するために使用され、四角い括弧でのみ使用できます[] |
| [!a] .txt | すべての単一文字をファイル名として一致させると、単一の文字は文字「A」を含めることができず、拡張機能は.txtです。感嘆符「!」否定に使用されます |
特定のディレクトリ内の子孫ファイルのすべてのコレクションを反復するのは良いことではありませんか?さあ、ディレクトリのすべての子孫(ディレクトリやファイルを含む)を直接通過しましょう。
ファイルクラスのWalkFileTreeメソッドを呼び出して、FileVisitorインターフェイスタイプのオブジェクトを渡すことができます(APIで発見するのを待っている方法が増えます...)
/*filevisitor subclassの匿名オブジェクトを渡す*/files.walkfiletree(dir、new simplefilevisitor <path>(){// walkfiletreeコールバックWalkFiletree(すべての子孫のメンバーを横断する)の目的とは関係ありません。要約しましょう、
files.newdirectoryStream(PATH dir)トラバーサル後に子孫ファイルの反復コレクションを返します。
files.walkfileetree(Path dir、filevisitor fv)は、子孫のディレクトリとファイルを横断するプロセスです。
zipファイルシステム
上で知っているように、Pathsクラスは、デフォルトのファイルシステム、つまりユーザーのローカルディスク上のファイルのパスを探します。
実際、zipファイルシステムなど、他のファイルシステムも持つことができます。
/*zipnameがzipファイルの名前であると仮定します*/filesystem fs = filesystems.newfilesystem(paths.get(zipname)、null);
上記のコードは、ZIPドキュメント内のすべてのファイルを含むZIPNAMEベースのファイルシステムを作成します。
1)ファイル名(文字列タイプ)がわかっている場合は、このZIPドキュメントからファイルを簡単にコピーできます。
files.copy(fs.getpath(filename)、targetpath);
Q:Fs.GetPathはZIPファイルシステムを使用してGetPathであるため、デフォルトのファイルシステムを呼び出すことができますか?
A:はい。ファイルシステムクラスには静的getDefault()メソッドがあります。これは、ファイル名GetPathでも取得できるデフォルトのファイルシステムオブジェクトを返します。
特定の目的のために、getPath(文字列名)が通過するかランダムアクセスがあるかどうかにかかわらず、時間があるときにソースコードの実装を確認してください。
2)ZIPドキュメント内のすべてのファイルをリストするには、WalkFileTreeを使用してファイルツリーを通過することもできます
ファイルシステムfs = filesystems.newfilesystem(paths.get(filename)、null); // walkfiletreeは、filevisitorオブジェクトファイルを渡す必要があります。 Exception {system.out.println(file);Java Nio Path InterfaceとFiles Classが一緒に動作する上記の例は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。