我一直在用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可以完美地工作,但是,它没有。
答案 0 :(得分:1)
那是因为文件在里面 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"
。