小编Rob*_*Rob的帖子

是否可以将Process stdout InputStream读入NIO ByteBuffer?

是否可以使用NIO处理进程中的stdout?我有它使用java.io,但这是一个练习,以了解更多关于NIO和探索性能改进的可能性.

基本上我想尽可能快地将大量文本从stdout流式传输到缓冲区而不会阻塞,然后再处理该缓冲区的内容.麻烦的是,我似乎无法弄清楚正确的伏都教使其与NIO合作.这就是我现在所处的位置:

ProcessBuilder pb = new ProcessBuilder( ... );
Process p = pb.start();
stdout = new StreamConsumer(p.getInputStream());
new Thread(stdout).start();
// other stuff omitted for brevity
Run Code Online (Sandbox Code Playgroud)

StreamConsumer类看起来像这样:

class StreamConsumer implements Runnable
{
  private InputStream is;

  public StreamConsumer(InputStream is)
  {
    this.is = is;
  }

  public void run()
  {
    try
    {
      ReadableByteChannel source = Channels.newChannel(is);

      // Is it possible get a channel to a ByteBuffer 
      // or MappedByteBuffer here?
      WritableByteChannel destination = ??;
      ByteBuffer buffer = ByteBuffer.allocateDirect(128 * 1024);

      while (source.read(buffer) != -1) …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer inputstream

6
推荐指数
2
解决办法
5026
查看次数

编写 PL/pgSQL 的更好方法?

是否有一个像 IDE 一样的工具来编写和调试 PL/pgSQL 函数,例如用于编写存储过程?

我发现使用 pgAdmin III 是一种挫折练习,因为错误消息通常非常神秘,而且事情有以神秘方式失败的习惯。

postgresql plpgsql

5
推荐指数
1
解决办法
5025
查看次数

从图像中剥离Alpha通道

我想从PNG中剥离Alpha通道(透明背景),然后将它们写为JPEG图像.更准确地说,我想将透明像素设为白色.我尝试了两种技术,两种技术都以不同的方式失败:

方法1:

BufferedImage rgbCopy = new BufferedImage(inputImage.getWidth(), inputImage.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = rgbCopy.createGraphics();
graphics.drawImage(inputImage, 0, 0, Color.WHITE, null);
graphics.dispose();
return rgbCopy;
Run Code Online (Sandbox Code Playgroud)

结果:图像具有粉红色背景.

方法2:

final WritableRaster raster = inputImage.getRaster();
final WritableRaster newRaster = raster.createWritableChild(0, 0, inputImage.getWidth(), inputImage.getHeight(), 0, 0, new int[]{0, 1, 2});
ColorModel newCM = new ComponentColorModel(inputImage.getColorModel().getColorSpace(), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
return new BufferedImage(newCM, newRaster, false, null);
Run Code Online (Sandbox Code Playgroud)

结果:图像为黑色背景.

在这两种情况下,输入图像都是PNG,输出图像以JPEG格式写入,如下所示:ImageIO.write(bufferedImage, "jpg", buffer).如果它是相关的:这是在Java 8上,我使用12monkeys库来调整图像大小,然后再将其写为JPEG.

我已经尝试了上面代码的一些变体,没有运气.以前的一些问题提出了上述代码,但在这种情况下似乎并没有起作用.

java bufferedimage alpha twelvemonkeys

5
推荐指数
1
解决办法
1209
查看次数

实施大规模日志文件分析

任何人都可以指出我的参考或提供高级概述,如Facebook,雅虎,谷歌等公司如何执行他们为运营,特别是网络分析做的大规模(例如多TB范围)日志分析?

特别关注网络分析,我对两个密切相关的方面感兴趣:查询性能和数据存储.

我知道一般的方法是使用map reduce在集群上分发每个查询(例如使用Hadoop).但是,最有效的存储格式是什么?这是日志数据,因此我们可以假设每个事件都有一个时间戳,而且通常数据是结构化的而不是稀疏的.大多数Web分析查询涉及分析两个任意时间戳之间的数据片段,并检索该数据中的聚合统计信息或异常.

像Big Table(或HBase)这样的面向列的数据库是一种有效的存储方式,更重要的是,它可以查询这些数据吗?您选择行的子集(基于时间戳)这一事实是否违背了此类存储的基本前提?将它存储为非结构化数据会更好吗,例如.反向指数?

storage hadoop mapreduce bigtable

4
推荐指数
2
解决办法
1862
查看次数

为一个属性反序列化具有多种类型的 JSON

我正在使用一个 3rd 方 API,它为同一个 JSON 属性返回三种不同的类型,这取决于它包含多少嵌套对象。我正在尝试找出使用 Jackson(最好使用 Retrofit)处理反序列化这些对象的最佳方法。

一个简化的示例:从该 API 检索客户记录时,响应可能是以下任何一项:

  1. 客户有多个电话号码;返回一个数组PhoneObjects

    {
        "Phones": {
            "PhoneObject":[
                {"number":"800 555 6666","type":"Home"},
                {"number":"800 555 4444","type":"Work"}
            ]
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 客户有一个电话号码;返回单个PhoneObject

    {
        "Phones": {
            "PhoneObject": {"number":"800 555 6666","type":"Home"}
        },
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 客户没有电话号码;返回一个空字符串(!)

    {
        "Phones": {
            "PhoneObject":""
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

目前,我通过将 Jackson 反序列化为 aMap<String, Object>并检查Object以确定它是什么类型,然后将其插入到例如 a List<PhoneObject>(如果对象不存在,则返回空列表)来处理此问题。然而,这很麻烦,并且希望找到一种更简洁的方法来反序列化这些对象。

java json jackson retrofit

4
推荐指数
1
解决办法
1553
查看次数

BufferedReader用于大型ByteBuffer?

有没有办法用BufferedReader读取ByteBuffer而不必先将它变成String?我想通过相当大的ByteBuffer读取文本行,出于性能原因,我想避免将其写入磁盘.在ByteBuffer上调用toString不起作用,因为生成的String太大(它会抛出java.lang.OutOfMemoryError:Java堆空间).我原以为API中会有一些东西将ByteBuffer包装在合适的阅读器中,但我似乎找不到合适的东西.

这是一个缩写代码示例,说明了我在做什么):

// input stream is from Process getInputStream()
public String read(InputStream istream)
{
  ReadableByteChannel source = Channels.newChannel(istream);
  ByteArrayOutputStream ostream = new ByteArrayOutputStream(bufferSize);
  WritableByteChannel destination = Channels.newChannel(ostream);
  ByteBuffer buffer = ByteBuffer.allocateDirect(writeBufferSize);

  while (source.read(buffer) != -1)
  {
    buffer.flip();
    while (buffer.hasRemaining())
    {
      destination.write(buffer);
    }
    buffer.clear();
  }

  // this data can be up to 150 MB.. won't fit in a String.
  result = ostream.toString();
  source.close();
  destination.close();
  return result;
}

// after the process is run, we call this method with the String
public …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer bufferedreader

3
推荐指数
1
解决办法
2万
查看次数