org.apache.solr.common.util.ContentStream.java及其实现类

org.apache.solr.common.util.ContentStream.java 主要是获取文件,URL,字节数组,字符串等的数据流.主要方法又InputStream getStream()和 Reader getReader().

其实现类:org.apache.solr.common.util.ContentStreamBase.java为抽象类.以下有URLStream.java,FileStream.java,StringStream.java,ByteArrayStream.java四个实现类.分别针对URL,文件,字符串,字节数组.

接口:ContentStream.java

package org.apache.solr.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

/**
 *
 * @since solr 1.2
 */
public interface ContentStream {
  String getName();
  String getSourceInfo();
  String getContentType();

  /**
   * @return 数据流大小 或者 <code>null</code>
   */
  Long getSize(); //如果知道返回大小否则位null

  /**
   * 获取一个打开的数据流,那么必须负责关闭它.可以考虑这样使用:
   * <pre>
   *   InputStream stream = stream.getStream();
   *   try {
   *     // use the stream...
   *   }
   *   finally {
   *     IOUtils.closeQuietly(stream);
   *   }
   *  </pre>
   *
   *  为了保证正在运行,只有在第一次时调用<code>getStream()</code> 或者 <code>getReader()</code>,
   *  其他调用的运行行为时不明确的.
   *
   * 注意: 在属性(name, contentType, etc)保证被赋值之前,必须调用<code>getStream()</code> 或者
   *  <code>getReader()</code>.数据流只有在该方法调用时才可能懒加载.
   */
  InputStream getStream() throws IOException;

  /**
   * 获取一个打开的数据流,那么必须负责关闭它.可以考虑这样使用:
   * <pre>
   *   Reader reader = stream.getReader();
   *   try {
   *     // use the reader...
   *   }
   *   finally {
   *     IOUtils.closeQuietly(reader);
   *   }
   *  </pre>
   *
    *  为了保证正在运行,只有在第一次时调用<code>getStream()</code> 或者 <code>getReader()</code>,
   *  其他调用的运行行为时不明确的.
   *
   * 注意: 在属性(name, contentType, etc)保证被赋值之前,必须调用<code>getStream()</code> 或者
   *  <code>getReader()</code>.数据流只有在该方法调用时才可能懒加载.
   */
  Reader getReader() throws IOException;
}

抽象类:ContentStreamBase.java 及其实现类URLStream.java,FileStream.java,StringStream.java,ByteArrayStream.java

package org.apache.solr.common.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;

/**
 * 三个ContentStream的具体实现 - 一个 File/URL/String
 *
 *
 * @since solr 1.2
 */
public abstract class ContentStreamBase implements ContentStream
{
  public static final String DEFAULT_CHARSET = "utf-8";

  protected String name;
  protected String sourceInfo;
  protected String contentType;
  protected Long size;

  //---------------------------------------------------------------------
  //---------------------------------------------------------------------
  /**
   * 从 内容类型字符串中得到字符编码设置,没有的话,返回null
   * @param contentType
   * @return
   */
  public static String getCharsetFromContentType( String contentType )
  {
    if( contentType != null ) {
        //获取contentType中"charset="的索引下标
      int idx = contentType.toLowerCase(Locale.ROOT).indexOf( "charset=" );
      if( idx > 0 ) {
        return contentType.substring( idx + "charset=".length() ).trim();
      }
    }
    return null;
  }

  //------------------------------------------------------------------------
  //------------------------------------------------------------------------

  /**
   * 根据<code>URL</code> 构造<code>ContentStream</code>
   *
   * 这里使用<code>URLConnection</code>来获得数据流的内容
   * @see  URLConnection
   */
  public static class URLStream extends ContentStreamBase
  {
    private final URL url;

    public URLStream( URL url ) {
      this.url = url;
      sourceInfo = "url";
    }

    @Override
    public InputStream getStream() throws IOException {
      URLConnection conn = this.url.openConnection();

      contentType = conn.getContentType();
      name = url.toExternalForm();
      size = new Long( conn.getContentLength() );
      return conn.getInputStream();
    }
  }

  /**
   * 根据<code>File</code> 构造<code>ContentStream</code>
   */
  public static class FileStream extends ContentStreamBase
  {
    private final File file;

    public FileStream( File f ) {
      file = f; 

      contentType = null; // ??
      name = file.getName();
      size = file.length();
      sourceInfo = file.toURI().toString();
    }

    @Override
    public String getContentType() {
      if(contentType==null) {
        InputStream stream = null;
        try {
          stream = new FileInputStream(file);
          char first = (char)stream.read();
          if(first == ‘<‘) {
            return "application/xml";
          }
          if(first == ‘{‘) {
            return "application/json";
          }
        } catch(Exception ex) {
        } finally {
          if (stream != null) try {
            stream.close();
          } catch (IOException ioe) {}
        }
      }
      return contentType;
    }

    @Override
    public InputStream getStream() throws IOException {
      return new FileInputStream( file );
    }
  }

  /**
   * 根据<code>String</code> 构造<code>ContentStream</code>
   */
  public static class StringStream extends ContentStreamBase
  {
    private final String str;

    public StringStream( String str ) {
      this.str = str; 

      contentType = null;
      name = null;
      size = new Long( str.length() );
      sourceInfo = "string";
    }

    @Override
    public String getContentType() {
      if(contentType==null && str.length() > 0) {
        char first = str.charAt(0);
        if(first == ‘<‘) {
          return "application/xml";
        }
        if(first == ‘{‘) {
          return "application/json";
        }
        // find a comma? for CSV?
      }
      return contentType;
    }

    @Override
    public InputStream getStream() throws IOException {
      return new ByteArrayInputStream( str.getBytes(DEFAULT_CHARSET) );
    }

    /**
     * 如果contentType中没有定义charset编码,则使用StringReader
     */
    @Override
    public Reader getReader() throws IOException {
      String charset = getCharsetFromContentType( contentType );
      return charset == null
        ? new StringReader( str )
        : new InputStreamReader( getStream(), charset );
    }
  }

  /**
   * 基本的reader 实现. 如果contentType声明了一个charset,
   * 则使用charset中的编码,否则使用utf-8.
   */
  @Override
  public Reader getReader() throws IOException {
    String charset = getCharsetFromContentType( getContentType() );
    return charset == null
      ? new InputStreamReader( getStream(), DEFAULT_CHARSET )
      : new InputStreamReader( getStream(), charset );
  }

  //------------------------------------------------------------------
  // Getters / Setters for overrideable attributes
  //------------------------------------------------------------------

  @Override
  public String getContentType() {
    return contentType;
  }

  public void setContentType(String contentType) {
    this.contentType = contentType;
  }

  @Override
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public Long getSize() {
    return size;
  }

  public void setSize(Long size) {
    this.size = size;
  }

  @Override
  public String getSourceInfo() {
    return sourceInfo;
  }

  public void setSourceInfo(String sourceInfo) {
    this.sourceInfo = sourceInfo;
  }

  /**
   *  根据<code>File</code> 构造<code>ContentStream</code>
   */
  public static class ByteArrayStream extends ContentStreamBase
  {
    private final byte[] bytes;

    public ByteArrayStream( byte[] bytes, String source ) {
      this.bytes = bytes; 

      this.contentType = null;
      name = source;
      size = new Long(bytes.length);
      sourceInfo = source;
    }

    @Override
    public InputStream getStream() throws IOException {
      return new ByteArrayInputStream( bytes );
    }
  }
}

时间: 2024-07-29 03:17:44

org.apache.solr.common.util.ContentStream.java及其实现类的相关文章

solrj:org.apache.solr.common.util.NamedList.java

package org.apache.solr.common.util; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.solr.common.

mavne install 报错org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException

maven install 报错 org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.InvocationTargetException; nested exception is java.lang.reflect.InvocationTargetException: nulljava.lang.reflect.InvocationTargetException at sun.reflect.

solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法

看到很多所谓的解决办法都没有效果.比如把solrconfig.xml里的<str name="df">text</str>改成<str name="df">id</str>,或者在schema.xml里添加一个text的fieldType,都不行.我干脆把它注释掉,结果导致solr服务都不正常了. 最后找到的这个文章帮了大忙,虽然写的不那么直接: http://blog.csdn.net/jaylong35/artic

Apache Solr采用Java开发、基于Lucene的全文搜索服务器

http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现.Solr 中存储的资源是以 Document 为对象进行存储的.每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性.Solr 中的每个 Doc

玩转大数据系列之Apache Pig如何与Apache Solr集成(二)

散仙,在上篇文章中介绍了,如何使用Apache Pig与Lucene集成,还不知道的道友们,可以先看下上篇,熟悉下具体的流程. 在与Lucene集成过程中,我们发现最终还要把生成的Lucene索引,拷贝至本地磁盘,才能提供检索服务,这样以来,比较繁琐,而且有以下几个缺点: (一)在生成索引以及最终能提供正常的服务之前,索引经过多次落地操作,这无疑会给磁盘和网络IO,带来巨大影响 (二)Lucene的Field的配置与其UDF函数的代码耦合性过强,而且提供的配置也比较简单,不太容易满足,灵活多变的

solr环境搭建及java小demo

一配置solr环境 1.下载solr 2.配置solr(最好单独分离出一个tomcat,一台机器启动多个tomcat参见:http://www.cnblogs.com/lxlwellaccessful/p/6746341.html) a.在下载的solr文件夹下的\example\solr\下将文件全部考到一个文件夹中(本人是放在E:\MySoft\solr\home中的) b.初始化solr实例 在solr解压路径的\example\webapps\路径下有一个solr.war,将其复制到to

Apache Solr 之 使用SolrJ操作索引库

Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互.最基本的功能就是管理Solr索引,包括添加.更新.删除和查询等.对于一些比较基础的应用,用Solj基本够用,而且你可以非常容易地通过使用Solrj的API实现与Solr搜索服务器进行交互,实现对Solr的基本管理功能.如果你的应用比较复杂,可以扩展Solrj来满足需要. 使用 SolrJ操作索引库: package com.hcm.solr.test; import java.io.IOExce

Apache Solr 之 环境搭建

 Apache Solr 之 环境搭建 假定$SOLR_HOME为D:\Program Files\solr-tomcat\solr 步骤1,从solr-4.1.0\dist复制solr-4.1.0.war到$SOLR_HOME并重命名为solr.war: 步骤2,将solr-4.1.0\example\solr复制到$SOLR_HOME目录: 步骤3,在tomcat/conf/catalina/localhost下新建solr.xml,如下: <Context docBase="D:/P

02 Apache Solr: 概览 Solr在信息系统架构中的位置

概述: Apache Solr是一个用JAVA语言构建在Apache Lucene项目上的开源的企业级搜索平台.主要特性包含:全文搜索.命中高亮.片段式搜索.实时索引.动态集群.数据库集成.NoSQL特性和富文本处理.提供分布式搜索和索引复制,设计时便充分考虑了扩展和容错能力.Solr目前是第二流行的企业级搜索引擎,第一是ElasticSearch. Solr作为一个独立的全文本搜索服务器运行.在内部使用JAVA开发的Lucene完成全文本索引和查询,提供RESTful API完成对大多数编程语