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

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

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

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

Q&A

解決済

2回答

1008閲覧

javaのデータの読み込みについて

kai11

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/05/27 12:10

<Java コード>
import java.io.;
import java.util.
;

class IOExercise{
public static void main(String[] args) throws IOException{
double s2;
BufferedReader kin =null;
DataInputStream in =null;
DataOutputStream out =null;
System.out.println("Enter the number:");

try{ kin = new BufferedReader(new InputStreamReader(System.in)); in = new DataInputStream(new BufferedInputStream(new FileInputStream("number.data"))); out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("number.data"))); String str = kin.readLine(); double num = Double.parseDouble(str); double s = Math.sqrt(num); System.out.println("Square root value " + num+ " is "+ s); out.writeDouble(s); s2= in.readDouble(); System.out.println("The square root value " + s + " is written to the file \"number.data\" "); System.out.println("The value read from the file \"number.data\" is " + s2 ); System.out.println("Square of " + s2 + " is "+ s2*s2 ); }catch(FileNotFoundException e){ System.out.println("File not found " + e); }finally{ in.close(); out.close(); kin.close(); } }

}

実行結果
Enter the number:
9
9
Square root value 9.0 is 3.0
Exception in thread "main" java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readLong(DataInputStream.java:416)
at java.io.DataInputStream.readDouble(DataInputStream.java:468)
at IOExercise.main(IOExercise.java:22)

質問
number.dataに文字が書かれていたので、ちゃんと書き込まれているはずなのですが、なぜか読み込むことができずにEOFExceptionが起きてしまいます。どこがおかしいのでしょうか。

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

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

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

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

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

kai11

2022/05/27 12:20

試しに in = new DataInputStream(new BufferedInputStream(new FileInputStream("number.data"))); out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("number.data"))); の部分のBufferのところを消してみたらできました。なぜでしょうか?
kai11

2022/05/27 12:21

in = new DataInputStream(new FileInputStream("number.data")); out = new DataOutputStream(new FileOutputStream("number.data")); としました。
guest

回答2

0

out.writeDouble(s); で書き込んだデータはバッファの中にあるだけで
実際にファイルには書き込まれていません。
out.flush(); または out.close(): でファイルに書き込まれます。

投稿2022/05/27 13:18

kazuma-s

総合スコア8224

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

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

kai11

2022/05/27 13:50

回答ありがとうございます。
guest

0

ベストアンサー

java

1 out.writeDouble(s);

としたからといって、必ずしもその時点でファイルに書き込まれているとは限らない。いつ実際にファイルに書き込まれるのかはFileOutputStreamの実装による。OutputStreamにはflush()メソッドが定義されていて、このように定義されている。

https://docs.oracle.com/javase/jp/8/docs/api/java/io/OutputStream.html#flush--

バッファリングされていたすべての出力バイトを強制的に書き込みます。...ストリームをフラッシュすることで、それまでにストリームに書き込まれたバイトがオペレーティング・システムに渡されて書き込まれることは保証されますが、ディスク・ドライブなどの物理デバイスに実際に書き込まれることは保証されません。

たとえflush()したとしても、実際にデバイスつまりファイルに書き込まれるかどうかは、保証されない。

number.dataに文字が書かれていたので、ちゃんと書き込まれているはずなのですが、なぜか読み込むことができずにEOFExceptionが起きてしまいます。どこがおかしいのでしょうか。

いつ、「ちゃんと書き込まれているはずな」ことを確認したのでしょうか。おそらく、プログラムが終了した、あと、でしょう。それは out.close(); したあとだから、プログラムが終了したあとだから、「number.dataに文字が書かれていた」。いずれ、InputStreamもOutputStreamもバッファリングされることを考慮すれば、同じファイルを同時に開いて読み書きするのはとてもむつかしいでしょう。

どうしても同一ファイルへの読み書き同時におこないたいのであれば、StreamではなくChannel https://docs.oracle.com/javase/jp/8/docs/api/java/nio/channels/FileChannel.html をつかうのがよろしいかと。

投稿2022/05/27 13:11

shiketa

総合スコア3971

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

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

kai11

2022/05/27 13:23

理解できました。ありがとうございます。 ところで in = new DataInputStream(new FileInputStream("number.data")); out = new DataOutputStream(new FileOutputStream("number.data")); と変更したらちゃんと出力されました。なぜこっちの場合はファイルに書き込まれたのでしょうか。
kai11

2022/05/27 13:46

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問