.jarファイルと同じフォルダーにあるファイルから読み取る方法はありますか?私は割り当てを提出するときにファイルから読み取る必要があるJavaプログラムを作成しようとしています。ファイルまたはプログラムがいったん渡されると、どこに保持されるかわかりません。保持されているファイルのディレクトリをエンコードできるとは思わないこれは可能ですか?問題は、LinuxサーバーであるCSXホストサーバーにファイルをアップロードし、そこから実行する必要があることです。ファイルは現在のフォルダの場所を検索するだけですか?
コメントに記載されているように、これは、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
に含まれるプログラムによって読み取られます。
編集:ファイル名は変更されないと言いました。もちろん、ハードコーディングを希望する場合は、事前に名前を知っていればこの答えが当てはまります。
特定のクラスを含むJARファイルの場所は、次の方法で取得できます。
URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();
そこから目的のファイルへのURLを簡単に相対化できます。
入力ファイル名をハードコーディングでき、コードを含む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();
}
}
@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();
}
「自己完結型」にするには、リソースを内部Jarに配置します。次に、(読み取り専用) 埋め込みリソース になり、次の行に沿って何かを使用してURLを取得できます。
URL url = this.getClass().getResource("/path/to/the.resource");
あなたのコメントに基づいて、あなたの最善の解決策は、アップロードされたファイルの絶対パスをjarに渡すことだと思います。
パスをコマンドライン引数としてjarに渡すことができます。パスとファイル名は変わらず、Linuxから実行するため、.shスクリプトを作成して実行できます。
#!/bin/bash
Java -jar myjar.jar /path/to/file/filename.txt
また、これにより、ファイルパスのハードコーディングや、jarへのファイル名から解放されます。
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;