2

我不知何故一直認爲這應該是可能的:本地文件系統中的Apache httpclient GET文件?

val client = HttpClients.createDefault() 
val httpGet = new HttpGet("file:///Users/user01/testfile") 
client.execute(httpGet) 

會拋出:

client: org.apache.http.impl.client.CloseableHttpClient = [email protected] 
httpGet: org.apache.http.client.methods.HttpGet = GET file:///Users/user01/testfile HTTP/1.1 
org.apache.http.client.ClientProtocolException: URI does not specify a valid host name: file:///Users/user01/testfile 
    at org.apache.http.impl.client.CloseableHttpClient.determineTarget(test_ws.sc0.tmp:90) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(test_ws.sc0.tmp:78) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(test_ws.sc0.tmp:103) 
    at #worksheet#.#worksheet#(test_ws.sc0.tmp:6) 

哪一種有意義的,因爲我創造一個HttpGet實例。

有沒有人知道如何做到這一點?

+0

我會說** HTTP **客戶端被設計爲使用** HTTP **協議,使用其他工具用於其他協議(文件,FTP,...)。 –

+0

我在Mac上,但文件/ Users/user01/testfile確實存在。 –

+0

也許你想要使用一個URL:// [像這樣](http://stackoverflow.com/a/1485737/4136325) –

回答

0

如何使用內置的java.net.URL類?這可以處理http和文件協議。

+0

無論是...我可以看到httpclient在內部試圖提取主機,所以也許畢竟這是不可能的 - target = URIUtils.extractHost(requestURI); –

+0

但我確定我已經完成了這個過去,但也許有一些類型的Spring包裝: –

+0

這只是適合我: public static void main(String [] a)拋出異常{ URL url = new URL( 「文件:/// tmp目錄/ foo」 的); InputStreamReader reader = new InputStreamReader((InputStream)url.getContent(),Charset.defaultCharset()); BufferedReader buffReader = new BufferedReader(reader); 絃線; StringBuilder strBuilder = new StringBuilder(); ((line = buffReader.readLine())!= null){ strBuilder.append(line); } System.out.println(strBuilder.toString()); \t} – erosb

2

奇怪的是,HttpClient是客戶端HTTP傳輸庫。它不支持任何其他傳輸協議。甚至沒有本地文件系統。你可能想要的是Apache Commons VFS或類似的東西。