• ベストアンサー

バイナリファイルの読み込みについて

java初心者です。 今バイナリファイルの読み込みを行っているのですがバイナリファイルのデータの値とプログラムで読み込んだ値が違っているので困っています。 バイナリファイルはASCIIテキストになっていてデータを見ることができ中身は -0.00012 -0.00009 -0.00009 -0.00012 -0.00009 -0.00009 -0.00009 -0.00012 ・・・・・・・(値が続くという意味です) となっています。 作ったプログラムは import java.io.*; class a { public static void main(String[] args) { try { FileInputStream in = new FileInputStream("file name"); int ch; while ((ch = in.read()) != -1) { System.out.println(ch); } in.close(); } catch (IOException e) { System.out.println(e); } } } で作って読み込んでみたのですが出力された値は 45 48 46 48 48 48 49 50 ・・・・・・ になってしまいます。 どのようにしたら値が等しくなるのでしょうか。教えてください。

  • ci06
  • お礼率100% (8/8)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

http://www.tohoho-web.com/java/file.htm ↑ここ読めば大体理解できるかと。 1番下の例を使えばたぶん望みの結果になると思います。

ci06
質問者

お礼

回答ありがとうございます。 教えていただいたとおり1番下の例を使用したところ 望んだ結果になりました。 ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

バイナリファイルじゃなくてテキストファイルのよう見えますけど。 45 '-' 48 '0' 46 '.' 48 '0' 48 '0' 48 '0' 49 '1' 50 '2' でしょ? どう直すかは何がしたいかによりますけど。

ci06
質問者

お礼

回答ありがとうございます。 調べたんですがテキストファイルではなくバイナリファイルみたいです。 ご指摘ありがとうございます。 おかげさまで理解できました。ありがとうございます。

関連するQ&A

  • ファイル読み込みで

    市販のテキストでファイルを読み込むプログラムを作ったのですがうまくできません。 import java.io.*; public class ShowFile{ public static void main(String args[]){ if(args.length != 1){ System.out.println("使用法: java ShowFile ファイル"); System.out.println("例: java ShowFile ShowFile.java"); System.exit(0); } String filename = args[0]; try{ BufferedReader reader = new BufferedReader(new FileReader(filename)); String line; while((line = reader.readLine()) != null){ System.out.println(line); } reader.close(); }catch(FileNotFoundException e){ System.out.println(filename + "が見つかりません"); }catch(IOException e){ System.out.println(e); } } } javac ShowFile.javaでコンパイルはうまくいったのですが、 実行時にjava ShowFile input.txtとするとException in thread "main" java.lang.NoClassDefFoundError: ShowFile というエラーが出ます。input.txtというファイルは存在します。 アドバイスをお願いします。

    • ベストアンサー
    • Java
  • バイナリファイルの読み込み方

    バイナリファイルの中身を解析したいと思っています。 「先頭の3バイトは日付、次の2バイトはファイルサイズ、 さらに次の4バイトはファイル種類が格納」というようにファイルのフォーマット が定まっている場合、どのように読み込めばよいでしょうか。 下記のコードを改変してできないかと思っています。 import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; public class BinaryRead { public static void main(String[] args) { BufferedInputStream bi = null; int tmp=0; try { //インスタンス生成 bi = new BufferedInputStream(new FileInputStream("hoge.dat")); //ストリームの終わりに達した場合は-1 while((tmp=bi.read())!=-1){ System.out.println(tmp); } } catch (Exception e){ e.printStackTrace(); } finally { //入力ストリームを閉じる bi.close(); } } }

    • ベストアンサー
    • Java
  • バイナリ読み込みについて

    お世話になります。バイナリファイルの読み込みについて質問させてください。 バイナリファイルはC#で出力したものでushort型(符号無し16bit)で書き込んでいます。 //C#でushort型データのバイナリ書き込み例 private static void WriteBinary(){  ushort data=5000;   BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\Binary.txt", FileMode.Create, FileAccess.Write)); bw.Write(data); bw.Close(); } これをJavaで読んで、書き込んだ値5000を取得したいのですが、 C#のushortは符号無しの2Byteなんので、Javaでそれに相当するように readUnsignedShortで読み込んだのですがうまくいきません。どなたかご教授ください。 //Javaでushort型データのバイナリ読み込み private static void ReadBinary(){  DataInputStream dis = new DataInputStream(new FileInputStream("C:\\Binary.txt"));  int data = dis.readUnsignedShort();  System.out.println(data);  } すると「34835」と表示されます。その他、readShort()→-30701 read(byte[2])として byteに格納してbyte[0]と[1]を足しても-101になり取得できませんでした。 保存されたデータは符号なしの16ビットなのでreadUnsignedShort()で取得できると 思ったのですが、何か根本的に考え方が違うのでしょうか?? ※もちろんC#でReadInt16で読み取ると正常に5000を取得できした。

    • ベストアンサー
    • Java
  • 実行時にファイル指定するのではなくコンパイル時に指定したい。

    import java.io.*; class test { public static void main(String args[]) { char ch[] = new char[128]; try { FileReader fp = new FileReader(args[0]); fp.read(ch); System.out.println(ch); } catch (IOException e) { System.out.println("例外 - " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(); } } } 以上プログラムについての質問です。 ファイルを読み込み配列に格納するプログラムです。 読み込みたいファイルをabc.txtとします。 ↑では実行時にjava test abc.txtと指定して テキストの中身を表示するのですが プログラム内に読み込むテキストをはじめからいれておきたいです。 この場合どのようにabc.txtをプログラム内にいれたらよいでしょうか? また文のはじめから終わりまで読み込んで全部出力してしまうのですが 例えば、1文だけ(改行まで)読み取る、ですとか 1文だけ読み取るのを上から順番ではなくてランダムに読み取る、などはどうやればよいのでしょうか? わかる方、ヒントだけでも結構です。 よろしく御願いします。

    • ベストアンサー
    • Java
  • ストリームの問題について【至急】

    import java.io.*; public class FileStreamDemo { public static void main(String[] args){ try{ byte[] buffer=new byte[1024]; FileInputStream fileInputStream= new FileInputStream(new File(args[0])); FileOutputStream fileOutputStream= new FileOutputStream(new File(args[1])); System.out.println("コピーファイル: "+fileInputStream.available()+"バイト"); while(true){ if(fileInputStream.available()<1024){ int remain=-1; while((remain=fileInputStream.read())!=-1){ fileOutputStream.write(remain); } break; } else{ fileInputStream.read(buffer); fileOutputStream.write(buffer); } } fileInputStream.close(); fileOutputStream.close(); System.out.println("コピー完了"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println( "using:java FileStreamDemo src des"); e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } } JAVAの入門者です。 JAVAの教科書に書いてあるように、上のプログラムを書きましたけど… コンパイルすると、エラーメッセージが出て来ます。 エラー中身は下記のとおりです。 【using:java FileStreamDemo src des java.lang.ArrayIndexOutOfBoundsException: 0 at FileStreamDemo.main(FileStreamDemo.java:8) 】 どうすればいいのか悩んでいます。 誰か、助けていただけないのでしょうか?どこか間違ってるか、教えてください。 よろしく、お願いします。

  • ファイル転送が正常に動作しない

    サーバ側からクライアント側へファイル転送をJavaで行おうとしています。 そこで以下のようなプログラムを作成し、実行するのですが 実行自体はうまくいき、1つめのファイルはきちんと転送できるのですが、 2つめのファイルが転送完了後に確認すると0バイトとなっており、 きちんと動作しません。どうするべきでしょうか。 サーバ側 ※上でソケットはつないであります。 if(command.equals("put.") == true){ System.out.println("putモードに入りました"); // カーネル(linux.uml)の送信 String filename1 = args[1]; byte[] data1 = new byte[1024]; //ストリームの作成 FileInputStream fin1= new FileInputStream(filename1); BufferedOutputStream out2 = new BufferedOutputStream(sock.getOutputStream()); System.out.println("送信ファイル : " + filename1); //int totalSize1 = 0; int len1; while((len1 = fin1.read(data1)) != -1){ out2.write(data1); } out.flush(); fin1.close(); System.out.println(filename1 + "を送信完了しました"); // ルートファイルシステム(uml-root-hardy)の送信 String filename2 = args[2]; byte[] data2 = new byte[1024]; //ストリームの作成 FileInputStream fin2 = new FileInputStream(filename2); //ファイルの内容を読み出し、送信する System.out.println("送信ファイル" + filename2); //long totalSize2 = 0; long len2 = 0; while((len2 = fin2.read(data2)) != -1){ out2.write(data2); } out.flush(); fin2.close(); System.out.println(filename2 + "を送信完了しました"); } クライアント側 ※上でソケットはつないであります。 if(change.equals("put.") == true){ System.out.println("putモードに入りました"); // 2つのファイルを転送する // カーネル(linux.uml)の転送 String filename1 = args[2]; System.out.println("受信するファイル : " + filename1); // FileOutputStreamの作成 FileOutputStream fout1 = new FileOutputStream(filename1); BufferedInputStream in2 = new BufferedInputStream(sock.getInputStream()); int recvMsgSize1; int bufSize = 1024; byte[] byteBuffer1 = new byte[bufSize]; //int totalByte1 = 0; while((recvMsgSize1 = in2.read(byteBuffer1)) != -1){ fout1.write(byteBuffer1); } System.out.println(filename1 + "を受信完了しました"); fout1.close(); // ルートファイルシステム(uml-root-hardy)の転送 String filename2 = args[3]; System.out.println("受信するファイル : " + filename2); FileOutputStream fout2 = new FileOutputStream(filename2); long recvMsgSize2; //byte[] byteBuffer = new byte[bufSize]; byte[] byteBuffer2 = new byte[bufSize]; //long totalByte2 = 0; while((recvMsgSize2 = in2.read(byteBuffer2)) != -1){ fout2.write(byteBuffer2); } System.out.println(filename2 + "を受信完了しました"); fout2.close(); } またプログラム中では、サーバ、クライアントでそれぞれ len1,len2(サーバ側)、recvMsgSize1,recvMsgSize2(クライアント側) に警告で「ローカル変数len1(recvMsgSize1)は読み取られません」 と出ています。 どのように解決するべきでしょうか。

    • ベストアンサー
    • Java
  • メディアファイルをバイナリ解析

    Javaでmp4、m4aなどのQuickTime系のフォーマットのatomと呼ばれるデータブロックを 下記の様にツリー形式で描画したいのですが、バイナリを解析する際のアプローチが掴めません。 +--ftyp +--moov | +--mvhd | +--drm | | +--dcmd | +--trak | | +--tkhd | | +--mdia | | +--(以下省略) | +--trak | | +--tkhd | | +--mdia | | +--(以下省略) | +--udta | +--titl +--mdat ↓はあくまで頭にあるイメージですが、このような感じにしていきたいです。 FileInputStream in = new FileInputStream("music.m4a"); int ch; while ((ch = in.read()) != -1) { if ("moov".equals(Integer.toHexString(ch)) { // -の数は階層 System.out.println("+--moov"); } } まずは現在読み込んでいるところがmoovであるという判定が上記のロジックではうまくできないので どのように階層を判定すれば良いのかアドバイスいただけないでしょうか? よろしくお願い致します。 【フォーマットの参考URL】 http://labs.unoh.net/2007/09/mp43gpp3gpp2.html http://www.mpeg.co.jp/libraries/mpeg_labo/winPC_26.html#2

    • ベストアンサー
    • Java
  • 10進数を2進数に変換するプログラムについて

    キーボードから入力された10進数を2進数に変換するプログラムで入力される数は1~1000の値までが入力できる数です。 配列を使うらしいのですがどのようにアルゴリズムをどのように表したらいいのかわかりません! import java.io.*; class Question7_3{ public static void main(String[] args){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.print("数字を入力してください:"); } System.out.print("入力されたデータを2進数に変換すると:"); }catch(NumberFormatException e){ System.out.println("整数以外が入力されました。"); }catch(IOException e){ System.out.println("例外発生:" + e); } } }

  • Javaでファイル転送プログラム

    Javaを用いてファイル転送プログラムを作成しています。 http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352 を参考に作成したのですが、うまく転送できません。 プログラムは以下の通り。 ◎サーバ側 import java.net.*; import java.io.*; public class UMLFileServer { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("An argument should be port and filename"); int servPort = Integer.parseInt(args[0]); String filename = args[1]; System.out.println("Output file name : " + args[1]); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out int totalByte = 0; while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); //Write to file totalByte = totalByte + recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); } System.out.println("Recieved file size : " + totalByte); clntSock.close(); fout.close(); fout = null; } } } ◎クライアント側 import java.net.*; import java.io.*; public class UMLFileClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and filepath"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); String filename = args[2]; byte[] data = new byte[32]; //ソケットの作成 Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = socket.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; while ((len = fin.read(data)) != -1) { totalSize = totalSize + len; System.out.println(new String(data,0,len)); out.write(data, 0, len); } fin.close(); fin = null; System.out.println("size of file : " + totalSize); socket.close(); } } ◎実行結果 Output file name : hiroyasu.txt Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 192.168.71.104 on port 36608 Recieved file size : 0 Wait for accepting... 以上です。どなたか解決方法をご教授ください。

    • ベストアンサー
    • Java
  • throw文について

    上と下のソースプログラムがよく似ているのにもかかわらず上記のプログラムでコンパイルエラー発生する理由がわかりません。 解決方法はpublic static void badMethod()throws IOException{に書き換えるということが分かっていますがイマイチ理屈が分からない次第であります。 たぶん、上記のプログラムはimport文があるからだと思うのですが回答のほどよろしくお願い致します。 (コンパイルエラー) import java.io.IOException; class TryCatch{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(IOException ex){ System.out.println("B"); } catch(Exception e){ System.out.println("C"); } System.out.println("E"); } public static void badMethod(){ throw new IOException(); } } (コンパイル正常) public class X{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(Exception ex){ System.out.println("B"); } finally{ System.out.println("C"); } System.out.println("D"); } public static void badMethod(){ throw new RuntimeException(); } }

専門家に質問してみよう