web-dev-qa-db-ja.com

.jarファイルと同じフォルダーにあるファイルから読み取る

.jarファイルと同じフォルダーにあるファイルから読み取る方法はありますか?私は割り当てを提出するときにファイルから読み取る必要があるJavaプログラムを作成しようとしています。ファイルまたはプログラムがいったん渡されると、どこに保持されるかわかりません。保持されているファイルのディレクトリをエンコードできるとは思わないこれは可能ですか?問題は、LinuxサーバーであるCSXホストサーバーにファイルをアップロードし、そこから実行する必要があることです。ファイルは現在のフォルダの場所を検索するだけですか?

16
shinjuo

コメントに記載されているように、これは、jarが存在するディレクトリからコマンドを実行した場合にのみ機能します。

(デスクトップアプリケーションのコンテキストで)
jarの現在のディレクトリにあるファイルにアクセスするには、ファイルへのpathの前にドットを付ける必要があります。例:

String path = "./properties.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// Read the file contents...

この例では、jarと同じディレクトリにproperties.txtというテキストファイルがあります。
このファイルは、jarに含まれるプログラムによって読み取られます。

編集:ファイル名は変更されないと言いました。もちろん、ハードコーディングを希望する場合は、事前に名前を知っていればこの答えが当てはまります。

17
afsantos

特定のクラスを含むJARファイルの場所は、次の方法で取得できます。

URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();

そこから目的のファイルへのURLを簡単に相対化できます。

22
user207421

入力ファイル名をハードコーディングでき、コードを含むjarと同じディレクトリに常に存在することがわかっている場合、これは機能するはずです。

public static void main(String[] args) {

    try {
        // Determine where the input file is; assuming it's in the same directory as the jar
        String fileName = "input.txt";
        File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        String inputFilePath = jarFile.getParent() + File.separator + fileName;         
        FileInputStream inStream = new FileInputStream(new File(inputFilePath));

        try {

            // Read in the contents of the input file in a single gulp
            FileChannel fc = inStream.getChannel();
            MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
                    fc.size());

            // Do something with the read in data
            System.out.println(Charset.defaultCharset().decode(bb)
                    .toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inStream.close();
        }

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

}
2
Darwyn

@kcpr-提供されたソリューションをありがとう。以下は私のために働いた。

private static String CONFIG_FILE_LOCATION = "lib"+ File.separator + "Config.properties";

static {
    File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
    String inputFilePath = jarFile.getParent() + File.separator + CONFIG_FILE_LOCATION; 
    propConfig = new PropertiesConfiguration(new File(inputFilePath));
    propConfig.load();
}
2
Srinivasarao S

「自己完結型」にするには、リソースを内部Jarに配置します。次に、(読み取り専用) 埋め込みリソース になり、次の行に沿って何かを使用してURLを取得できます。

URL url = this.getClass().getResource("/path/to/the.resource");
1
Andrew Thompson

あなたのコメントに基づいて、あなたの最善の解決策は、アップロードされたファイルの絶対パスをjarに渡すことだと思います。

パスをコマンドライン引数としてjarに渡すことができます。パスとファイル名は変わらず、Linuxから実行するため、.shスクリプトを作成して実行できます。

#!/bin/bash    
Java -jar myjar.jar /path/to/file/filename.txt

また、これにより、ファイルパスのハードコーディングや、jarへのファイル名から解放されます。

0
aglassman

Jarファイルへのクリーンなディレクトリパスを取得する方法は次のとおりです(EJPの回答に基づく)。

URL url = IssueInfoController.class.getProtectionDomain().getCodeSource().getLocation();
String urlString = url.toString();
int firstSlash =  urlString.indexOf("/");
int targetSlash = urlString.lastIndexOf("/", urlString.length() - 2) + 1;

return urlString.substring(firstSlash, targetSlash) + YOUR_FILE;
0