การหาตำแหน่งปัจจุบันของ Jar file

การหาตำแหน่งปัจจุบันของ Jar file

บางครั้งเราต้องการรู้ตำแหน่งของไฟล์ เพราะต้องการอ่านไฟล์ที่อยู่ใน folder เดียวกัน – เช่นไฟล์ config หรือ license – ซึ่งการจะใส่ไว้ในไฟล์ .jar เลย มันไม่สะดวก แก้ไขยาก อาจทำให้ไฟล์เสียหายได้ (ในบางครั้งเราก็ใส่ได้ ถ้าเราไม่ต้องการให้แก้ไขง่าย หรืออยากจะซ่อนเอาไว้ – ซึ่งก็มีวิธีเช่นกัน)

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Paths;

public class ReadFileFromJarLocation {

    public static void main(String[] args) {
        try {
            // 1. หาตำแหน่งของไฟล์ JAR
            File jarFile = new File(ReadFileFromJarLocation.class.getProtectionDomain().getCodeSource().getLocation().toURI());
            String jarDir = jarFile.getParent(); // ได้เป็น directory ที่เก็บ JAR

            // 2. ระบุตำแหน่งและชื่อไฟล์ที่ต้องการอ่าน
            File textFile = new File(jarDir, "your-text-file.txt"); // เปลี่ยน "your-text-file.txt" เป็นชื่อไฟล์ของคุณ

            // 3. อ่านไฟล์
            if (textFile.exists()) {
                System.out.println("Reading file from: " + textFile.getAbsolutePath());
                try (BufferedReader reader = new BufferedReader(new FileReader(textFile))) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        System.out.println(line);
                    }
                }
            } else {
                System.out.println("File not found: " + textFile.getAbsolutePath());
            }

        } catch (URISyntaxException | IOException e) {
            e.printStackTrace();
        }
    }
}

เราใช้ ReadFileFromJarLocation.class.getProtectionDomain().getCodeSource().getLocation().toURI() เพื่อหาตำแหน่ง (path) ของโค้ดที่กำลังทำงานอยู่ ซึ่งเมื่อรันจาก JAR ก็คือตำแหน่งของ JAR ไฟล์นั่นเอง

jarFile.getParent() จะให้ผลลัพธ์เป็น path ของโฟลเดอร์ที่เก็บไฟล์ JAR นั้นไว้