小编Dan*_*Dan的帖子

InputStream to Channel for Selector

我搜索了高低,但找不到明确的、最新的答案来回答我关于 NIO 的问题。

有什么方法可以从 an 转换InputStream为 a Channel,我可以使用 aSelector吗?似乎Channels.newChannel()是进行转换的唯一方法,但不提供 的实例AbstractSelectableChannel,这正是我所需要的。

更具体地说,我想从子进程的stdoutstderr流中读取,而不为每个流创建一个线程,这似乎是在纯 Java 中执行此操作的唯一方法。由于这些流使用管道来回传递 I/O,我很惊讶.newChannel没有返回 a Pipe.SourceChannel,它是AbstractSelectableChannel.

我正在使用 Java 7(尽管如果 8 中有新功能,我仍然很乐意回答)。

编辑:我也尝试将结果投射.newChannel()到可选频道无济于事 - 它不是可选频道。

java nio

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

确保一个方法的调用堆栈始终包含Java中的另一个方法

我在我们的Java项目中使用的常见实用程序中存在设计问题,我希望确保特定方法A的所有调用者都被另一个方法B包装.我今天编写的这段代码的一般形式是:

x.B(new Runnable() {
    y.A();
});
Run Code Online (Sandbox Code Playgroud)

B执行的runnable可以有任意代码,并且可以多次调用A,所以我无法通过将A中的调用直接添加到B中来摆脱此代码中的runnable.此外,A是第三方代码,所以我们不能修改它.runnable可能会再次使用另一个嵌套的A调用来调用B,但是今天这种情况从未发生过,所以我现在可以忽略这种情况.

我看到几个选项:

  1. 声明A() throws BlahException并使其成为B是该异常的唯一捕手.这很难看,因为没有任何异常应该被抛出,但它很好,因为编译器会为我确保调用层次结构.
  2. 写一些静态分析工具来确保这个规则对我而言.我还没有调查过这个案例,因为它听起来比其他任何东西都要多(但也许有一个预先存在的工具可以做到这一点?).
  3. 添加一个断言到"A的开头"(实际上,这个代码必须存在于Runnble的自定义版本,因为我无法直接修改A)我们在调用B的内部运行.这可以使用一些额外的线程/对象本地状态或遍历调用堆栈本身,这两者都是丑陋的.

还有其他我没考虑过的选择吗?

java static-analysis call-hierarchy

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

用于删除重复代码的模式

我一直在研究的Java项目与几个RDBMS集成在一起.我们在处理它们的方式之间减少代码重复的最明显方法是创建类型层次结构,如:

               ThirdPartySoftware (superclass)
                      /|\
                     / | \
                 TPS1  2  3
Run Code Online (Sandbox Code Playgroud)

然而,这种方法最终导致TPS1,TPS2和TPS3的实现非常相似(但并不完全!).如果没有超类基本上意识到某些东西可能会有所不同,那么很难将所有功能都引入超类中,打败封装子类就意味着要购买我们.

我们考虑过的一种方法是通过它们共享的功能来表示数据库,例如"支持功能X"和"不能执行功能Y",但是并不完全清楚代码最终会以这种方式更易于维护,因为:

  1. 许多怪癖只适用于一个DB.
  2. 我们无法想到足够的共享/可比(基本上,可抽象)功能,以使这个值得.

有没有人有其他建议我们可以减少子类之间的代码重复,也许使用设计模式?

java oop design-patterns code-duplication

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

阻止mongodb接受非本地连接

我在一个不受信任的环境中运行MongoDB(运行单个mongod实例的机器上的所有内容都是可信的,其他一切都不是).因此,我只希望本地运行的东西连接到mongod实例.有没有办法阻止MongoDB接受任何远程连接,甚至更好,打开其他人可能尝试连接的端口?

如果这类问题的典型解决方案不是特定于MongoDB(即它依赖于操作系统配置),那么我正在运行*nix系统.

unix networking mongodb

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