是否可以从Java文件中读取不同的属性组,而无需手动处理?
"手动"是指逐行读取文件,检测属性组的起始位置,然后提取相应的键值对.实际上,这意味着重新发明(大部分)Properties.load()方法所构成的轮子.
从本质上讲,我正在寻找一种简单的方法,从单个文件中读取多组属性,每个组都是可识别的,这样它就可以加载到自己的Java Properties对象中.
假设具有多个连续键值对的单行字符串,由空格分隔,但也允许在值内(不在键中)允许空格,例如
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中获得一个简单正则表达式的每个重复匹配:
(\\[[^\\[]*\\])*
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可以用作通用回调机制的首选接口或类似模式?
例如,它可能是类似的东西
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类并不方便,因为它不是绕过单一继承的接口,它承载的功能比上面简单的场景中实际需要的功能要多.
有没有办法动态更改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 Pattern该类的标准实现使用递归来实现许多形式的正则表达式(例如,某些运算符,交替).
这种方法导致堆栈溢出问题,输入字符串超过(相对较小)长度,甚至可能不超过1,000个字符,具体取决于所涉及的正则表达式.
一个典型的例子是以下正则表达式,使用交替Data从周围的XML字符串中提取可能的多行元素(命名),该字符串已经提供:
<Data>(?<data>(?:.|\r|\n)+?)</Data>
Run Code Online (Sandbox Code Playgroud)
上面的正则表达式用于Matcher.find()读取"数据"捕获组并按预期工作的方法,直到提供的输入字符串的长度超过1,200个字符左右,在这种情况下,它会导致堆栈溢出.
是否可以重写上述正则表达式以避免堆栈溢出问题?
在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 最大内存?
这是永久的“如果或转换”困境的变体......
考虑一个使用静态方法的多线程应用程序,该方法包含一个长(十几个条件)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应用程序,它使用类的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个问题
java ×10
regex ×2
akka ×1
bigdecimal ×1
callback ×1
compareto ×1
enums ×1
generics ×1
heap-memory ×1
hocon ×1
jvm ×1
key-value ×1
keyvaluepair ×1
kubernetes ×1
load ×1
logging ×1
matcher ×1
matching ×1
newrelic ×1
properties ×1
repeat ×1
scala ×1
value-of ×1