今天,其他一些开发人员发现了一个带有一些有趣嵌套的XML模式,JAXB编译成这样的结构:
public class Choices
{
public static class Choice
{
public static class Choice
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试编译它,Java编译器说,
class Choices.Choice is already defined in class Choices
Run Code Online (Sandbox Code Playgroud)
当然,最内层class Choice
声明的下划线.
但我说,上课Choices.Choice
不是它试图宣布的.相反,它试图宣布Choices.Choice.Choice
,这将是一个不同的阶级.
有趣的是,这很好:
public class OuterClass
{
public static class Inner1
{
public static class Inner2
{
}
}
public static class Inner2
{
public static class Inner1
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是这被禁止了:
public class OuterClass
{
public static class Inner1
{
public static class Inner2 …
Run Code Online (Sandbox Code Playgroud) 我们有一个主进程写入日志的情况。
然后它产生多个写入自己日志的工作进程。(我希望工人通过 master 登录,但由于某种原因,这个想法遭到了抵制。)
我想知道的是,我可以相信最终出现在多个文件中的时间戳彼此一致吗?即,如果我将日志文件合并到一个按即时排序的单个文件中,事件的顺序是否正确?跨所有可能的操作系统?
我问这个的原因是我有一个奇怪的情况,在主进程报告工作进程有错误后两秒钟,工作进程似乎记录了错误。就好像师父能够预知未来。(我猜主人也是时间领主,但是呃……)
我的应用程序中有一个文本字段.尽管它是一个文本字段,但用户有时会在其中粘贴大量文本.此外,问题的其他功能也设置了大量.
有时文本太多,JVM在fontmanager.dll中获取访问冲突.Oracle似乎没有兴趣修复问题本身,所以我想至少试图避免它.
限制用户输入的文本量显然是不可接受的(否则这将是最明显的解决方案)但允许设置然后禁用文本字段是可以接受的.当文本绑定回模型时,它应该再次包含全文.
由于这本身就是视图中的一个错误,我认为修复应该在视图中,而不是在模型中解决它并在那里添加其他属性.
我的第一次尝试是这样的:
public class LimitedTextField extends JTextField {
static final int LIMIT = 10000;
private String fullString;
@Override
public void setText(String text) {
if (text != null && text.length() > LIMIT) {
fullString = text;
setEnabled(false);
} else {
fullString = null;
super.setText(text);
setEnabled(true);
}
}
@Override
public String getText() {
if (fullString != null) {
return fullString;
} else {
return super.getText();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这确实传递了天真的单元测试,但是一旦我为BeansBinding编写了一个额外的测试,我发现它不起作用,因为BeansBinding不绑定到text属性,而是绑定到Document,模拟文本属性.所以实际上getText()总是在该测试中返回一个空字符串.
我现在正在尝试制作一个可以实现我想要的文档实现,但在文档级别做这种技巧肯定不容易.我可以看到它拥有的所有方法,但是我无法找到一种限制文本的好方法,而不会在调用getText()时使该文本不可用.
我遇到的一些 XML 文件未能通过格式良好的 XML 检查,即使它在我看来格式良好(我可能错了。)
我把它简化为一个简单的例子:
<?xml version="1.0" encoding="Cp1252"?>
<jnlp/>
Run Code Online (Sandbox Code Playgroud)
用于进行检查的方法如下所示:
public static boolean isWellFormedXml(InputStream inputStream) {
try {
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_COALESCING, false);
inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
XMLStreamReader reader = inputFactory.createXMLStreamReader(stream);
try {
// Scan through all the reader tokens to ensure everything is well formed
while (reader.hasNext()) {
reader.next();
}
} finally {
reader.close();
}
} catch (XMLStreamException e) {
// Ignore the exception
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我看到的错误是:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,40]
Run Code Online (Sandbox Code Playgroud)
消息:无效的编码名称“Cp1252”。
唯一的问题是 - 我可以在捕获处断点并确认此编码名称 …
如果我以一个完整的日语句子开头并通过MeCab运行它,则会得到以下内容:
$ echo "???????" | mecab
?? ??,???,??,*,*,*,??,????,????
? ??,???,*,*,*,*,?,?,?
? ??,??,*,*,*,*,?,??,??
? ???,*,*,*,????,???,?,?,?
?? ???,*,*,*,???????,???,??,??,??
EOS
Run Code Online (Sandbox Code Playgroud)
如果将从上一列中获得的所有内容粉碎在一起,则会得到“ ??????????”,然后可以将其输入语音合成程序并获得输出。但是,该程序无法处理英语单词。
我把英语扔进MeCab中,它设法将它标记化(可能是天真地在空格处),但是却没有阅读:
$ echo "I am a cat" | mecab
I ??,????,??,*,*,*,*
am ??,??,*,*,*,*,*
a ??,??,*,*,*,*,*
cat ??,????,??,*,*,*,*
EOS
Run Code Online (Sandbox Code Playgroud)
即使它们不是完美的,我也希望获得这些读数,以便我可以从“ ?????????”的角度获得一些东西。
我已经在网上搜寻解决方案,尽管我确实找到了许多看起来音译足够的网站,但是我找不到自己的代码来做这件事的任何方法。在某些情况下,我通过电子邮件向网站作者发送了电子邮件,但等待了几周后仍未得到任何回复。(这些人在他们的收件箱中仅落后多远?)
我可以走很多路,但是到目前为止,我都走了一条路,这是我的复合问题:
顺便说一句,我发现软件“ VOICEROID” 可以说英语文本(很差,但足以满足我的目的)。该软件也使用MeCab(或安装中至少包含其DLL和字典文件。)它还使用另一个库Cabocha,据我所知,运行该库与MeCab完全相同。可能是针对这两个库中的任何一个使用自定义词典来完成这项工作,或者可能要在它们使用的专有AITalk库中执行代码。需要做更多的研究,我还没有弄清楚如何对他们的词典运行这两种工具来直接对其进行测试。
我们正在使用 Derby 并且有很多这样的代码:
try (ResultSet rs = executeQuery(...)) {
if (rs.next()) {
updateRowSet(rs, ...);
rs.updateRow();
} else {
executeUpdate(...);
}
}
Run Code Online (Sandbox Code Playgroud)
过去,我们正在寻找一种方法来在服务器端执行此逻辑,并且发现某些数据库支持“更新插入”(更新或插入)操作。Derby 有一个功能请求,MERGE INTO
据说这是执行此操作的 SQL:2003 标准方式,因此我们坐下来观看了票证,时间过去了很多。
德比 10.11 终于加入了MERGE INTO
。没有人有时间仔细阅读并更新代码以使用它,但是在阅读他们的文档时,他们的所有示例都显示从一张表合并到另一张表。但是等一下,我们的数据还没有在表中!
我知道我可以把它放在一个表中,但是它又是多个查询,这完全违背了使用它的意义。
我确信可以在不将其放入表格的情况下完成此操作,但由于文档没有显示单个示例,因此我不确定如何进行。
这是我一直在尝试的:
try (PreparedStatement ps = connection.prepareStatement(
"MERGE INTO things AS target " +
// Awkward point 1:
// It wants a "source" table, but I don't have one.
// So I thought I would try to use the same table …
Run Code Online (Sandbox Code Playgroud) Java 9 将最终阻止我们使用 sun 内部类。
我们仍然拥有的一种这样的用法如下:
import sun.net.www.protocol.http.AuthCache;
import sun.net.www.protocol.http.AuthCacheValue;
public static void authenticationHacks() {
AuthCacheValue.setAuthCache(new NullAuthCache());
}
//...
class NullAuthCache implements AuthCache {
@Override
public void put(String s, AuthCacheValue authCacheValue) {
}
@Override
public AuthCacheValue get(String s, String s1) {
return null;
}
@Override
public void remove(String s, AuthCacheValue authCacheValue) {
}
}
Run Code Online (Sandbox Code Playgroud)
有没有公共替代品?
就 XY 问题的 X 而言,这是在单个应用程序中运行的多个用户的解决方法,该应用程序使用java.net.URL
. 如果您不执行此 hack,第一个成功通过身份验证的用户的凭据将被保留并传递给其他服务器以用于实际属于不同用户的请求。
如果有其他方法可以做到这一点,我想知道。我认为这是 JRE 中的一个错误,所以如果他们从那时起修复了它,那也很高兴知道。
作为手头问题的一个示例,仅使用公开可用的 API,您会遇到以下问题:
public class AuthenticationLeakBugDemo {
public static void main(String[] args) throws Exception …
Run Code Online (Sandbox Code Playgroud) 举个这样的例子:
public List<CloseableThing> readThings(List<File> files) throws IOException {
ImmutableList.Builder<CloseableThing> things = ImmutableList.builder();
try {
for (File file : files) {
things.add(readThing(file))
}
return things.build();
} catch (Throwable t) {
for (CloseableThing thing : things.build()) {
thing.close();
}
throw t;
}
}
Run Code Online (Sandbox Code Playgroud)
代码审查评论的出现是因为通常有一条规则不会捕获Throwable.进行此类仅故障清理的旧模式是:
public List<CloseableThing> readThings(List<File> files) throws IOException {
ImmutableList.Builder<CloseableThing> things = ImmutableList.builder();
boolean success = false;
try {
for (File file : files) {
things.add(readThing(file))
}
success = true;
return things.build();
} finally {
if (!success) {
for (CloseableThing …
Run Code Online (Sandbox Code Playgroud) 我们有一些像这样的现有代码:
DateFormat[] dateFormats = {
new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH),
new SimpleDateFormat("d MMM yyyy HH:mm:ss Z", Locale.ENGLISH)
};
Run Code Online (Sandbox Code Playgroud)
出于线程安全的原因,我尝试将其转换为使用Joda Time的格式化程序,因此:
DateTimeFormatter[] dateFormats = {
DateTimeFormat.forPattern("EEE, d MMM yyyy HH:mm:ss Z")
.withLocale(Locale.ENGLISH)
.withOffsetParsed(),
DateTimeFormat.forPattern("d MMM yyyy HH:mm:ss Z")
.withLocale(Locale.ENGLISH)
.withOffsetParsed()
};
Run Code Online (Sandbox Code Playgroud)
但是,我发现现有的测试案例已经破裂,这令我感到惊讶.特别是(至少导致测试失败的第一行):
String dateString = "Wed, 1 Feb 2006 21:58:41 +0000";
Run Code Online (Sandbox Code Playgroud)
DateFormat愉快地匹配逗号后面的两个或多个空格,但DateTimeFormatter只按字面意思匹配单个空格.
我可能会添加一个额外的格式,允许额外的空间,但是这样做有点可怕,那么是否有一些方法可以自定义DateTimeFormatter以使空格更加轻松?
给定一个像这样的源文件目录:
tester$ ls -l src
-rw-r--r-- 1 tester staff 0 24 Feb 11:28 File 1.txt
-rw-r--r-- 1 tester staff 0 24 Feb 11:28 File 2.txt
-rw-r--r-- 1 tester staff 0 24 Feb 11:28 File 3.txt
-rw-r--r-- 1 tester staff 0 24 Feb 11:30 FileFalse 1.txt
-rw-r--r-- 1 tester staff 0 24 Feb 11:30 FileFalse 2.txt
-rw-r--r-- 1 tester staff 0 24 Feb 11:30 FileFalse 3.txt
Run Code Online (Sandbox Code Playgroud)
我可能会尝试使用以下方法将它们全部复制到另一个位置fileset
:
<project name="test" default="copy">
<target name="copy">
<mkdir dir="build"/>
<copy todir="build">
<fileset dir="src" includes="File …
Run Code Online (Sandbox Code Playgroud)