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

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

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

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

Q&A

解決済

2回答

907閲覧

<Java>バイナリファイルの書き出しについて

ukiuki0518

総合スコア11

Java

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

0グッド

0クリップ

投稿2019/05/26 10:11

前提・実現したいこと

プログラミング勉強歴約3カ月で、現在Javaのストリームについて学んでいます。
超超初心者です。

参考にしているテキストの例題について、不明な点があったので質問させていただきます。
この例題ではFileOutputStreamクラスを使用しています。
知りたいのは、
writeメソッドに引数として渡せる値について」と
この例題は実用的なのか

ということです。詳しくはソースコードの下に書いています

実際の例題のバイナリファイルに書き出すクラスと
参考として読み込むクラスの計2つのソースコードを掲載します。

書き出しクラスのソースコード

Java

1//インポート・クラス記述・try{などは省略 2 3 char a = 'A' , 'B'; 4 int c = 128; 5 FileOutputStream out = new FileOutputStream("file.dat"); 6 7 out.write(a);   8 out.write(b);   9 out.write(c);   10 11 out.close(); 12 13//例外処理は省略 14

読み込みクラスのソースコード(※参考)

Java

1//インポート・クラス記述・try{などは省略 2 3 FileInputStream in = new FileInputStream("file.dat"); 4 int c; 5 6 while((c = in.read()) != -1) 7 System.out.ptint(c + " "); 8 in.close(); 9 10//例外処理は省略 11

実行結果(file.dat)

65 98 128

詳しい質問内容

######「writeメソッドに引数として渡せる値について」
参考にしているテキストでは ”引数にはint型またはbyte型の値を指定できる” とありました。
しかし例題ではchar型の値を引数として渡しています。
javaのAPIで調べてみると、自分の調べた限りでは引数はint型かbyte型で間違いないようです。
また、APIによると ”int型は使用できるが、上位24bitは無視される” とありました。残り8bitだとbyte型と同じ数字しか入れられない気がするのですが・・・。(もしかしてint型下位8bitだと、符号なしの整数値として扱われて255までの数字が入れられるようになるとか・・・?)

なぜchar型の変数をwriteメソッドの引数として渡せるのでしょうか。また、
byte型でなくint型を引数に指定するメリットは何でしょうか。

「この例題は実用的なのか」

ネットでバイナリファイルの書き出しについて調べていると、char型やint型ではなく”byte型”の変数を使っているソースコードの例が多い気がしました。
もし例題のコードが実際によく使う実用的な記述方法なら、考える価値アリだと思うのですが、そうでないならこの例題についてひたすら考えて時間を潰すよりも別のテキストやネットの情報から学ぶ方が効率的だと考えています。

”例題”としてではなく”実際の使用例”として、上記のソースコードでのWriteメソッドの使い方(引数にchar型、int型指定)は覚えておいた方がよいのでしょうか。

質問は以上です。長々とすみません。ご回答お待ちしております。

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

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

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

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

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

guest

回答2

0

ベストアンサー

char型の値をint型の変数に入れようとすると、暗黙的キャストが起こります。

java

1char c = 'a'; 2int x = c;

これと同じで、int型の引数を要求するメソッドにchar型の値を渡した場合、int型に変換されるのです。

投稿2019/05/26 10:52

swordone

総合スコア20649

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

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

ukiuki0518

2019/05/26 11:05

ご回答ありがとうございます!暗黙的なキャスト・・・。「int x = (int)c;」 ←これが暗黙的に行われるってことですね・・・! ご回答について少し質問なのですが、このintにキャストされた時の変数xに入る整数値が何か、つい気になってしまうんですが・・・これは考えなくても大丈夫なんでしょうか?
swordone

2019/05/26 13:36

charが格納する値は、実際には文字に対応する「Unicode」の値です。例えば'a'は16進法で「61」、10進法に直すと「97」になります。質問に出ている'A'は16進法で「41」10進法で「65」になります。
ukiuki0518

2019/05/27 04:57

返信遅くなりすみません!ご回答ありがとうございます。文字だと思っていたものは元は16進数の数字だったってことですか・・・!それを10進数に変換してint型に入れているってことですね!なるほど納得しました!ありがとうございます。 何度も重ねてお聞きして本当に恐縮なのですが、もう一つだけスッキリしていないことがあって・・・。;;質問内容にも書いていますが、「byte型でなくint型を引数に指定するメリット」について、もしお手数でなければ教えていただきたいのですが・・・。
swordone

2019/05/27 05:29

まず誤解しないでいただきたいのは、16進法とか10進法とかいうのは、あくまで「数の表し方」にすぎない、という点です。Unicodeは一般的には16進法で記述されることがほとんどですが、printメソッドなどで数値を文字として出力する際は多くが10進法になっているというだけの話です。そのため、「10進法に直してintに入れている」というのは変です。
ukiuki0518

2019/05/27 05:41

ハッなるほど!!!誤解してました・・・。これはもっと根本的なところから勉強しなおさないとダメだと気付きました。ご丁寧にありがとうございます!
swordone

2019/05/27 05:54

さて、「intを引数にするメリット」ですが、ここからは完全に推測です。 writeメソッドはbyte値を出力するのが本業なのだと思うのです。出力する値を加減算やビットシフトなどで加工してから出力するというのはよくあることだと思います。しかし、Javaの言語仕様では、整数値の計算は、longが入っていればlongに、それ以外はintになります。たとえbyte同士の計算だとしてもintにされてしまいます。それをbyteに渡そうと思ったら、明示的なキャストが必要になります。 いちいちキャストのための(byte)を書くのは面倒なので、内部でそれができるように、int引数のwriteメソッドがあるのではないでしょうか。
ukiuki0518

2019/05/27 09:25

>>Javaの言語仕様では、整数値の計算は、longが入っていればlongに、それ以外はintになります。たとえbyte同士の計算だとしてもintにされてしまいます。 これはふわっと理解してただけだったのでようやく意味が分かりました!!javaでは整数値を入力したら勝手にint型にさてれしまうんですね・・・。数値リテラルについてもう一度調べてきてやっと納得しました; >>いちいちキャストのための(byte)を書くのは面倒なので、内部でそれができるように、int引数のwriteメソッドがあるのではないでしょうか。 writeメソッドに数字を入れるたびに(byte)~と書いてたら手間ですもんね。int引数は、writeメソッドに”明示的に型指定されていない整数値”を渡してもbyte型として扱ってくれるためにあるってことですね! 最後までご丁寧にお答えいただき本当にありがとうございます。すべてスッキリしました! ベストアンサーにさせていただきます。ありがとうございました!!
guest

0

実際、ukiuki0518さんが使うかはわかりませんが、僕は現在の仕事で開発しているものは使用しています。
技術として知っておいて損は無いと思います。

投稿2019/05/26 10:30

sobue

総合スコア329

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

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

ukiuki0518

2019/05/26 10:40

ご回答ありがとうございます!なるほど実際の現場でも使用されているんですね。 現場の方のアドバイスを聞けてとても嬉しいです。「こういう使い方がある」ということは今後の勉強や仕事の基礎になると自信が持てました、しっかり頭に入れておきます!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問