2015-06-17 121 views
1

我一直在用Java編寫一個簡單的web服務器,儘管它在Eclipse中工作,但我無法將它導出到jar。我試圖將一些文件與二進制文件一起打包,並且我知道必須使用InputStream從jar中讀取數據,但每次似乎都能正常工作,我可以從chrome中訪問它,並且它說:「空響應」 。這可能意味着該jar無法自我閱讀,所以我決定重新開始,但不知道如何。訪問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

我建議添加一個清單並從類路徑中以資源的形式訪問它們。它們本身不是文件;他們不在文件系統上。 – duffymo

+0

你從那些其他類似的帖子試過了什麼?這已經被回答了很多次,我很難相信它不適合你。相關答案是 http://stackoverflow.com/questions/3369794/how-to-a-read-file-from-jar-in-java, http://stackoverflow.com/questions/2271926/how-to -read-a-file-from-a-jar-file, http://stackoverflow.com/questions/23001856/reading-a-text-file-from-a-jar, 和http:// stackoverflow。 com/questions/9054880/java-how-to-package-and-access-resources-inside-a-runnable-jar-file。 – VGR

+0

沒有閱讀第一個。哎呀。 – ahumblecoder

回答

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(); 

放在你的classpath的文件,如果它在你需要前綴/路徑/到/文件路徑,所以如果你把它放在目錄HTML在根另一個包你的類路徑,你將不得不使用"/html/GreetingText.html"

+0

解決了我的問題。 – ahumblecoder