Java中的本机方法,操作系统是否特定?

时间:2013-06-04 17:08:35

标签: java string operating-system native

问题描述: - 在一次讨论中,我发现程序员陷入困境,我认为我应该加入论坛。

今天我在搜索数组转换为char数组。我检查了字符串类的 toCharArray()方法的定义。

char str[] = "native".toCharArray();

toCharArray()定义: -

public char[] toCharArray() {
    char result[] = new char[count];
    getChars(0, count, result, 0);
    return result;
}

getChars定义: -

public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin){
   if(srcBegin<0){
       throw new StringIndexOutOfBoundsException(srcBegin);
   }
   if(srcEnd>count){
       throw new StringIndexOutOfBoundsException(srcEnd);
   }
   if(srcBegin>srcEnd){
       throw new StringIndexOutOfBoundsException(srcEnd-srcBegin);
   }
   System.arraycopy(value,offset+srcBegin,dst,dstBegin,srcEnd-srcBegin);
}

然后是原生方法: -

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                         int length);

这里我不需要了解本机,但我必须知道在这样的本机方法中,以相同的方式定义不同的本机方法将为其他操作系统定义。

3 个答案:

答案 0 :(得分:2)

它原生的原因是因为使用本机代码可以大大优化这种昂贵的功能。

但无论操作系统如何,行为都是一样的。

答案 1 :(得分:2)

由于Java语言的主要优点是跨硬件平台和操作系统的可移植性。因此,特定方法虽然被声明为本机,但不应更改签名,例如名称或参数,以遵循此原则。

然而,可以改变的是本机方法的实现。此实现是特定于平台的。 JNI提供了一种以独立于平台的方式使用任何本机方法的方法

答案 2 :(得分:2)

大多数操作都是独立于操作系统的,尽可能。

有一些明显的例外,例如Runtime.exec(String命令)将完全取决于您安装的命令。

这只会创建操作系统允许的文件名。在Linux上,您可以使用在Windows中无效的字符。 Windows也不区分大小写,这意味着如果您有另一个具有相同名称的文件,忽略大小写,它将在Windows上覆盖,但在Linux中创建一个新文件。

new FileOutputStream(String filename)

常见的问题是,Linux允许您删除尚未关闭的文件,但Windows不会删除。这可能会导致不同平台上的不同行为。