Java 访问jar文件中的文件

Java 访问jar文件中的文件,java,eclipse,Java,Eclipse,我一直在用Java编写一个简单的Web服务器,虽然它在Eclipse中工作,但我无法将它导出到jar。我正试图将一些文件与二进制文件打包在一起,我知道我必须使用InputStream从jar中读取,但每次它似乎起作用时,我都从chrome访问它,它会说:“空响应”。这可能意味着罐子本身无法读取,所以我决定重新开始,但不知道如何读取 下面是问题类的代码: package handlers; import java.io.*; import com.sun.net.httpserver.*

我一直在用Java编写一个简单的Web服务器,虽然它在Eclipse中工作,但我无法将它导出到jar。我正试图将一些文件与二进制文件打包在一起,我知道我必须使用InputStream从jar中读取,但每次它似乎起作用时,我都从chrome访问它,它会说:“空响应”。这可能意味着罐子本身无法读取,所以我决定重新开始,但不知道如何读取

下面是问题类的代码:

    package handlers;

import java.io.*;
import com.sun.net.httpserver.*;

public final class Greeter implements HttpHandler {

    package handlers;

    import java.io.*;
    import com.sun.net.httpserver.*;

    public final class Greeter implements HttpHandler {

        static Headers h;
        static File file;
        static byte [] bytes;
        static FileInputStream fis;
        static BufferedInputStream bis;
        static OutputStream os;

        public void handle(HttpExchange t) throws IOException {

            h = t.getResponseHeaders();
            os = t.getResponseBody();
            file = new File("GreetingText.html");
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            bytes = new byte[(int) file.length()];

            h.add("Content-Type", "text/html");
            bis.read(bytes, 0, bytes.length);
            t.sendResponseHeaders(200, file.length());
            os.write(bytes, 0, bytes.length);
            os.close();

        }

    }

这不是重复,因为我已经尝试过其他类似帖子中给出的解决方案。请注意,没有资源的jar可以很好地工作,但是有资源的jar不能工作。

这是因为文件在jar中,在文件系统上不再可访问-使用
FileInputStream
仍在使用文件

您需要将其视为一种资源,并从中获得一个
InputStream
,然后它将在打包为JAR和不打包时都能工作

h = t.getResponseHeaders();
os = t.getResponseBody();

// Get an URL to the file
URL url = getClass().getResource("GreetingText.html");

// Open the stream and read the contents into a byte array
byte[] bytes;
try(InputStream in = url.openStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream()) {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) > 0) {
        bytes.write(buffer, 0, read);
    }
    bytes = out.toByteArray();
}

h.add("Content-Type", "text/html");
t.sendResponseHeaders(200, bytes.length);
os.write(bytes, 0, bytes.length);
os.close();

将文件放在类路径上,如果它在另一个包中,则需要在路径前面加上/path/to/file,因此如果将其放在类路径根目录html中,则必须使用
“/html/GreetingText.html”

我建议添加清单并从类路径将其作为资源访问。它们本身不是文件;它们不在文件系统中。你从其他类似的帖子中到底尝试了什么?这个问题已经被回答了很多次,我很难相信它对你不起作用。相关的答案是,,,和。我没有读第一个。哎呀。