Javaプロジェクト(プロパティ)で使用される構成ファイルを分解する

魂の拷問:サービスを再起動せずに構成の変更を有効にする方法は?トリックはありますか?

魂の拷問:Javaプロジェクトでは、拡張子が.propertiesのファイルのトレースを常に表示できますが、これらの構成ファイルはどのようにロードされますか?

プロジェクト開発プロセス中に、接続するデータベースの接続アドレス、名前、ユーザー名、パスワードなど、頻繁に変更されるいくつかのパラメーターに遭遇する場合があります(たとえば、3者サービスにアクセスするためのURL)。プログラムの多様性を考慮すると、これらのパラメーターはプログラムに直接書き込むことができないことが多く、通常は構成ファイルを使用して適切に処理されます。

 Javaプロジェクトでは、プロパティファイルはより単純なカテゴリに属しますが、単純ですが、プロジェクトでの使用方法について説明する必要があります。ソースコードを理解して、Javaの深い経験をもたらすようにしてください。オーバーロードの意味。

 

1.その単純さにもかかわらず、フォーマットはまだ見られる必要があります。

前回説明したini構成ファイルと比較すると、プロパティファイルの形式にはセクションの概念はありませんが、はるかに単純です。

 

 

 

 上記の画像は、jdbc接続に必要な構成です。#で始まる各行はコメント情報であり、等号で区切られた各行構成は、一般的にキーと値のペアと呼ばれ、等号の左側がキーです(コード内)変数)、等号の右側の値は値(実際のシナリオに従って構成された値)です。

 

2.その単純さにもかかわらず、Javaソースコードは引き続きチェックする必要があります。

java.util.PropertiesクラスはJavaで提供され、主に構成ファイルの読み取りと書き込みに使用されます。

 

 

1つの画像は血の関係を把握しています。明らかに、PropertiesはHashtableを継承しています。最終的な分析では、それはマップであり、Propertiesの最も特別な場所は、そのキーと値がすべて文字列型であることです。

 

全体的な状況から概要を理解し、JDKのソースコードを調べ、そのアイデアに従い、段階的に進んでください。

 

まず、書き込まれた構成ファイルがどのようにロードされるかを見てみましょう。

 

 

ソースコードは非常に明確で、文字ストリームリーダーとバイトストリームInputStreamを提供して構成ファイルをロードし(メソッドオーバーロードの目的:ユーザーをより便利にするため)、さらに深く進んで、最終的なputハッシュテーブルのput(キー、値)を設定しますキーと値のペア、最後に構成ファイルをロードします。

 

 

次に、キーに基づいて対応する値を取得する方法を確認するには(それを入力しますが、それを取り出すことも検討してください)?

 

 

ソースコードは非常に明確です。対応する値はパラメーターキーを介して取得されます。ユーザーの利便性を考慮して、getPropertyメソッドはオーバーロードされます。キーに従って取得された値がnullの場合、2とマークされたメソッドが返されます。デフォルト値(多くのシナリオでは、それは本当に便利です)。

 

構成ファイルをロードする方法を知っており、キーに対応する値を取得する方法を知っています。常識的には、プロジェクトで十分ですが、プロジェクトの開始後、追加のパラメーター値を設定する必要がある場合もありますが、Javaこのことを考慮して、追加のパラメーターを設定できるようにするために、setPropertyメソッドが提供されています。

 

 

プロジェクト開発でこれらのAPIを上手に使用できれば十分です。ソースコードが開かれたので、さまざまなことがすべて説明されています。おそらく一部のAPIは、他のシナリオで発生する問題を解決することもできます。

 

 

Propertiesクラスは、設定をロードするための負荷を提供するだけでなく、キーと値のペアをファイルに書き込む機能も提供します。上記のソースコードに示すように、ユーザーの利便性を考慮して、storeメソッドはオーバーロードされ、バイトストリームOutputStreamと文字ストリームWriterの2つのストア方法を提供します。

 

 

上記のソースコードに示されているように、Propertiesは、従来の構成ファイルの読み取り機能と書き込み機能のサポートに加えて、xml構成ファイルの読み込みと書き込みのサポートも提供します。

 

 

上記のソースコードに示すように、Propertiesクラスはオーバーロードされたリストメソッドを提供します。デバッグを容易にするために、キーと値のペアのリストをきれいに印刷できます。

 

3.簡単ですが、すべてをナンセンスに練習することはできません。

シナリオ1: APMパフォーマンスの監視中に、Javaアプリケーションプロファイル情報を取得するために一般的に使用されるAPI。

import java.util.Properties; 

/ ** 
 * @author Yiguan 
Xiaojian 
 * / public class JVMDetails { 
    public static void main(String [] args){ 
        //システム情報を取得(JDK情報、Java仮想マシン情報、Java提供)ビジネス情報、現在のコンピューターのユーザー情報)
        プロパティproperties = System.getProperties(); 
        //システム情報
        を出力しますproperties.list(System.out); 
    } 
}

プログラムが実行され、いくつかの出力スクリーンショットは次のとおりです。

 

 

 

シナリオ2:ビジネス開発で、ハードコーディングを構成に置き換え、構成の更新を検討すると、プログラムは最新の値を読み取ることができます。

import java.io. *; 
import java.util.Hashtable; 
import java.util.Properties; 

/ ** 
 *設定ファイルツール
 * 1. .propertiesファイル、.iniファイルの読み込みを
 サポート* 2.設定ファイルの更新をサポート
 * @ author Ape 
    Story 
 * / 
public class PropertiesUtil { 

    // private static final Log4j LOG = .....; 
private static Hashtable <String、PropCache> propCache = new Hashtable <String、PropCache>(); 

    public static String getString( String propFile、String key){ 
        return getString(propFile、key、null); 
    } 

    public static String getString(String propFile、String key、String defaultValue){ 
        if((!PropFile.endsWith( "。Properties"))&&(! propFile.endsWith( ".ini")))){
            propFile = propFile + ".properties";  
        }
        PropCache prop = propCache.get(propFile); 
        if(prop == null){ 
            try { 
                prop = new PropCache(propFile); 
            } catch(IOException e){ 
                // LOG.warn(e); 
                System.out.println(String.format( "读取%s出现异常%s"、propFile、e)); 
                defaultValueを返します。
            } 
            propCache.put(propFile、prop); 
        } 
        文字列値= prop.getProperty(key、defaultValue); 
        if(value!= null){ 
            value = value.trim(); 
        } 
        戻り値。
    }

    public static void setString(String propFile、String key、String value)
            throws IOException { 
        if((!propFile.endsWith( "。properties"))&&(!propFile.endsWith( "。ini"))){ 
            propFile = propFile + "。プロパティ"; 
        } 
        ファイルfile = new File(propFile); 
        プロパティprop = new Properties(); 
        { 
            FileInputStream fis = new FileInputStream(file);を試してください
            prop.load(fis); 
            fis.close(); 
        } catch(FileNotFoundException e){ 
            // LOG.warn(e); 
            System.out.println(String.format( "文件%s存在しない"、propFile));
        }
        FileOutputStream fos = new FileOutputStream(file); 
        public PropCache(String propFileName)はIOExceptionをスローし
            ます{ File file = new File(propFileName); 
            FileInputStream fis = new FileInputStream(file);
        prop.put(key、value); 
        prop.store(fos、null); 
        fos.close(); 
        PropCache localPropCache = propCache.get(propFile); 
        if(localPropCache!= null){ 
            localPropCache.reload(); 
        } 
    } 

    private static class PropCache { 

        private String fileName; 
        プライベートlong lastLoad; 
        プライベートプロパティの小道具。

            this.prop = new Properties(); 
            this.prop.load(fis); 
            fis.close(); 
            this.fileName = file.getAbsolutePath(); 
            this.lastLoad = file.lastModified(); 
        } 

        public String getProperty(String key、String defaultValue){ 
            File file = new File(this.fileName); 
            if(this.lastLoad <file.lastModified()){ 
                reload(); 
            } 
            return this.prop.getProperty(key、defaultValue); 
        } 

        public void reload(){ 
            File file = new File(this.fileName); 
            {を試す
                プロパティprop = new Properties(); 
                FileInputStream fis = new FileInputStream(file); 
                prop.load(fis); 
                fis.close(); 
                this.prop.clear(); 
                this.prop.putAll(prop);
                this.lastLoad = file.lastModified(); 
            } catch(IOException e){ 
                // PropertiesUtil.LOG.warn(e); 
                System.out.println(String.format( "File%s reload exception%s"、 this.fileName、e)); 
            } 
            // PropertiesUtil.LOG.all(new Object [] {this.fileName、 "reloaded。"}); 
            System.out.println(String.format( "File%s is reloaded "、this.fileName)); 
        } 
    } 
}

最初に説明したjdbc構成ファイルを使用して確認します。データベースタイプを取得してみてください。デフォルトの構成はdb2です。パラメータの値をmysqlに半分変更してください。

/ ** 
 *测试类
 * @author一猿小讲
 * / 
public class M { 
    public static void main(String [] args){ 
        while(true){ 
            System.out.println(PropertiesUtil.getString( "db"、 " jdbc.type ")); 
            { 
                Thread.sleep(10000);を試してください
            }キャッチ(InterruptedException e){ 
            } 
        } 
    } 
}

プログラムが実行され、効果はまだ非常に満足です。

 

 

 

4.シンプルですが、優れた記事は慎重に共有してください。

構成ファイルについては多くのオンライン共有がありますが、私たちの共有は同じではありません。

私たちの当初の目的は、実際のプロジェクトとソースコードを組み合わせて、ここ数年で使用されている構成スキルについて話し、研究開発能力の向上を支援することです(たとえそれが成功したとしても、損失であっても)。

その石はヒスイを攻撃することができます、それはあなたを助けると思います。

研究開発能力を向上させるために(たとえそれが失われたとしても)、フォローアップは実際のプロジェクトを結合し続けて、使用されている他の形式の構成ファイルを確認しますので、しばらくお待ちください。

おすすめ

転載: www.cnblogs.com/socoool/p/12683501.html