小编PNS*_*PNS的帖子

从文件中读取Java属性组

是否可以从Java文件中读取不同的属性组,而无需手动处理?

"手动"是指逐行读取文件,检测属性组的起始位置,然后提取相应的键值对.实际上,这意味着重新发明(大部分)Properties.load()方法所构成的轮子.

从本质上讲,我正在寻找一种简单的方法,从单个文件中读取多组属性,每个组都是可识别的,这样它就可以加载到自己的Java Properties对象中.

java load properties

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

正则表达式提取由空格分隔的键值对,值为空格

假设具有多个连续键值对的单行字符串,由空格分隔,但也允许在值内(不在键中)允许空格,例如

key1=one two three key2=four key3=five six key4=seven eight nine ten
Run Code Online (Sandbox Code Playgroud)

从上面正确提取键值对将产生以下映射:

"key1", "one two"
"key2", "four"
"key3", "five six"
"key4", "seven eight nine ten"
Run Code Online (Sandbox Code Playgroud)

其中"keyX"可以是任何字符序列,不包括空格.

尝试一些简单的事情,比如

([^=]+=[^=]+)+
Run Code Online (Sandbox Code Playgroud)

或类似的变化是不够的.

是否有正则表达式来完全处理这种提取,没有任何进一步的字符串处理?

java regex key-value keyvaluepair

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

Java重复模式匹配

我试图在Java中获得一个简单正则表达式的每个重复匹配:

(\\[[^\\[]*\\])*
Run Code Online (Sandbox Code Playgroud)

它匹配[]中包含的任何字符串,只要它不包含[字符.例如,它会匹配

[a][nice][repetitive][pattern]
Run Code Online (Sandbox Code Playgroud)

先前没有关于存在多少这样的组的知识,我找不到通过模式匹配器访问各个匹配组的方法,即无法获得

[a], [nice], [repetitive], [pattern]
Run Code Online (Sandbox Code Playgroud)

(或者更好的是,没有括号的文本),有4种不同的字符串.

使用pattern.matcher()我总是得到最后一组.

当然,必须有一种简单的方法在Java中实现这一点,我错过了吗?

谢谢你的帮助.

java design-patterns repeat matching

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

新的遗物记录机制

是否有人在生产环境中使用New Relic进行应用程序或服务器监控?它似乎与Pingdom和Zabbix属于同一类.

更具体地说,New Relic生产什么样的日志?其相关文档部分没有多说.他们是使用(或兼容)第三方工具(例如,Apache Log4J),还是他们有自己的日志格式和模式?

如果此工具有任何开源日志示例,请提供指针.

java logging newrelic

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

Java中的通用回调

什么应该是Java可以用作通用回调机制的首选接口或类似模式?

例如,它可能是类似的东西

public interface GenericCallback
{
    public String getID();
    public void callback(Object notification);
    // or public void callback(String id, Object notification);
}
Run Code Online (Sandbox Code Playgroud)

覆盖hashCode()方法的情况下需要ID,以便被调用者识别调用者.

类似于上述的模式对于需要向条件(例如,处理结束)生成的类报告的对象是有用的.

在这种情况下,"父"类将使用getID()每个GenericCallback对象的方法来跟踪它们,Map<String, GenericCallable>并根据收到的通知添加或删除它们.

此外,如何实际命名这样的接口?

许多人似乎更喜欢Java Observer模式,但是在那里定义的Observable类并不方便,因为它不是绕过单一继承的接口,它承载的功能比上面简单的场景中实际需要的功能要多.

java generics callback

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

类型安全配置 - 从程序设置占位符值

有没有办法动态更改Typesafe 配置文件的字段,使用源代码填充占位符?

例如,假设以下简单配置语句

{
  values {
    string1: ${name1}
    string2: ${name2}
    string3: ${name3}
    string4: ${name4}
  }
}
Run Code Online (Sandbox Code Playgroud)

正如HOCON文档中讨论的以及早期 StackOverflow 问题中提到的,可以使用环境变量和系统属性来实现这一目标。

是否也可以直接从程序中执行相同的操作?例如,在 中Java,有一个Constants类似的类

public class Constants
{
  public static final String name1 = "A";
  public static final String name2 = "B";
  public static final String name3 = "C";
  public static final String name4 = "D";
}
Run Code Online (Sandbox Code Playgroud)

并填充该类的配置字段?

HOCON允许Java在配置文件中集成和执行代码,但显然无法从集成Java代码中设置配置占位符。

java scala akka typesafe-config hocon

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

用于匹配开始/结束标记的Java正则表达式会导致堆栈溢出

Java Pattern该类的标准实现使用递归来实现许多形式的正则表达式(例如,某些运算符,交替).

这种方法导致堆栈溢出问题,输入字符串超过(相对较小)长度,甚至可能不超过1,000个字符,具体取决于所涉及的正则表达式.

一个典型的例子是以下正则表达式,使用交替Data从周围的XML字符串中提取可能的多行元素(命名),该字符串已经提供:

<Data>(?<data>(?:.|\r|\n)+?)</Data>
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式用于Matcher.find()读取"数据"捕获组并按预期工作的方法,直到提供的输入字符串的长度超过1,200个字符左右,在这种情况下,它会导致堆栈溢出.

是否可以重写上述正则表达式以避免堆栈溢出问题?

java regex stack-overflow matcher pattern-matching

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

Kubernetes 和 JVM 内存设置

Kubernetes具有众多微服务的集群中,其中一个专门用于Java Virtual Machine运行Java 1.8数据处理应用程序的(JVM)。

直到最近,在该 JVM pod 中运行的作业消耗的 RAM 还不到 1 GB,因此 pod 的最大内存设置为 4 GB,没有为 JVM 设置任何明确的堆大小。

一些新数据现在整个 pod 需要大约 2.5 GB 的空间,包括 JVM(如kubernetes top命令所报告的,在启动后内存限制增加到 8 GB),但是 pod 在以 4 GB 的限制启动后很快崩溃。

使用-Xms256m -Xmx3072m限制为 4 GB的磁头大小范围并不能解决问题。事实上,现在 pod 甚至还没有启动。

有没有办法参数化 JVM 以适应所需的 2.5 GB,而不增加 pod 的 4 GB 最大内存?

java jvm memory-management heap-memory kubernetes

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

枚举 valueOf() 的线程安全

这是永久的“如果或转换”困境的变体......

考虑一个使用静态方法的多线程应用程序,该方法包含一个长(十几个条件)if语句,该语句检查对象的类型并相应地返回一个值,即类似

public static String checkType(Class<?> type)
{
    if (type == A.class)
    {
        return aString;
    }
    else if (type == B.class)
    {
        return bString;
    }
    ...
    else if (type == z.class)
    {
        return zString;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然 switch 语句在这里不能直接适用,所以一个常见的模式是有一个enum并调用它的valueOf(),即做类似的事情

public enum Strings
{
    A(aString), B(bString), ..., Z(zString)

    private final String value;

    private Strings(String value)
    {
        this.value = value;
    }

    public String value()
    {
        return this.value;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,checkType()可以改写为

public static …
Run Code Online (Sandbox Code Playgroud)

java enums thread-safety value-of

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

BigDecimal compareTo()线程安全

我有一个Java应用程序,它使用类的compareTo()方法BigDecimal来根据类型(基本上,"太大",双重或浮动)对(大)实数进行分类,读取为字符串.应用程序每秒读取大量此类字符串,因此任何性能优化都是必不可少的.

以下是代码的缩写摘录:

static final BigDecimal MAX_LONG    = new BigDecimal(Long.MAX_VALUE);
static final BigDecimal MAX_FLOAT   = new BigDecimal(Float.MAX_VALUE);
static final BigDecimal MAX_DOUBLE  = new BigDecimal(Double.MAX_VALUE);

String value = readValue(); // Read the number as a string

BigDecimal number = new BigDecimal(value);

if (number.compareTo(MAX_DOUBLE) > 0)
{
    ...
}
else if (number.compareTo(MAX_FLOAT) > 0)
{
    ...
}
else if (number.compareTo(MAX_LONG) > 0)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

那么,2个问题

  1. 在多线程环境中,进行上述比较(给定静态字段)是否安全?
  2. 是否有任何线程安全和更快的方式来实现上述分类?

java thread-safety bigdecimal compareto

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