我有以下问题:我有非常大的XML文件(如300+ Megs),我需要解析它们以便将一些值添加到数据库中.这些文件的结构也非常复杂.我想使用Stax Parser,因为它提供了一次拉解析(并因此处理)XML文件的一部分的可能性,因此不会将整个内容加载到内存中,但另一方面获取值Stax(至少在这些XML文件上)很麻烦,我需要编写大量代码.从后一种观点来看,如果我可以将XML文件编组为Java对象(就像JAX-B那样),那将对我有所帮助,但是这会将整个文件加上大量的Object实例同时加载到内存中.
我的问题是,有没有办法按顺序解析(或只是部分解析)文件,然后只将那些部分编组到Java对象中,这样我就可以轻松处理它们而不会让内存陷入困境?
我有一个"枚举"声明如下:
var PlaceType = {
PASSABLE_TERRAIN: 1,
IMPASSABLE_TERRAIN: 0,
SOMEWHAT_PASSABLE_TERRAIN: 2,
PATH: 3
};
Run Code Online (Sandbox Code Playgroud)
和一个声明如下的函数:
setPlaceType(placeType) {
this.clear = false;
this.placeType = placeType;
alert("before switch "+(PlaceType.SOMEWHAT_PASSABLE_TERRAIN==this.placeType));
switch(this.placeType) {
case PlaceType.PASSABLE_TERRAIN: {
alert("Case PASSABLE");
break;
}
case PlaceType.IMPASSABLE_TERRAIN: {
alert("Case IMPASSABLE");
break;
}
case PlaceType.SOMEWHAT_PASSABLE_TERRAIN: {
alert("Case SOMEWHAT_PASSABLE");
break;
}
case PlaceType.PATH: {
alert("Case PATH");
break;
}
default: {
alert("case default");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它:
setPlaceType(1);
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:"在切换为true之前","case default"
如果我这样称呼它:
setPlaceType(2);
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:"在切换错误之前","大小写默认"
换句话说,使用正确的参数调用函数,当执行(在我看来)与开关相同的比较时,通过"=="我得到正确的行为,但是开关永远不会匹配值在适当的情况下.有人知道为什么吗?
我想知道为什么当我使用匿名instanciation和实例初始化程序块时,我得到一个"可序列化的类不会声明类型为long的静态最终serialVersionUID字段"编译时警告.
这就是我的意思.假设我想实例化一个ArrayList,同时向它添加一些内容,如下所示:
ArrayList<Object> arrayList = new ArrayList<Object>(){{add(new Object());}};
Run Code Online (Sandbox Code Playgroud)
如果我编译这一切都没问题,但我得到serialVersionUID字段缺少警告.现在ArrayList已经实现了serializable并且有一个private static final long serialVersionUID
如此,为什么当我使用它时,似乎该字段"消失"并且我收到警告没有声明它?
我制作了一个简单的程序来创建一个Ortho透视图,然后在四边形上放置一个包含png的纹理但是,我无法弄清楚为什么有些颜色会显示为混乱.
png看起来像这样(中间的白色矩形是透明的):
我的OpenGL程序中的四边形如下所示:
下面是初始化OpenGL的代码以及OpenGL线程调用的方法中的内容.我正在使用JOGL.
public void init(GLAutoDrawable gLDrawable) {
gl.glGenTextures(1, textureId, 0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId[0]);
gl.glTexParameterf(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST);
gl.glTexParameterf(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
gl.glTexParameterf(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_REPEAT);
gl.glTexParameterf(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_REPEAT);
BufferedImage image = null;
try {
image = ImageIO.read(new File("d:\\temp\\projects\\openglTest1\\texTest.png"));
} catch (IOException e1) {e1.printStackTrace();}
DataBufferByte dataBufferByte = (DataBufferByte) image.getRaster().getDataBuffer();
Buffer imageBuffer = ByteBuffer.wrap(dataBufferByte.getData());
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL2.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL2.GL_RGBA, GL.GL_UNSIGNED_BYTE, imageBuffer);
gl.glEnable(GL2.GL_TEXTURE_2D);
gl.glBlendFunc(GL2.GL_ONE, GL2.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL2.GL_BLEND_SRC);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
}
//this is called by the OpenGL Thread …
Run Code Online (Sandbox Code Playgroud) 到目前为止,我的平均类包含大约500行代码和大约50种方法.IDE是Eclipse,我在其中转为"保存操作",以便按字母顺序排序方法,首先是公共方法,然后是私有方法.要在代码中找到任何特定方法,我使用"快速大纲".如果需要,"Open Call Hierarchy"显示逐个调用的方法序列.
这种方法具有以下优点:
但是有一些缺点:
当将大型方法重构为较小的方法时,我不太满意新的私有方法被放置在代码的不同部分,因此遵循代码概念有点困难.为了避免这种情况,我以一种奇怪的方式命名它们以使它们靠近每一个,例如:showPageFirst(),showPageSecond()而不是showFirstPage(),showSecondPage().
可能有更好的方法吗?
我在Windows 7下使用Eclipse Juno for c/c ++.我创建了一个共享库项目和一个可执行项目.我已经通过以下方式在可执行项目中添加了共享库项目作为参考:
可执行项目的属性 - > C/C++常规 - >路径和符号 - >引用 - >检查共享库项目
所有这些在编译时都很有用,我可以在可执行项目中包含我的共享库项目的类,并使用它等.
但是,当我尝试在Eclipse中运行可执行项目时,我什么也得不到.没有错误,没有控制台输出.经过一些谷歌搜索后,我发现了类似的问题:
http://www.eclipse.org/forums/index.php/m/650331/
如上所述,显然将共享库项目添加到Eclipse中的可执行项目中,也不会在Eclipse内部运行时将dll文件添加到可执行(.exe)文件的PATH中.与Eclipse for Java类比:如果你有一个Java JAR项目A和另一个Java JAR项目B,通过在Eclipse中从B到A的引用,在Eclipse中运行项目A时,B的编译jar文件被添加到A的类路径中.我认为它与Eclipse的C/C++类似,但显然不是.
果然,如果我手动获取.exe文件和.dll文件,将它们放在同一个文件夹中并运行.exe,一切正常.此外,如果我将.dll文件复制到Eclipse的可执行项目的编译目录中,我可以从Eclipse运行可执行项目,这没关系.
我的问题是,当我告诉它运行可执行项目时,有没有办法让Eclipse将该共享库项目的dll文件添加到运行时?我在上面链接的帖子中讨论的解决方案是手动将shard库项目的编译目录添加到Eclipse的可执行项目的运行配置中,即将其添加到PATH变量.但我觉得这很麻烦且不可移植,如果Eclipse管理这两个项目,它应该能够将所有必要的内容传递给运行时.
我有以下内容:
在Solr索引的43份文件
如果我使用Java API进行查询而不进行任何分组,例如:
SolrQuery query = new SolrQuery("*:*");
query.setRows(10);
Run Code Online (Sandbox Code Playgroud)
然后,我可以获得匹配元素的总数,如下所示:
solrServer.query(query).getResults().getNumFound(); //43 in this case
Run Code Online (Sandbox Code Playgroud)
该getResults()
方法返回SolrDocumentList
包含此值的实例.
但是,如果我使用分组,例如:
query.set("group", "true");
query.set("group.format", "simple");
query.set("group.field", "someField");
Run Code Online (Sandbox Code Playgroud)
然后上面的代码检索查询结果没有loger工作(抛出NPE),我不得不使用:
List<GroupCommand> groupCommands = solrServer.query(query).getGroupResponse().getValues();
List<Group> groups = groupCommand.getValues();
Group group = groups.get(groupIndex);
Run Code Online (Sandbox Code Playgroud)
我不明白如何使用API的这一部分来获取匹配文档的总数(上面的非分组查询中的43).首先,我认为与分组不再可能得到,但我已经注意到,如果我做的Solr管理控制台类似的查询,使用相同的分组和一切,它返回的确切相同的结果的Java API 和也 numFound=43
.很明显,即使使用分组,用于控制台的代码也可以通过某种方式检索该值:
我的问题是,如何使用Solr Java API执行分组来获取查询的匹配文档总数?
我有一个基本问题:
在使用JUnit时,在测试套件(包含测试的类)中,您可以使用@BeforeClass和@AfterClass声明套件级初始化和cleanUp行为.如此注释的方法在套件开始之前和套件完成其所有测试之后被调用.这与套件内部的方法不同,后者使用@Before和@After进行注释,在每次测试启动之前和每次测试完成之后调用它们.
我希望在Fitnesse中使用相同的设置.我发现了如何在每次测试之前和之后执行的操作(在套件中创建一个SetUp页面和一个TearDown页面,它们将在套件中的每个测试之前和之后调用).这些相当于JUnit中的@ Before和@After.但我无法理解如何声明套件级初始化和cleanUp逻辑(如JUnit中的@BeforeClass和@AfterClass).有人可以告诉我是否/如何实现这一目标?
我试过的是有一个带有SetUp和TearDown页面的父套件,INSIDE那个父套件有mutlipl子套件,里面包含实际的测试(每个套件都有自己的SetUp和TearDown),希望通过这种方式设置父套件SetUp和TearDown页面将在每个子套件之前和之后调用,子套件的SetUp和TearDown页面将在套件中的每个测试之前和之后调用,但没有骰子,这里发生的是子套件SetUp/TearDown覆盖父套件那些.
我有一个简单的Play应用程序用于测试.我有2个控制器,一个是显示条目列表的"ListController".每个条目都有一个"编辑"链接,转到"EditController"."EditController"将html表单与条目的现有数据一起显示,并且"提交"按钮将该数据发布到"EditController"中的另一个方法,该方法将数据保存到db并重新显示表单中新修改的数据.这一切都运转正常.但是,当我在返回列表时修改一个条目(在编辑页面中正确地重新显示)时,该条目仍然具有旧值,并且编辑它仍然使用旧值显示它.这在测试和开发环境中都会发生.
这是我的设置:
@OnApplicationStart
注释的BootStrap类从data.yml文件初始化数据测试环境配置为:
%test.db的= FS
%test.jpa.ddl =创建
DB = Postgres的:// Postgres的:postgre @本地:5432 /播放
ListController:
清单LaundryLists = LaundryList.findAll();
-EditController
LaundryList updatedLaundryList = LaundryList.em().merge(laundryList);
Run Code Online (Sandbox Code Playgroud)
我已经添加了日志输出,当然,在merge
EditController中调用方法后,即使我添加代码从数据库中检索更新的实体,它也会返回一个bean,其中包含正确更新的值,例如我如何插入它们
但是,即使在此之后,在测试(播放测试)或运行(播放运行)环境中,一旦我为ListCOntroller重新键入(或单击链接),它仍然显示(据称)已修改的条目及其在更新之前的值发生在EditController中.如果我再次单击进行编辑,表单会向我显示该条目的初始未修改数据.
我的问题是,我应该怎么做才能将数据保存到数据库中?
Solr 4.x具有这个不错的新功能,可让您指定在对现有文档进行更新时如何更新multiValued字段.具体来说,您可以说更新文档是否将使用新值替换多值字段的旧值,或者是否应将新值附加到现有值.
我已经使用请求处理程序尝试了这个,如下所述:
http://wiki.apache.org/solr/UpdateXmlMessages#Optional_attributes_for_.22field.22
我使用curl发送xml,其中一些字段使用了该update=add
选项:
<field name="skills" update="add">Python</field>
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
但是我无法知道如何使用Java API(SolrJ).
如果我做这样的事情:
SolrInputDocument doc1 = new SolrInputDocument();
doc1.setField("ID_VENTE", "idv1");
doc1.setField("FACTURES_PRODUIT", "fp_initial");
solrServer.add(doc1);
solrServer.commit();
SolrInputDocument doc2 = new SolrInputDocument();
doc2.setField("ID_VENTE", "idv1");
doc2.setField("FACTURES_PRODUIT", "fp_2");
solrServer.add(doc2);
solrServer.commit();
Run Code Online (Sandbox Code Playgroud)
字段"FACTURES_PRODUIT"的值变为"fp_2"(初始值丢失).我也尝试过:
doc2.addField("FACTURES_PRODUIT", "fp_2");
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.我也查看了SolrInputField类,但没有找到类似的东西.
所以,我的问题是,如何通过附加(而不是替换)新值来使用Solr 4 Java API将值更新到multiValued字段?