使用内存映射的缓冲区和分散/收集来创建具有映射文件的HTTP答复并收集写入
import java.io.FileInputStream;/* 来 自 时 代 J a v a - nowjava.com*/ import java.io.FileOutputStream; import java.io.IOException; import java.net.URLConnection; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; public class Main { private static final String OUTPUT_FILE = "MappedHttp.out"; private static final String LINE_SEP = "\r\n"; private static final String HTTP_HDR = "HTTP/1.0 200 OK" + LINE_SEP + "test" + LINE_SEP;/**时代Java公众号**/ private static final String HTTP_404_HDR = "HTTP/1.0 404 Not Found" + LINE_SEP + "test" + LINE_SEP; private static final String MSG_404 = "Could not open file: "; public static void main(String[] argv) throws Exception { String file = "test.dat"; ByteBuffer header = ByteBuffer.wrap(HTTP_HDR.getBytes("US-ASCII")); ByteBuffer dynhdrs = ByteBuffer.allocate(128); ByteBuffer[] gather = { header, dynhdrs, null }; String contentType = "unknown/unknown"; long contentLength = -1; try { FileInputStream fis = new FileInputStream(file); FileChannel fc = fis.getChannel(); MappedByteBuffer filedata = fc.map(MapMode.READ_ONLY, 0, fc.size()); gather[2] = filedata; contentLength = fc.size(); contentType = URLConnection.guessContentTypeFromName(file); fis.close(); } catch (IOException e) { ByteBuffer buf = ByteBuffer.allocate(128); String msg = MSG_404 + e + LINE_SEP; buf.put(msg.getBytes("US-ASCII")); buf.flip(); gather[0] = ByteBuffer.wrap(HTTP_404_HDR.getBytes("US-ASCII")); gather[2] = buf; contentLength = msg.length(); contentType = "text/plain"; } StringBuffer sb = new StringBuffer(); sb.append("Content-Length: " + contentLength); sb.append(LINE_SEP); sb.append("Content-Type: ")