0

所以我正在尝试使用 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...");
}
}
4

0 回答 0