質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1092閲覧

FileOutputStreamクラスのwriteBytesの実装が見たい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2018/02/13 09:25

編集2018/02/13 09:51

###わからないこと
・FileOutputStreamクラスのwriteBytesのネイティブコードでの実装
・nativeメソッドにひもづくモジュールはどこにあるのか、どのようにひもづいているのか

###経緯と詳細
HelloWorldがどのようにEclipseのコンソールに出力されるかが知りたくて、
System.out.printlnをひたすらデバッグで追いかけていました。
どうやらFileOutputStramクラスのwriteBytes(byte[], int, int, boolean)というメソッドを経た際に出力されているようでした。
しかし、先のメソッドがnativeメソッドのため、その先の実装を見ることができません。
さらに調べるとJNIによってCやC++で書かれたコードと連携させているということが分かりました。

java -verbose:jni Hello
[Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI]

このwriteBytesというメソッドはどのモジュールに書かれているのでしょうか。
jdk,jreフォルダの中を"writeBytes"で検索しても見つかりませんでした。

###環境
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

keicha_hrs👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

しかし、先のメソッドがnativeメソッドのため、その先の実装を見ることができません。

OpenJDK/jdk9/jdk9/jdk以下を探すのが良さそうです。

c

1JNIEXPORT void JNICALL 2Java_java_io_FileOutputStream_writeBytes(JNIEnv *env, 3 jobject this, jbyteArray bytes, jint off, jint len, jboolean append) 4{ 5 writeBytes(env, this, bytes, off, len, append, fos_fd); 6}

c

1void 2writeBytes(JNIEnv *env, jobject this, jbyteArray bytes, 3 jint off, jint len, jboolean append, jfieldID fid) 4{ 5 jint n; 6 char stackBuf[BUF_SIZE]; 7 char *buf = NULL; 8 FD fd; 9 10 if (IS_NULL(bytes)) { 11 JNU_ThrowNullPointerException(env, NULL); 12 return; 13 } 14// 以下省略 15

投稿2018/02/13 11:15

aterai

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/13 12:08

writeBytesがあるのできっとこれですね。 ありがとうございます!!
guest

0

フォルダの中を見ても検索できませんね。java標準ライブラリ(jar)の中にあります。ただ、ソースーコードは出てこないのでclassを逆コンパイルするか、JDKをダウンロードしてソースを参照してください。

投稿2018/02/13 09:31

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/02/13 09:49 編集

ただ、細かい実装を追うのも良いことですが多分細かい疑問が増えるだけだと思います。基本はFile Streamに出力していてそれが標準出力に結びついているだけですね。
退会済みユーザー

退会済みユーザー

2018/02/13 09:48

ご回答ありがとうございます。 また、基本の仕組みについてご教示いただき感謝致します。 jdk内のjarから対象のメソッドをどう探すかについては改めて調べてみます。
unz.hori

2018/02/13 09:56

もっと詳しく書くとjreのlibフォルダにrt.jarがあると思いますがそのなかにFileOutputStream.classが存在します。jarファイルの圧縮形式はzipと同じなので拡張子を.zipに変更して展開することもできますが中身はソースではなくバイナリなので逆コンパイルする必要があります。JDKならソースを含んでいるはずなのでJDKをダウンロードしてソースを参照する方がいいと思います。
unz.hori

2018/02/13 09:58

ちなみにJavaの標準ライブラリでもソースファイルがあればjarに対してソースを関連付けることによりEclipse上でソースレベルで追いかけることもできます。
unz.hori

2018/02/13 10:00

正しい回答してもマイナス評価は悲しいなぁ。
退会済みユーザー

退会済みユーザー

2018/02/13 10:01

追加の情報ありがとうございます。後ほど試してみます。 低評価は私ではございませんので悪しからず・・・。
退会済みユーザー

退会済みユーザー

2018/02/13 12:03

確認致しました。 まずjreのlibフォルダにrt.jarはございませんでした。 また、まさにEclipseでソースを関連付けてFileOutputStream.classを覗いた結果、 nativeメソッドにたどり着いた次第です。Eclipse上でデバッグすることで、ネイティブコードまで追いかけることができる、ということを仰っていますでしょうか。
unz.hori

2018/02/13 13:25

Java9でネイティブコードの話ですね。ちょっと勘違いでしたね。私自身はネイティブコードまでは追いかけてないので。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問