2013-06-12 5 views
6

W języku Java można czytać i zapisywać pliki. Ale JVM może działać na wielu systemach, które mogą mieć różne sposoby przechowywania plików i powiązanych danych. W jaki sposób można napisać kod JVM, który działa na każdym systemie?W jaki sposób JVM i Java implementują odczyt i zapis w plikach?

Na jakim poziomie używane są metody natywne? Czy JVM ma określony zestaw funkcji plików, które muszą być zaimplementowane dla każdego systemu, i które mogą być następnie wywoływane przez dowolny język? Czy też każdy język, który działa na JVM (jak Java lub Scala) musi to zrobić sam?

+1

JVM owija OS funkcje natywny plików dla większości systemów operacyjnych. Języki napisane dla JVM nie muszą się o to martwić. – Serdalis

+0

http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/FileSystem.java#FileSystem – SLaks

+0

@Slaks - to tylko kod Java. Dużo więcej dzieje się po natywnej stronie kodowej. Z pewnością rzeczy związane z czytaniem i pisaniem plików. –

Odpowiedz

6

Zazwyczaj można napisać maszynę JVM w języku wysokiego poziomu, takim jak C++, a następnie użyć bibliotek dostarczonych w tym języku do połączenia z systemem plików. Następnie można skompilować maszynę JVM na różnych platformach, systemach operacyjnych i architekturach i pozostawić odpowiedzialność za ustalenie, jak wykonać we/wy pliku do kompilatora języka wysokiego poziomu.

Alternatywnie, dla niektórych operacji JVM może mieć różne implementacje we/wy pliku lub okienkowanie w oparciu o system operacyjny, na którym działa. Będzie wtedy wiele różnych implementacji, a podczas budowania JVM w systemie kompilator może określić, którego użyć w oparciu o skrypt config lub #ifdef s, itp.

Mam nadzieję, że to pomoże!

+0

Okay, więc jeśli JVM opakowuje dla Ciebie wszystkie specyficzne dla OS-ów rzeczy, jak wywołasz/użyjesz tych rzeczy w kodzie JVM (jak gdybyś pisał kompilator, który generowałby kod JVM dla nowego języka)? Czy w ten sposób również działa czytanie i pisanie na konsolę? – Tespa42

1

Większość funkcji IO jest dość standardowych i istnieją wywołania POSIX, które działają w wielu systemach operacyjnych. Tam, gdzie występują różnice, odpowiedni kod może być zawarty lub nie jest używany pre-procesor C z #ifndef i #ifndef

+1

Z moich poprzednich krótkich wizyt w kodzie OpenVDK JVM odniosłem wrażenie, że istniały osobne implementacje natywnego API kodu dla różnych systemów operacyjnych. Jest to (w znacznym stopniu), a nie tylko kompilacja warunkowa. –

+0

@StephenC Nawet w Javie istnieją klasy implementacyjne, takie jak WindowsFileSystem i UnixFileSystem, które są dostępne tylko w tych systemach. –

1

Odczytywanie i zapisywanie do pliku odbywa się w klasach java.io.FileInputStream/FileOutputStream przez wywołanie rodzimych metod, np.

private native int readBytes(byte b[], int off, int len) throws IOException; 

private native void writeBytes(byte b[], int off, int len, boolean append) 
     throws IOException; 

klasy te są takie same dla wszystkich platform tylko rodzime differes implementacji metody, moim Oracle HotSpot to jre/bin/java.dll bibliotekę