2011-08-08 3 views
15

圧縮のためにバイナリ形式のファイルにデータを書き込もうとしています。データは完全に浮動小数点で構成されていますので、データを0〜65535の間の整数に量子化して、2ビットの符号なし整数としてデータを書き込んで最終的に空間を節約することにしました。しかし、人間が読めるAsciiの代わりにバイナリファイルにその量子化データを出力する必要があります。このとき バイナリデータをJavaでファイルに出力する方法は?

は、私のように、ファイルへの書き込み

public void generateBinaryRioFile(String materialLibrary, 
     String outputFile, String group, String mtlAux) { 

    try { 

     // Create file 
     FileWriter fileStream = new FileWriter(outputFile); 
     try { 

      BufferedReader br = new BufferedReader(new FileReader(new File(
        "idx.txt"))); 

      while ((line = br.readLine()) != null) { 
       writer.write(line + "\n"); 
      } 
      try { 
       br.close(); 

      } catch (FileNotFoundException e) { 
       e.getMessage(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      }   BufferedWriter writer = new BufferedWriter(fileStream); 

しかし.txtファイル内の文字列として、既に量子化されたデータを含むファイルOUTPUTFILE

@paramをやっているものです人間が読める文字列。私はそれをバイナリデータとして書く必要があります。 Javaでこれをどうやって行うのですか?

+0

あなたの意欲は何ですか? –

+1

これまで行ってきたことを私が助けてくれるようなコードを表示してください。 –

+0

@ Kit Ho 私の上司から、その背後にある動機は、複数のアスキー文字をファイルに書き込むのではなく、ファイルサイズを増やし、スペースを節約するためにバイナリで書くことができます。 ファイルはインターネット経由で送信され、データはwebglで3Dモデルを生成するために使用されます。モデルをできるだけ高速にロードしたい – deztructicus

答えて

32

多分、この断片が役立つでしょう。

int i = 42; 
DataOutputStream os = new DataOutputStream(new FileOutputStream("C:\\binout.dat")); 
os.writeInt(i); 
os.close(); 
+0

そのように単純です: –

+2

2バイトの 'writeShort()'のみを書きたい場合 –

+2

@Ratchet freak Javaショートレンジは-32,768から32,767までです(http://download.oracle.com/javase/tutorialによる) /java/nutsandbolts/datatypes.html)。 OPがJavaショートを使用している場合(これは素晴らしいアイデアです。ありがとうございます)、書き込み前に32,768を減算し、読み取り後に32,768を加算してください。 – rajah9

2

DataOutputStreamはどうですか? 2つのデータ整数を含むintを書くことができます。

DataOutputStream dos = new DataOutputStream(new FileOutputStream(<path>)); 
ArrayList<Integer> list = new ArrayList<Integer>(); 
int sum; 
for(int i = 0; i < list.size(); i++) { 
    if(i%2!=0){ 
     sum |= list.get(i).intValue()<<16; 
     dos.writeInt(sum); 
    } else { 
     sum = list.get(i).intValue(); 
    } 
} 
関連する問題