繁体   English   中英

访问jar文件中的文件

[英]Accessing files inside a jar file

我一直在用Java编写一个简单的Web服务器,尽管它可以在Eclipse中工作,但是我无法将其导出到jar中。 我正在尝试将一些文件与二进制文件一起打包,并且我知道我必须使用InputStream从jar中读取文件,但是每次工作正常时,我都会从chrome访问它,并说:“空响应” 。 这可能意味着该jar无法读取自身,因此我决定从头开始,但实际上并不知道该怎么做。

这是有问题的类的代码:

    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 内部 ,并且无法在文件系统上访问-使用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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM