Java™ 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成。如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 —— 比如在面向服务架构(SOA)和基于云的系统中。但是,如果在使用时未注意某些事项,则 JNI 会迅速导致应用程序性能低下且不稳定。本文将确定 10 大 JNI 编程缺陷,提供避免这些缺陷的最佳实践,并介绍可用于实现这些实践的工具。
Java 环境和语言对于应用程序开发来说是非常安全和高效的。但是,一些应用程序却需要执行纯 Java 程序无法完成的一些任务,比如:
* 与旧有代码集成,避免重新编写。
* 实现可用类库中所缺少的功能。举例来说,在 Java 语言中实现 ping 时,您可能需要 Internet Control Message Protocol (ICMP) 功能,但基本类库并未提供它。
* 最好与使用 C/C++ 编写的代码集成,以充分发掘性能或其他与环境相关的系统特性。
* 解决需要非 Java 代码的特殊情况。举例来说,核心类库的实现可能需要跨包调用或者需要绕过其他 Java 安全性检查。
JNI ......
得到filesystem的实例
有两个静态方法可以得到filesystem接口的实例
public static FileSystem get(Configuration conf) throws IOException
public static FileSystem get(URI uri, Configuration conf) throws IOException
第一个方法得到缺省的文件系统,具体由配置文件的fs.default.name属性决定。
第二个方法由URI的前缀决定是哪个文件系统(参考前一篇文章),如果URI没有前缀也是得到缺省的文件系统。
使用open方法得到文件的输入流
有了filesystem的实例,我们就可以调用open方法得到某个文件的输入流了
public FSDataInputStream open(Path f) throws IOException
public abstract FSDataInputStream open(Path f, int bufferSize) throws IOException
第一个方法用缺省的buffer大小4K
使用FSDataInputStream读数据
FSDataInputStream派生自java.io.DataInputStream,支持随机读取。
public class FSDataInputStream extends DataInputStream
implements Seekable, PositionedReadable {
void seek(lon ......
Java第三方library ecosystem是一个很广阔的范畴。不久前有人撰文:每个项目中,你必须知道的11个Java第三方类库。
单元测试
1.DBUnit
DBunit是一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象和封装。
2.MOckito
Mockito是一个针对Java的mocking框架。你可以使用简洁的API编写出漂亮的测试。
3.Hamcrest Matchers
Hamcrest 是一个测试辅助工具,提供了一套通用的匹配符 Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。
Junit4结合Hamcrest提供了新的断言语句-assertThat,只需一个assertThat语句,结合Hamcrest提供的匹配符,就可以表达全部的测试思想。
Apache Commons
4.Configuration
这个工具是用来帮助处理配置文件的,支持很多种存储方式
5.DbUtils
DbUtils可以将数据库操作单独做成一个包,简化数据库操作。
6.IO
可以看成是java.io的扩展。它提供了文件阅读功能,以及一些使用的方法,类似于DbUtils。
7.Lang
如果你要问我还有哪个库一会在此名单之上,我会告诉你是Lang或者google Collections。lang可以看成是对java.lang的扩展,提供了诸如Strin ......
public List createArrayList(String FilePath,String FileName){
List list =new ArrayList();
FileName=FilePath+"\\"+FileName;
File file=new File(FileName);
String encoding="GBK";//防止乱码 这编码需要根据自己的操作系统默认的编码来设置
String str=null;
try{
if(!file.exists()) file.createNewFile();
FileInputStream fis= new FileInputStream(file);
InputStreamReader read=new InputStreamReader(fis,encoding);
BufferedReader br = new BufferedReader(read);
while((str=br.readLine())!=null)
{
str=new String(str);
str=str.substring(str.indexOf("--")+2);
// System.out.println(str);
list.add(str);
}
&n ......
package javatest1014;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class ReadExcel{
public static void main(String[] args){
jxl.Workbook workbook=getWorkBook();
jxl.Sheet sheet=workbook.getSheet(0);
jxl.Cell cell= sheet.getCell(0, 6);
System.out.println(cell.getContents());
System.out.println(cell.getRow());
System.out.println(cell.getColumn());
System.out.println(cell.getType());
System.out.println(sheet.getColumns());
System.out.println(sheet ......
package chape2;
/**
* effective_java 第二章 创建和销毁对象
* 书中实例练习
* 原则:
* 1.考虑用静态工厂方法来带特构造方法;-- 4-8
* 2.遇到多个构造方法的参数时要考虑用构建器 就是这个类有许多的变量 -- 9-13
* 当一个类有很多变量的时候,会用重叠构造方法(telescoping constructor) 就是构造方法中的参数递增
* 一个类中有很多的构造方法 参数的个数不同;解决这个问题的方法 首先是用javabean的方法 里面有很多的变量的
* seter和geter方法;这是我们常用的;但是有seter方法提供给外界 就导致了这类不能成为不可变类,这样就不能保证
* 传来的参数可能存在不一致性。解决这样的方法就是用builder模式 这个类就演示builder模式的例子
* bulder的不足 要创建实例先创建构建器 这儿有点内存开销,在对效率要求很高的程序要考虑;还有就是代码多了;
* 所以当参数有四个或者四个以上的时候,而且大多数的参数时可选的时候。使用构建器;
* @author lee
* 2009-11-15
*/
public class Chape2_1 {
public static void main(String[] args) {
// 实例化类 这样的代码易于阅读
Nuter nu = n ......