2013-06-12 36 views
6

Trong Java, bạn có thể đọc và ghi vào tệp. Nhưng JVM có thể chạy trên nhiều hệ thống có thể có các cách lưu trữ tệp và dữ liệu liên quan khác nhau. Làm thế nào để viết mã JVM hoạt động trên mọi hệ thống?Làm thế nào để JVM và Java thực hiện việc đọc và ghi vào các tệp?

Các phương pháp gốc được sử dụng ở cấp độ nào? Liệu JVM có một tập hợp các chức năng tập tin nhất định phải được thực hiện cho mỗi hệ thống, và sau đó có thể được gọi bằng ngôn ngữ nào không? Hoặc mỗi ngôn ngữ chạy trên JVM (như Java, hay Scala) phải tự làm nó?

+1

các JVM kết thúc tốt đẹp OS chức năng tập tin gốc cho hầu hết các hệ điều hành. Ngôn ngữ viết cho JVM không phải lo lắng về nó. – Serdalis

+0

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

+0

@Slaks - đó chỉ là mã Java. Rất nhiều điều xảy ra ở phía mã nguồn gốc. Chắc chắn là những thứ để làm với đọc và viết các tập tin. –

Trả lời

6

Thông thường, bạn sẽ viết JVM bằng ngôn ngữ cấp cao như C++ và sau đó sử dụng thư viện được cung cấp của ngôn ngữ đó để giao tiếp với hệ thống tệp. Sau đó bạn có thể biên dịch JVM trên các nền tảng, hệ điều hành và kiến ​​trúc khác nhau và để lại trách nhiệm xác định cách làm tệp I/O cho trình biên dịch ngôn ngữ cấp cao.

Ngoài ra, đối với một số hoạt động nhất định, JVM có thể có các triển khai khác nhau của tệp I/O hoặc cửa sổ dựa trên hệ điều hành mà nó chạy. Sau đó sẽ có nhiều triển khai khác nhau và khi xây dựng JVM trên một hệ thống, trình biên dịch có thể xác định loại nào để sử dụng dựa trên tập lệnh config hoặc #ifdef s, v.v.

Hy vọng điều này sẽ hữu ích!

+0

Được rồi, vì vậy nếu JVM kết thúc tất cả các công cụ cụ thể cho bạn, bạn gọi/sử dụng công cụ đó trong mã JVM như thế nào nếu bạn đang viết trình biên dịch tạo mã JVM cho một ngôn ngữ mới? Ngoài ra, đây có phải là cách đọc và viết cho bảng điều khiển hoạt động không? – Tespa42

1

Hầu hết các chức năng IO đều khá chuẩn và có các cuộc gọi POSIX hoạt động trên nhiều hệ điều hành. Trường hợp có sự khác biệt, mã có thể được bao gồm hoặc không sử dụng bộ xử lý trước C với #ifndef#ifndef

+1

Từ những lần truy cập ngắn trước đây của tôi tới codebase OpenJDK JVM, tôi đã có ấn tượng rằng có các triển khai riêng biệt của các API mã nguồn gốc cho các hệ điều hành khác nhau. Đó là (đến một mức độ đáng kể) không chỉ được thực hiện với trình biên dịch có điều kiện. –

+0

@StephenC Ngay cả trong Java cũng có các lớp triển khai như WindowsFileSystem và UnixFileSystem chỉ có sẵn trên các hệ thống đó. –

1

Đọc và ghi vào tệp được thực hiện trong lớp java.io.FileInputStream/FileOutputStream bằng cách gọi phương thức gốc

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; 

những lớp học đều giống nhau cho tất cả các nền tảng duy nhất differes thực hiện phương pháp bản địa, trong Oracle HotSpot của tôi nó jre/bin/java.dll thư viện

Các vấn đề liên quan