我试图弄清楚当我们使用nio FileChannel
与普通FileInputStream/FileOuputStream
文件读取和写入文件系统时,性能(或优势)是否有任何差异.我观察到,在我的机器上,两者都在同一级别执行,也很多次FileChannel
都是慢一些.我可以了解比较这两种方法的更多细节.这是我使用的代码,我正在测试的文件是350MB
.如果我不是在查看随机访问或其他此类高级功能,那么对文件I/O使用基于NIO的类是一个不错的选择吗?
package trialjavaprograms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class JavaNIOTest {
public static void main(String[] args) throws Exception {
useNormalIO();
useFileChannel();
}
private static void useNormalIO() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
InputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
byte[] buf = new byte[64 * 1024];
int len = 0; …
Run Code Online (Sandbox Code Playgroud) 我在这里发现了类似的问题,但没有我满意的答案.所以再次重述这个问题 -
我有一项需要定期完成的任务(比如每隔1分钟).使用Timertask&Timer执行此操作的优势是什么,而不是创建一个具有无限循环睡眠的新线程?
使用timertask-的代码段 -
TimerTask uploadCheckerTimerTask = new TimerTask(){
public void run() {
NewUploadServer.getInstance().checkAndUploadFiles();
}
};
Timer uploadCheckerTimer = new Timer(true);
uploadCheckerTimer.scheduleAtFixedRate(uploadCheckerTimerTask, 0, 60 * 1000);
Run Code Online (Sandbox Code Playgroud)
使用Thread和sleep的代码片段 -
Thread t = new Thread(){
public void run() {
while(true) {
NewUploadServer.getInstance().checkAndUploadFiles();
Thread.sleep(60 * 1000);
}
}
};
t.start();
Run Code Online (Sandbox Code Playgroud)
如果逻辑执行时间超过间隔时间,我真的不必担心是否会错过某些周期.
请评论这个..
更新:
最近我发现使用Timer与Thread.sleep()之间存在另一个区别.假设当前系统时间是上午11:00.如果由于某种原因我们将系统时间回滚到上午10:00,则计时器将停止执行任务,直到它到达上午11:00,而Thread.sleep()方法将继续执行任务而不受阻碍.这可能是决定在这两者之间使用什么的主要决策者.
我正在使用Apache PDFBox java库来创建PDF.有没有办法使用pdfbox创建数据表?如果没有这样的API,我需要使用drawLine等手动绘制表格,有关如何进行此操作的任何建议吗?
请帮我解决kerberos + Java问题.我有一个简单的Java程序,可以使用Kerberos对Windows Active Directory进行身份验证.以下java代码工作正常没有任何问题,并打印真实 -
public class KerberosAuthenticator {
public static void main(String[] args) {
String jaasConfigFilePath = "/myDir/jaas.conf";
System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
System.setProperty("java.security.krb5.realm", "ENG.TEST.COM");
System.setProperty("java.security.krb5.kdc","winsvr2003r2.eng.test.com");
boolean success = auth.KerberosAuthenticator.authenticate("testprincipal", "testpass");
System.out.println(success);
}
}
Run Code Online (Sandbox Code Playgroud)
当我指定krb5.conf文件的路径而不是手动指定领域和kdc时,它会错误地说"Null领域名称(601) - 未指定默认领域".以下是代码 -
public class KerberosAuthenticator {
public static void main(String[] args) {
String jaasConfigFilePath = "/myDir/jaas.conf";
System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
String krb5ConfigFilePath = "/etc/krb5/krb5.conf";
System.setProperty("java.security.krb5.conf", krb5ConfigFilePath);
boolean success = auth.KerberosAuthenticator.authenticate("testprincipal", "testpass");
System.out.println(success);
}
}
Run Code Online (Sandbox Code Playgroud)
krb5.conf的内容如下 -
[libdefault]
default_realm = ENG.TEST.COM
[realms]
ENG.TEST.COM = {
kdc = winsvr2003r2.eng.test.com …
Run Code Online (Sandbox Code Playgroud) 以下代码用于使用Java + Kerberos对Windows AD服务器进行身份验证,并且它可以正常工作 -
public class KerberosAuthenticator {
public static void main(String[] args) {
String jaasConfigFilePath = "/myDir/jaas.conf";
System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
String krb5ConfigFilePath = "/etc/krb5/krb5.conf";
System.setProperty("java.security.krb5.conf", krb5ConfigFilePath);
boolean success = auth.KerberosAuthenticator.authenticate("testprincipal", "testpass");
System.out.println(success);
}
}
Run Code Online (Sandbox Code Playgroud)
以上只是一个测试程序.实际代码将在tomcat webapp中运行.我面临的问题是,如果krb5.conf文件发生变化,如果使用早期版本的krb5.conf成功进行了一次身份验证,那么tomcat中就不会反映出来.新的更改仅反映了tomcat的重启.
我想知道是否有一种方法可以指定JVM来重新加载krb5.conf,以便在不重新启动JVM的情况下获取最新的更改.
我正在使用Java + Spring框架来处理Web应用程序.我没有使用任何ORM工具.相反,我试图使用简单的DAO/DTO模式将db关系建模为Java对象.每当DTO完全对应于数据库中的单个表时,它就非常直接.但是如果有表使用外键引用其他表,我不确定这是什么最好的方法.在Stackoverflow中查找类似的答案,但找不到我的需求.我想举一个非常具体的例子 - 假设有两个实体User和Group.我有一个User DTO和Group DTO,每个都有UserDao(JdbcUserDao)和GroupDao(JdbcGroupDao).
现在我在DB中有一个连接用户和组的关系.一个用户可以属于多个组.表名是User_Group_Association,具有以下数据库定义:
user_id | GROUP_ID
这里user_id是引用用户表的外键.类似地,group_id指的是组表.当我用Java模拟这个DTO时,我应该这样做:
public class UserGroupAssoc {
private int userId;
private int groupId;
//Setters and getters follow
}
Run Code Online (Sandbox Code Playgroud)
或者它应该是这样的:
public class UserGroupAssoc {
private User user;
private Group group;
//Setters and getters follow
}
Run Code Online (Sandbox Code Playgroud)
特定UI用例:我想显示用户名及其所属的相应组名.像这样的东西 -
名称 - >组名
Keshav - > Admin,EndUser,ReportAdmin
Kiran - > ReportAdmin
Pranav - > EndUser
在第一种DTO设计方法中,我需要再次从DB中获取用户详细信息(名称)和组详细信息(名称).在第二种方法中,我需要在构建UserGroupAssoc对象本身时获取User和Group对象.
在第三种方法中,我可以按如下方式设计UserGroupAssoc DTO:
public class UserGroupAssoc {
private String userName;
private String groupName;
private int userId;
private int groupId;
//Setters …
Run Code Online (Sandbox Code Playgroud) 我在Tomcat 6服务器上运行了一个基于servlet的webapp.URL方案是HTTPS.整个网站目前正在通过HTTPS提供.但我真正想做的是仅针对某些操作(如购买和登录)设置HTTPS.Tomcat中是否有任何可以帮助我轻松完成此任务的配置?
是否需要对通过HTTPS和HTTP持久化会话进行任何代码更改?
我认为这可能是一个依赖浏览器的问题 - 假设我有10个Javascript文件和几个HTML页面.假设HTML pageA只需要JS1.js和JS3.js,类似HTML pageB需要JS4.js和JS1.js. 我想知道在所有HTML页面中包含所有10个javascript文件会有什么影响?它会直接与浏览器的内存消耗有关吗?
我特别使用YUI javascript库来解决这个问题.有几个组件,如数据表,事件,容器,日历,dom事件等,它们被包含的顺序似乎也很重要 - 例如dom-event js应该包含在其余部分之前才能工作.因此,为了避免所有这些混淆,我想到将所有这些js文件包含在一个包含在所有HTML页面中的头文件中.
我担心的是它可能导致的内存膨胀和性能问题.请提供相同的建议..
谢谢,-Keshav
我正在尝试将我的webapp日志记录到local4级别的syslog中.环境:Tomcat6,OpenSolaris,Struts2,log4j.我的log4j.properties的内容如下 -
log4j.rootLogger=INFO, SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%d [%t] %-5p - %m%n
log4j.appender.SYSLOG.Facility=local4
Run Code Online (Sandbox Code Playgroud)
我编辑了/etc/syslog.conf并在最后添加了以下行 -
local4.notice /var/log/mylog.log
Run Code Online (Sandbox Code Playgroud)
在此之后,我重新启动了syslog服务.当我从shell运行以下命令时,它会正确记录在/var/log/mylog.log中.这主要意味着系统日志服务正常运行 -
logger -i -p local4.notice -t "check log" "test message"
Run Code Online (Sandbox Code Playgroud)
但我完全不明白为什么来自webapp的日志永远不会到达/var/log/mylog.log.我的log4j配置对SysLogAppender是否正确?
当我尝试普通的appender,如"DailyRollingFileAppender"等,日志工作正常..但我只是无法让SyslogAppender工作..
谢谢!-Keshav
我有一个运行webapp的tomcat服务器.除此之外,还有另外两个运行批处理任务的JVM.Jamon是一种非常酷的监控性能,命中等方式,可以使用Jamonadmin.jsp(随jamon war文件提供)在网上查看.但我想从其他两个JVM聚合Jamon统计信息并显示在tomcat服务器VM上.
当我从tomcat询问时,我想到了两个VM上的每个端口都有一个响应序列化Jamon对象的端口.
Jamon API中是否存在任何此类功能?或任何建议来实现这一目标?
谢谢,
-Keshav
我尝试使用正则表达式编写Java程序来匹配模式并提取它.给定一个字符串,例如"这是一个链接 - #www.google.com#,这是另一个#google.com#",我应该可以获得#www.google.com#和#google.com#strings extract.这是我试过的 -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ParseLinks {
public static void main(String[] args) {
String message = "This is a link- #www.google.com# and this is another #google.com#";
Pattern p = Pattern.compile("#.*#");
Matcher matcher = p.matcher(message);
while(matcher.find()) {
String result = matcher.group();
System.out.println(result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这导致输出#www.google.com#,这是另一个#google.com#.但我想要的只是字符串#www.google.com#和#google.com#extracted.我可以为此了解正则表达式吗?
java ×9
jaas ×2
kerberos ×2
performance ×2
tomcat ×2
aggregation ×1
apache ×1
dto ×1
file ×1
graphics ×1
html ×1
https ×1
javascript ×1
jvm ×1
log4j ×1
monitoring ×1
nio ×1
object-model ×1
opensolaris ×1
operations ×1
optimization ×1
orm ×1
pdfbox ×1
regex ×1
servlets ×1
sleep ×1
struts2 ×1
syslog ×1
task ×1
timer ×1
web.xml ×1
while-loop ×1
yui ×1