小编nag*_*lzs的帖子

Java:如何实时计算正在保存的流中的sha1摘要?

我有一个用Java编写的servlet,它接受多部分形式的发布文件,该文件需要保存在MongoDb / GridFS中。我已经有为此工作的代码。

这是一个代码片段,显示了如何使用org.apache.commons.fileupload包完成此操作。它几乎不占用内存,因为它不会在内存中保留太多数据。

        ServletFileUpload upload = new ServletFileUpload();
        FileItemIterator iter = upload.getItemIterator(req);
        while (iter.hasNext()) {
            FileItemStream item = iter.next();
            String name = item.getFieldName();
            InputStream stream = item.openStream();
            if (item.isFormField()) {
                toProcess.put(name, Streams.asString(stream));
            } else {
                String fileName = item.getName();
                String contentType = item.getHeaders().getHeader("Content-Type");
                GridFSUploadOptions options = new GridFSUploadOptions()
                        // .chunkSizeBytes(358400)
                        .metadata(new Document("content_type", contentType));
                ObjectId fileId = gridFSFilesBucket.uploadFromStream(fileName, stream, options);
                fileIds.add(fileId);
                fileNames.add(fileName);
            }
Run Code Online (Sandbox Code Playgroud)

我还需要计算所有文件的sha1哈希值。阿帕奇digestutils可以用于此目的。它具有一种可以计算流中的sha1的方法:

https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html#sha1-java.io.InputStream-

我的问题是此方法完全消耗了流。我需要将输入流分为两部分。将一部分输入到SHA-1计算中,另一部分输入到GridFS存储桶中。

我怎样才能做到这一点?我当时正在考虑创建自己的“管道”,该管道具有输入和输出流,可以转发所有数据,但可以实时更新摘要。

我只是不知道如何开始写这样的管道。

java stream digest

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

为什么List <T> .toArray()返回通用Object []而不是T []?

例如:

List<String> items = new ArrayList<String>();
String[] aItems = items.toArray(); // type error, because toArray() returns Object[]
Run Code Online (Sandbox Code Playgroud)

我知道这是它的方式,它不能改变.当然我可以将它转换为String [],但我想知道它背后的想法是什么?这是Java中的"bug",还是有充分的理由呢?

java generics collections

0
推荐指数
1
解决办法
490
查看次数

ESP8266 上的 MicroPython - RTC 没有 init 方法?

文档说可以使用 RTC.init 调用初始化 RTC 时钟。

https://docs.micropython.org/en/latest/esp8266/library/machine.RTC.html

但它不会那样工作:

>>>import machine
>>>rtc = machine.RTC()
>>>rtc.init((2018,4,10,17,30))
Traceback (most recent call last):
  File "<stdin>", line 1 in <module>:
AttributeError: 'RTC' object has no attribute 'init'
Run Code Online (Sandbox Code Playgroud)

所以文档与现实相矛盾。固件版本是 v1.9.3 - 几天前下载了最新的。

最有趣的是,dir(rtc)给出['datetime','memory','alarm','alarm_left','irq','ALARM0']. 它缺少其他几种方法:now、deinit、cancel

那么RTC init方法在哪里,它怎么会消失呢?

UPDATE:我已经想通了,该文件是错误的,我需要使用RTC.datetime代替RTC.init。但它仍然是错误的:

>>>from machine import RTC
>>>rtc=RTC()
>>>rtc.datetime((2000,1,1,23,59,59,0,0))
>>>rtc.datetime()
(2000, 1, 3, 0, 11, 59, 3, 705)
Run Code Online (Sandbox Code Playgroud)

换句话说:2000-01-01T23:59:59 突然变成了 2000-01-03T00:11:59。如何?

我在 RTC.datetime 方法的 tzinfo 参数上也找不到任何有用的东西。它应该是一个数字,这很清楚。但是这是什么意思?

我也试过午夜:

>>>rtc.datetime((2000,1,1,0,0,0,0,0))
>>>rtc.datetime()
(2000,1,1,5,0,0,1,155)
Run Code Online (Sandbox Code Playgroud)

因此,在 tzinfo=0 时,午夜变为 05:00:00。我首先认为这意味着 …

esp8266 micropython

0
推荐指数
1
解决办法
1715
查看次数

Apache Velocity 2.0 如何编写自定义资源加载器?

ResourceLoaderAPI文档中有一个类:

https://velocity.apache.org/engine/2.0/apidocs/org/apache/velocity/runtime/resource/loader/ResourceLoader.html

我想实现自己的加载器,因为我需要从数据库加载模板,但是以上下文敏感的方式(换句话说:无法使用 DataSourceResourceLoader,我需要编写自定义代码以从数据库)。

似乎ResourceLoader有一些抽象方法,而且我似乎也可以通过实现这些抽象方法来编写自定义加载器。但我没有看到任何方法可以向引擎添加新的加载程序。没有“addResourceLoader”方法。该文档仅显示如何配置 Velocity 中内置的加载器:

https://velocity.apache.org/engine/2.0/developer-guide.html#resource-loaders

主要问题:如何将自定义资源加载器添加到 VelocityEngine(或 VelocityContext?)

另一个附带问题:我想关闭所有内置加载器。特别WebappResourceLoader是它默认处于活动状态,并且在我的特定应用程序中代表了安全风险。怎么做?

java velocity

0
推荐指数
1
解决办法
1457
查看次数

标签 统计

java ×3

collections ×1

digest ×1

esp8266 ×1

generics ×1

micropython ×1

stream ×1

velocity ×1