JAVAエッセイ編三(Propertiesプロファイルの読み書き及び経路問題の詳細)
4358 ワード
まず、プロファイルの読み書き方法を記録します.簡単な2つの方法です.主にパスの問題です.後で詳しく説明します.
1、Propertiesプロファイルを読む
2、Propertiesプロファイルを書く
2つの方法は間違いありませんが、書き込むたびにプロファイルを修正することができず、考えてみると、パスの問題がめちゃくちゃになっていることに気づきました.次は少しずつ問題点を見つけます.
ある説はこうです.
Class.getResourceAsStream()は、ロードするリソースパスが現在のクラスが存在するパッケージのパスと一致することを指定します.
例えばあなたはMyTestクラスをパッケージcomに書いた.test.mycodeではclass.getResourceAsStream(「name」)はcom.test.mycodeパッケージの下で対応するリソースを検索します.このnameが'/'で始まるとclasspathのルートパスの下から検索が開始されます.
ClassLoader.getResourceAsStream()は、検索するリソースの前に'/'があるかどうかにかかわらずclasspathのルートパスの下から検索されます.
まずプロファイル名を/context-configと書く.properties.
ここではまずFileUtilを通ります.class.getClassLoader().getResource("/").getPath()ClassLoaderの読み取りリソースパスを取得
ここでのパスは/F:/Work_ですStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/TimerTask/WEB-INF/classes/
以下にはやはりプロファイルがあり、プロファイル値を変更するとともに、プログラム中のresourcesディレクトリ(F:Work_StudioTimerTasksrcmainresources)の下のプロファイルも変更し、異なる値に変更して、プロファイルを読み込む過程がどれなのかを見てみましょう.
私はここでMaven webプロジェクトのために起動しました.実行後、resourcesディレクトリの下のプロファイルが変更されていない場合は、直接/F:/Work_を読みます.Study/.metadata/.plugins/org.eclipse.wst.server.core/tmp 0/wtpwebapps/timerTask/WEB-INF/classes/下の内容、resourcesディレクトリ下プロファイルが変更されると、すべてのプロファイルがresourcesディレクトリ下のプロファイル値に変更されます.この問題は大きくありません.webプロジェクトが再配置されたからです.
プロファイル名をcontext-configと書く.properties.その結果、ClassLoaderのリソースパスは、場所が変わらずresourcesディレクトリの内容を読み取ることができるようになりました.
これはファイルを読むことです.次はファイルを書くことです.
ファイルを書くのはとても奇抜で、ここで読むファイルはresourcesディレクトリの下でプロファイルを書いてファイルを書くのはFディスクのルートディレクトリに書いたのです!考えてみると、コピー中にコードが出力パスに気づかず、出力パスをClassLoaderパスに変更したという問題が発見されました.
やはりF:/Work_を修正しましたStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp 0/wtpwebapps/timerTask/WEB-INF/classesの下の内容.しかし、resourcesディレクトリの下の内容をどのように修正しますか?
直接「src/main/resources」+filenameで、だめです.
システムでgetProperty(「user.dir」)が手に入れたのは工事の場所ではなく、eclipseのインストールディレクトリで、だめです.
FileUtilでclass.getClassLoader().getResource(".").getPath()はtomcatでlibの位置を取って酔っ払った.
(1)eclipseのJavaアプリケーションについて、System.getProperty(「user.dir」)の値は、E:MyWorkspacexiaoyingWebTest[プロジェクトパス]
(2)eclipseにおける動的ウェブエンジニアリングについてSystem.getProperty(「user.dir」)の値は、D:eclipse【eclipseインストールパス】です.
どうすればいいの?
Javaアプリケーションは直接変更できますが、Webプロジェクトには適用されず、resourcesディレクトリの下のプロファイルを変更する方法が見つかりません.絶対パスを指定しない限り、これはまったく意味がありません.修正しないでください.
もし大神がどのように修正するか知っていたら、弟を指導してください.感謝しています.の
1、Propertiesプロファイルを読む
public static void loadConfig(Properties Config, String filename) {
InputStream in = null;
in = FileUtil.class.getClassLoader().getResourceAsStream(filename);
try {
Config.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2、Propertiesプロファイルを書く
public static void writePropertiesFile(String filename,
Map map) {
Properties properties = new Properties();
try {
InputStream fis = FileUtil.class.getClassLoader().getResourceAsStream(filename);
// ( )
properties.load(fis);
OutputStream outputStream = new FileOutputStream(filename);
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
properties.setProperty(key, value);
}
properties.store(outputStream, "author: CFF");
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeProperties(String filename, String key, String value) {
Properties properties = new Properties();
try {
// Logger.info(FileUtil.class.getClass().getResource("/").getPath());
InputStream fis = FileUtil.class.getClassLoader().getResourceAsStream(filename);
if(null==fis)Logger.info(" ");
// ( )
properties.load(fis);
Logger.info(properties.getProperty("endRunning"));
Logger.info(properties.getProperty("pageNo"));
OutputStream outputStream = new FileOutputStream(filename);
properties.setProperty(key, value);
properties.store(outputStream, "author: CFF");
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2つの方法は間違いありませんが、書き込むたびにプロファイルを修正することができず、考えてみると、パスの問題がめちゃくちゃになっていることに気づきました.次は少しずつ問題点を見つけます.
ある説はこうです.
Class.getResourceAsStream()は、ロードするリソースパスが現在のクラスが存在するパッケージのパスと一致することを指定します.
例えばあなたはMyTestクラスをパッケージcomに書いた.test.mycodeではclass.getResourceAsStream(「name」)はcom.test.mycodeパッケージの下で対応するリソースを検索します.このnameが'/'で始まるとclasspathのルートパスの下から検索が開始されます.
ClassLoader.getResourceAsStream()は、検索するリソースの前に'/'があるかどうかにかかわらずclasspathのルートパスの下から検索されます.
まずプロファイル名を/context-configと書く.properties.
ここではまずFileUtilを通ります.class.getClassLoader().getResource("/").getPath()ClassLoaderの読み取りリソースパスを取得
ここでのパスは/F:/Work_ですStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/TimerTask/WEB-INF/classes/
以下にはやはりプロファイルがあり、プロファイル値を変更するとともに、プログラム中のresourcesディレクトリ(F:Work_StudioTimerTasksrcmainresources)の下のプロファイルも変更し、異なる値に変更して、プロファイルを読み込む過程がどれなのかを見てみましょう.
私はここでMaven webプロジェクトのために起動しました.実行後、resourcesディレクトリの下のプロファイルが変更されていない場合は、直接/F:/Work_を読みます.Study/.metadata/.plugins/org.eclipse.wst.server.core/tmp 0/wtpwebapps/timerTask/WEB-INF/classes/下の内容、resourcesディレクトリ下プロファイルが変更されると、すべてのプロファイルがresourcesディレクトリ下のプロファイル値に変更されます.この問題は大きくありません.webプロジェクトが再配置されたからです.
プロファイル名をcontext-configと書く.properties.その結果、ClassLoaderのリソースパスは、場所が変わらずresourcesディレクトリの内容を読み取ることができるようになりました.
これはファイルを読むことです.次はファイルを書くことです.
ファイルを書くのはとても奇抜で、ここで読むファイルはresourcesディレクトリの下でプロファイルを書いてファイルを書くのはFディスクのルートディレクトリに書いたのです!考えてみると、コピー中にコードが出力パスに気づかず、出力パスをClassLoaderパスに変更したという問題が発見されました.
OutputStream outputStream = new FileOutputStream(FileUtil.class.getClassLoader().getResource("/").getPath()+filename);
やはりF:/Work_を修正しましたStudy/.metadata/.plugins/org.eclipse.wst.server.core/tmp 0/wtpwebapps/timerTask/WEB-INF/classesの下の内容.しかし、resourcesディレクトリの下の内容をどのように修正しますか?
直接「src/main/resources」+filenameで、だめです.
システムでgetProperty(「user.dir」)が手に入れたのは工事の場所ではなく、eclipseのインストールディレクトリで、だめです.
FileUtilでclass.getClassLoader().getResource(".").getPath()はtomcatでlibの位置を取って酔っ払った.
(1)eclipseのJavaアプリケーションについて、System.getProperty(「user.dir」)の値は、E:MyWorkspacexiaoyingWebTest[プロジェクトパス]
(2)eclipseにおける動的ウェブエンジニアリングについてSystem.getProperty(「user.dir」)の値は、D:eclipse【eclipseインストールパス】です.
どうすればいいの?
Javaアプリケーションは直接変更できますが、Webプロジェクトには適用されず、resourcesディレクトリの下のプロファイルを変更する方法が見つかりません.絶対パスを指定しない限り、これはまったく意味がありません.修正しないでください.
もし大神がどのように修正するか知っていたら、弟を指導してください.感謝しています.の