[Java] อยากรู้ Directory ของโปรแกรมที่เราทำงานอยู่

เมื่อทำงานที่เกี่ยวกับไฟล์ ไม่ว่าจะเป็นไฟล์รูป เท็กซ์ไฟล์ หรือไฟล์แบบอื่นๆ สิ่งที่สำคัญที่จะขาดไม่ได้เลยนั้น คือ Path ที่อยู่ของไฟล์ สำหรับนักพัฒนาโปรแกรมมือใหม่อาจจะยังไม่ใส่ใจเรื่องนี้ หรือคิดเพียงว่าเครื่องเราแสดงผล OK เป็นใช้ได้ แต่ปัญหาจะมาเกิดตอนไปรันที่เครื่องอื่นๆ เช่น

กรณีตัวอย่าง

  • โปรแกรมตัวอย่างนี้เป็นเกม Hang man ที่พัฒนาด้วยภาษา Java ซึ่งมีการกำหนด Path ของภาษา Background ตาม Code ต่อไปนี้
bgMainMenu = new JLabel();
bgMainMenu.setHorizontalAlignment(SwingConstants.CENTER);
bgMainMenu.setHorizontalTextPosition(SwingConstants.CENTER);
//Path
bgMainMenu.setIcon(new ImageIcon("E:/java/projectPic/BGmain.jpg""));
//Path
bgMainMenu.setBounds(new Rectangle(0, 0, 793, 571));
bgMainMenu.setText("");
  • เมื่อนำรันที่เครื่องของน้อง กุ๊ก ปรากฏว่าสามารถแสดงผลได้สวยงาม ดังรูป
  • น้อง กุ๊ก ส่งให้นายแว่นตรวจสอบปรากฏว่าภาษาพื้นหลังไม่ขึ้น ซวยและทีนี้ (นายแว่นวางไฟล์ไว้ในไดร์ฟ D)

ปัญหา 

  • เพราะโปรแกรมมีการกำหนดแบบ absolute path (กำหนดที่อยู่ไฟล์แบบละเอียด บอกว่าอยู่ไดร์ฟไหน อะไรอย่างไร)

แนวทางแก้ไข

  • เราปรับเปลี่ยน path ของรูปภาพ จากเดิมที่เป็น absolute path มาเป็นแบบ relative path (กำหนดทีอยู่ไฟล์แบบคร่าว คือ ส่วนแรกให้คอมมันหาให้ + ส่วนที่สอง คือ แสดง Path ไปหาไฟล์)
    • absolute path "E:/java/projectPic/BGmain.jpg"
    • relative path dirPath+"/projectPic/BGmain.jpg" ซึ่งเราจะต้องมาหาว่า dirPath ต้องเอาอะไรมาใส่ดี
  • มารู้จักกับ System.getProperty("user.dir"); คือ อะไร
    • getProperty(): เป็นคำสั่งที่ช่วยค่า property ต่างๆของระบบปฏิบัติการออกมา
    • "user.dir": เป็น Parameterที่ช่วยบอกให้โปรแกรมมันไปดึง Path ที่อยู่ของโปรแกรม หรือไฟล์ Java ที่รันอยู่ ว่าอยู่ในโฟลเดอร์ไหน ไดร์ฟอะไร
  • ทดสอบแก้ไขโดยการใช้ System.getProperty("user.dir"); เพื่อเอาข้อมูล path ทีหายไปมาใส่ใน dirPath ตาม code ต่อไปนี้
bgMainMenu = new JLabel();
bgMainMenu.setHorizontalAlignment(SwingConstants.CENTER);
bgMainMenu.setHorizontalTextPosition(SwingConstants.CENTER);
//Path
final String dirPath = System.getProperty("user.dir");
bgMainMenu.setIcon(new ImageIcon(dirPath+"/projectPic/BGmain.jpg""));
//Path
bgMainMenu.setBounds(new Rectangle(0, 0, 793, 571));
bgMainMenu.setText("");

ผลการทดสอบ

  • โปรแกรมนี้สามารถแสดงผลได้อย่างสวยงาม และสามารถรันได้ทุกเครื่องแม้วามีสภาพแวดล้อมที่ต่างกัน

สรุป

  • จากตัวอย่างนี้จะแสดงการใช้คำสั่ง System.getProperty("user.dir"); เพื่อมาหา Path จริงของไฟล์โปรแกรมเรา เพื่อนำ Path ที่ได้ ไปอ้างอิงต่ออีกที่เพื่อให้ได้ไฟล์รูป Background แต่ยังมีอีกหลายวิธีที่สามารถทำได้ ถ้าเราเริ่มวางโครงโปรเจคใหม่ๆเลย อาจจะแยกโพลเดอร์ที่เกิดกับรูปภาพ ในโปรแกรม หรือไฟล์ที่จำเป็น ออกมาเป็น ClassPath Resource ก็ได้นะ

ปล. ต้องขอขอบตุณน้อง Kook kik จาก มศว ที่ช่วยนำปัญหามาปรึกษา และพี่ได้เชียนลง Blog


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.