集册 Java实例教程 使用记忆

使用记忆

欢马劈雪     最近更新时间:2020-01-02 10:19:05

493
使用内存映射的缓冲区和分散/收集来创建具有映射文件的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: ")
展开阅读全文