小编Kes*_*hav的帖子

Java NIO FileChannel与FileOutputstream的性能/实用性

我试图弄清楚当我们使用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)

java optimization operations nio file

165
推荐指数
4
解决办法
11万
查看次数

Timer中的Timer&TimerTask与Thread + sleep

我在这里发现了类似的问题,但没有我满意的答案.所以再次重述这个问题 -

我有一项需要定期完成的任务(比如每隔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()方法将继续执行任务而不受阻碍.这可能是决定在这两者之间使用什么的主要决策者.

java sleep timer task while-loop

103
推荐指数
4
解决办法
10万
查看次数

Apache PDFBox Java库 - 是否有用于创建表的API?

我正在使用Apache PDFBox java库来创建PDF.有没有办法使用pdfbox创建数据表?如果没有这样的API,我需要使用drawLine等手动绘制表格,有关如何进行此操作的任何建议吗?

java apache graphics pdfbox

26
推荐指数
4
解决办法
3万
查看次数

Java和Kerberos身份验证krb5.conf与System.setProperty的对比

请帮我解决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 jaas

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

在JAVA中重新加载Kerberos配置而不重新启动JVM

以下代码用于使用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 tomcat kerberos jaas

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

设计具有外键关系的DTO

我正在使用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)

java orm dto object-model

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

仅对基于servlet的webapp中的某些页面使用HTTPS

我在Tomcat 6服务器上运行了一个基于servlet的webapp.URL方案是HTTPS.整个网站目前正在通过HTTPS提供.但我真正想做的是仅针对某些操作(如购买和登录)设置HTTPS.Tomcat中是否有任何可以帮助我轻松完成此任务的配置?

是否需要对通过HTTPS和HTTP持久化会话进行任何代码更改?

https tomcat web.xml servlets

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

包含在html页面中的Javascript文件 - 浏览器下面会发生什么?

我认为这可能是一个依赖浏览器的问题 - 假设我有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

html javascript performance yui

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

Tomcat6 webapp使用log4j进行日志记录,无法登录到syslog

我正在尝试将我的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

java log4j struts2 syslog opensolaris

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

Jamon统计信息聚合跨多个JVM

我有一个运行webapp的tomcat服务器.除此之外,还有另外两个运行批处理任务的JVM.Jamon是一种非常酷的监控性能,命中等方式,可以使用Jamonadmin.jsp(随jamon war文件提供)在网上查看.但我想从其他两个JVM聚合Jamon统计信息并显示在tomcat服务器VM上.

当我从tomcat询问时,我想到了两个VM上的每个端口都有一个响应序列化Jamon对象的端口.

Jamon API中是否存在任何此类功能?或任何建议来实现这一目标?

谢谢,
-Keshav

java performance monitoring jvm aggregation

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

Java正则表达式匹配模式并提取它们

我尝试使用正则表达式编写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 regex

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