所以我正在尝试使用 jar 加载文件。该文件位于 jar之外,但位于同一文件夹中。当我使用 java -jar Test.jar 从终端运行 jar 时,它工作得很好,但是如果我通过双击 jar 来运行它,它不会从文件中正确加载。我可以使用任何一种方法加载外部图像,但不能加载我创建的文件。这是在 Mac OSX 上运行的。这个问题似乎也存在于 Ubuntu 上。但是,在 Windows 上,文件的加载更加不正确。
两种情况下加载的路径似乎都是相同的。从终端运行时,数字的输出是正确的。但是,双击运行时,任何超过 127 的数字都加载不正确。我已经研究了几个小时的解决方案,但无济于事。
编辑:这是我的清单
Main-Class: Test
我创建了这个简单的应用程序来演示我的问题。
这就是写入将要读取的文件的内容。
import java.io.*;
public class TestWriter{
public static void main(String[] args){
try{
// Create the file and FileWriter.
FileWriter out = new FileWriter(new File("test.map"));
// Write some test numbers.
for (int i = 0; i < 481; i += 30)
out.write(i);
// Flush the output (for good measure?)
out.flush();
// Close the output.
out.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
这是加载文件的内容。
import javax.swing.JComponent;
import java.awt.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
public class Run extends JComponent{
// Image to be drawn on screen
BufferedImage IMAGE;
// Output to be drawn on screen
String string = "";
// Loading a MAP file - includes loading a bmp image and a .map (txt file).
public Run(){
// MAP name
String map = "test";
System.out.println("Loading map: "+map);
// Get path
String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = "";
// Decode path
try{
decodedPath = URLDecoder.decode(path, "UTF-8");
decodedPath = decodedPath.substring(0, decodedPath.lastIndexOf("/") + 1);
} catch (Exception e){
System.out.println("Could not decode path.");
e.printStackTrace();
System.exit(1);
}
// Add decoded path to output string
string += decodedPath;
try{
IMAGE = ImageIO.read(new File(decodedPath+"/"+map+".bmp"));
System.out.println("MAP image loaded.");
} catch (IOException e){
System.out.println("Could not load MAP image.");
e.printStackTrace();
System.exit(1);
}
try{
System.out.println("Loading MAP data.");
// Create a new reader
FileReader in = new FileReader(new File(decodedPath+"/"+map+".map"));
// While there is something left to be read
while (in.ready()){
// add the next input to the output string
string += ", "+in.read();
}
// Close the input (for good measure)
in.close();
System.out.println("Loaded MAP data.");
} catch (Exception e){
System.err.println("Could not load MAP data.");
e.printStackTrace();
System.exit(1);
}
// Repaint the screen to show our newly loaded image and string
repaint();
}
public void paint(Graphics g){
g.drawImage(IMAGE,0,0,null);
g.drawString(string,16,64);
}
}
这是创建 JFrame 并添加组件 Run() 的主要方法
import javax.swing.JFrame;
import javax.swing.JComponent;
public class Test{
public static void main(String[] args){
System.out.println("\nInitializing...");
JFrame frame = new JFrame("Test");
int frameWidth = 640;
int frameHeight = 200;
frame.setSize(frameWidth,frameHeight);
frame.setResizable(false);
frame.setLocation(240,60);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Run());
frame.setVisible(true);
System.out.println("Running...");
}
}