קריאה וכיוון של property ב- java

chenke

New member
קריאה וכיוון של property ב- java

שלום לכולם, כתבתי ישום RMI שבו המחלקה שממשת את מתודות ה- RMI של השרת משתמשת בבסיס נתונים של Access. הבעייה שלי היא שאני צריך לדעת את הנתיב המדוייק בו נמצא קובץ ה- MDB של בסיס הנתונים ואינני מעוניין לתת נתיב מפורש. נסיון לקבל את הספרייה שבה נמצאת המחלקה ע"י getProperty("user.dir") לא נותן תשובה נכונה (נותן את הספרייה של המשתמש ב- Documents and seting). נסיון נוסף ע"י שימוש בקוד
public static String getCWD() { // Get the "." file present in all directories.. java.io.File f = new java.io.File("."); // Get the absolute path to the "." file.. String cwd = f.getAbsolutePath(); // Return the absolute path minus the ".".. return cwd.substring(0, cwd.length() - 1); }​
נותן את אותה תוצאה. קביעת System property משלי ע"י הרצת ישום כך:
java -Dtest=value app​
מאפשרת רק לקוד שנמצא ב- app לקרוא את התכונה ע"י System.getProperty ולקבל תשובה נכונה. ישומים אחרים שירוצו לאחר מכן (כולל המחלקה שממשת את השרת) יקבלו null כאשר ינסו לקרוא תכונה זאת. האם יש דרך לקבוע system property מוגדר ע"י המשתמש (לא כזה שמוגדר ע"י JAVA) שיהיה נגיש לכל המחלקות? האם יש למשהוא רעיון נוסף לאיך אוכל לקבל את הנתיב של קובץ ה- MDB? אני צריך להגיש פרוייקט עד סוף החודש וזה הדבר ביחיד שעוצר אותי, אז בבקשה עזרה, חן.
 

voguemaster

New member
אתה עובד על חלונות נכון ?

כי הקוד שמאחזר את CWD עובד תחת לינוקס, רק שתדע (בדקתי הרגע).
 

chenke

New member
עובד על חלונות והקוד הזה עובד גם

על חלונות, כאשר המחלקה שכוללת אותו, היא זאת שמורצת
 

voguemaster

New member
והבעיה היא ?

מחלקות אחרות שרצות ואין להן את הקוד ? האם הן מורצות מאותה ספריה ? איך זה עובד בדיוק ? לדעתי כל מה שאתה צריך זה Attributes. תקנפג אותו פעם אחת וכל המחלקות ייגשו לקובץ הקונפ'.
 

voguemaster

New member
אופס סליחה

תשתמש באובייקט Properties משלך, תקרא תוכן של קובץ קונפ' לתוכו. הקוד הבא:
// init and load properties String configurationFile = new String("app.conf"); props = new Properties(); try { BufferedInputStream in = new BufferedInputStream(new FileInputStream(configurationFile)); props.load(in); in.close(); } catch(IOException e) { System.out.println("Error while trying to load configuration file: "+configurationFile); e.printStackTrace(); System.exit(1); // or whatever.. } // validate input and yalla, let's continue :)
זה בערך כל מה שאתה צריך. הקוד קורא קובץ קונפ' לתוך Properties ואז אתה יכול להשתמש ב-props.getProperty באופן רגיל. אני לא מבין למה אתה מסתבך..
 

chenke

New member
יש לי סיבה טובה להסתבך

כיוון שהחלקה שפותחת את קובץ ה- MDB איננה כוללת מתודת MAIN, היא סה"כ מספקת את שירותי ה- RMI של השרת. שהיא טטען את קובץ הקונפיגורציה? בלתי אפשרי- היא לא תמצא כיוון שהיא דורשת נתיב מדוייק שאני לא יכול לספק לה כי אינני יכול להכריח את הלקוח איפה להתקין את היישום שאני כותב (זה בערך אותו הסיפור עם קובץ ה- MDB). המחלקה היחידה שכוללת מתודת MAIN ויכולה לטעון את הקובץ לא ממש קשורה למחלקה שפותחת את קובץ ה- MDB ולכן לא תכיר את המשתנה props. ד.א. מה צריך להיות המבנה של קובץ הקונפיגורציה? חן.
 

voguemaster

New member
אוקיי זה יותר מובן

ראשית, המבנה של קובץ הקונפ' הוא כמו property רגיל, כלומר: name=value כל ה-parsing מבוצע ע"י המחלקה ויש בתיעוד של ג'אווה את כל החוקים של מה מי ואיך. עכשיו תגיד, אם הקוד למציאת CWD עובד גם בחלונות, למה שלא תוסיף אותו למחלקה שנמצאת אצל הלקוח ? כך היא תוכל לפתוח את הקובץ שנמצא באותה ספריה שבה היא נמצאת.. ד"א, התיעוד של File אומר שאם נותנים נתיב יחסי הוא מנסה לגשת לקבצים בספריה הנוכחית (מה שאתה צריך). זה עובד בלינוקס ולא נראה לי שצריכה להיות לך בעיה עם זה.. File f = new File("blah.mdb");
 
למעלה