1. 程式人生 > >Restlet流式讀取遠端檔案內容 InputRepresentation

Restlet流式讀取遠端檔案內容 InputRepresentation

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部分是由缺陷的,在有漢字的時候,會因為不正確的截斷位元組陣列造成亂碼。這裡是因為我驗證的時候檔案只有英文和陣列,所以簡單的採用此種方式。