簡単な紹介
最近、仕事でPropertiesクラスを使ってIO用の設定ファイルを読み書きする場面に遭遇したので、そのことに興味を持ち、ネットで勉強した結果、ここにまとめてみます。まずはソースコードを見てみましょう
public class Properties extends Hashtable<Object,Object> {
/**
* use serialVersionUID from JDK 1.1.X for interoperability
*/
@java.io.Serial
private static final long serialVersionUID = 4112578634029874840L;
private static final Unsafe UNSAFE = Unsafe.getUnsafe();
このクラスは HashTable<k,v> を継承し、もちろん Map<k,v> インターフェイスを実装していることがわかります。そのため、Map として使用でき、また 2 列セットでもあります。ここで、 k とv は文字列タイプです。Properties のコレクション プロパティを示す例を見てみましょう。
@Test
void contextLoads() {
Properties prop = new Properties();
prop.put("name","Superman");
prop.put("age",18);
System.out.println(prop.toString());
prop.clear();
System.out.println(prop.toString());
}
出力を見てみましょう
コレクションがキーと値の形式で保存されていることがわかります。最も一般的に使用される Properties シーンは間違いなく .properties 構成ファイルです。このクラスが構成ファイルを読み取れるかどうかを見てみましょう。
@Test
void contextLoads() {
File file = new File("src/main/resources/demo.properties");
File file1 = new File("src/main/resources/demo1.yml");
Properties properties = new Properties();
try(FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"))
{
properties.load(inputStreamReader);//读取输入字符流
System.out.println(properties);
System.out.println(properties.getProperty("name"));
}catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2 つの構成ファイルは次のとおりです。
2 つの構成ファイルを個別に読み取った結果を見てみましょう。
load メソッドのパラメーターは、入力文字ストリーム Reader リーダーに渡すことができ、また入力バイト ストリーム InputStream inputStream にも渡すことができることがわかります。はすべて読み取れます。このクラスの別のメソッドである replace メソッドを見てみましょう。
File file = new File("src/main/resources/demo.properties");
File file1 = new File("src/main/resources/demo1.yml");
Properties properties = new Properties();
try(FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8"))
{
properties.load(inputStreamReader);
System.out.println(properties);
System.out.println(properties.getProperty("name"));
properties.replace("name","SpiderMan","yang");
System.out.println(properties);
} catch (FileNotFoundException | UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
結果を見てみましょう:
Properties コレクション内のプロパティが変更されていることがわかりますが、構成ファイルを変更する場合は、ハード ディスクの読み取りだけでなく、書き込みも行うことになります。次のコードを追加します。
try {
final FileOutputStream fileOutputStream = new FileOutputStream(file);
properties.store(fileOutputStream,"change");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
結果を見てください
出力は変更されていません。リソース内のソース ファイルを確認してください。
修正されていることがわかり、修正時のコメントも付いています。Properties クラスには実際には他にも多くのアプリケーションがあり、基本的にはすべて構成ファイルに関するものです。たとえば、System の getProperties メソッドを使用して、現在の JVM のすべてのパラメータ情報を取得し、それをコンソールに出力できます。関連するコード例は次のとおりです。
@SpringBootTest
public class JVMPropertiesTest {
@Test
void testDemo(){
Properties properties = System.getProperties();
properties.list(System.out);
}
}
関連する表示情報:
まだまだ切り抜けていないパラメータがたくさんあります。ストリームを使用してドキュメントに出力し、見やすくすることができます。
以上がこの授業について私がこれまでに学んだことですので、皆さんにもシェアさせていただきます。