Restlet流式讀取遠端檔案內容 InputRepresentation
阿新 • • 發佈:2018-12-23
OneCoder驗證用Restlet做服務,讀取遠端檔案內容功能,編寫驗證程式碼。目前測試通過,主要是利用restlet內部提供的InputRepresentation物件,通過ReadableByteChannel,按位元組流的方式讀取檔案內容。程式碼如下,省略註冊服務的部分,只給出服務端和客戶端關鍵程式碼:
服務端:
package com.coderli.restlet.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream ;
import org.restlet.representation.InputRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
/**
* 檔案讀取服務端
*
* @author lihzh(OneCoder)
* @date 2013年12月4日 下午4:35:22
* @website http://www.coderli.com
*/
public class MacFile extends ServerResource {
@Get
public InputRepresentation readFile() throws FileNotFoundException {
System. out.println("開始讀取檔案" );
File file = new File("/Users/apple/Documents/stockdata/SH600177.TXT" );
InputStream inputStream = new FileInputStream(file);
InputRepresentation inputRepresentation = new InputRepresentation (
inputStream);
return inputRepresentation;
}
}
客戶端:
package com.coderli.restlet.file;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import org.restlet.data.MediaType;
import org.restlet.representation.ReadableRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.ClientResource;
/**
* 檔案讀取,客戶端
*
* @author lihzh(OneCoder)
* @date 2013年12月4日 下午4:36:00
*/
public class MacFileClient {
public static void main(String[] args) throws IOException {
ClientResource clientResource = new ClientResource(
"http://localhost:8182/macFile" );
Representation rp = clientResource.get(MediaType.ALL );
ReadableRepresentation rRepresentation = (ReadableRepresentation) rp;
ReadableByteChannel rbc = rRepresentation.getChannel();
ByteBuffer bb = ByteBuffer. allocate(1024);
int index = -1;
do {
index = rbc.read(bb);
if (index <= 0) {
break;
}
bb.position(0);
byte[] bytes = new byte[index];
bb.get(bytes);
System. out.print(new String(bytes, "gbk"));
bb.clear();
} while (index > 0);
}
}
需要注意的是,這裡客戶端實現中的System.out.print部分是由缺陷的,在有漢字的時候,會因為不正確的截斷位元組陣列造成亂碼。這裡是因為我驗證的時候檔案只有英文和陣列,所以簡單的採用此種方式。