2011-12-16 3 views
1

基本的には、Javaを使用してファイルに書き込むためにBufferedWriterを使用しようとしています。問題は、私は実際にいくつかの圧縮を行っているので、0から255までの整数を生成しています。ASCII値の文字をそのintと同じにする必要があります。私がファイルに書き込むと、多くのファイルが書き込まれますので、ファイルを読み込んだときに、それを63と読みます。これは明らかに私が望んでいないものです。どのように私はこれを修正することができる任意のアイデア?JavaのファイルにどのようにASCII文字を書き込むのですか?

例コード:

int a = generateCode(character); //a now has an int between 0 and 255 
bw.write((char) a); 

0と255の間で常にあるが、それは時々書き込み '?'

+0

コードを確認できますか? – Tim

+0

にコードを追加しました – Rohan

+0

Base64エンコーディングの使い方は? –

答えて

3

実際にファイルに/からバイトを書き込み/読み込みしようとしています。 (文字指向のデータとは異なる)バイト指向のデータを処理する場合は、InputStreamおよびOutputStreamクラスを使用し、ReaderおよびWriterクラスではないクラスを使用する必要があります。

この場合

、あなたはFileInputStream/FileOutputStreamを使用する必要があり、そしてあなたは、時間がバイトで、読み取りと書き込みを行っている場合BufferedInputStream/BufferedOutputStreamで包みます。

これらの厄介な '?'文字は、Javaが文字とあなたのプラットフォーム用のデフォルトのテキストエンコーディングとの間で変換するときに起こるエンコーディング/デコード処理を行うためです。使用されているエンコーディングスキームによっては、バイトから文字およびバックへの変換が「損失」になることがよくあります。これは、バイト指向のストリームクラスを使用することで回避できます。


(そしてASCIIが7ビットでない8ビット文字セットがあることを指摘答えは100%正しいです。あなたが本当にバイナリオクテットではなく、文字を読み取り/書き込みをしようとしている。)

+0

はい、おそらく、文字の解釈を行うBufferedWriter(したがって "bw")とBufferedReaderを使用しています。 FileOutputStream/FileInputStreamは、使用するのが少し複雑ですが(ちょうど)、必要な結果が得られます。 –

+0

@jowierun - 実際には、エンコーディングはスタックの別の部分で起こります。 'BufferedReader'クラスと' BufferedWriter'クラスはそれぞれ 'Reader'と' Writer'インスタンスをラップします。 –

+0

それは、彼が片方向に書いていて別の方法で読むのでなければ、OPがファイルを読んでいるときにOPがどのように異なった値を得ているかをまだ説明していません。それはかなり少ないと言ってもかまわないでしょう。 – soulcheck

1

あなたは本当に何をしているのか心を補う必要があります。 バイトをファイルに書き込もうとしていますか、符号化されたテキストを書き込もうとしていますか?これらはJavaでは異なる概念なので、バイトI/OはサブクラスInputStreamOutputStreamによって処理され、文字I/OはサブクラスReaderWriterによって処理されます。あなたが実際に書きたいものがファイルへのバイト(私があなたの圧縮の言葉から推測している)であれば、WriterではなくOutputStreamを使用してください。

さらに、混乱があります。これは、「0-255のASCII文字」という言葉から明らかです。 127以上のASCII文字はありません。これを読むには15分かかります:"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)" (by Joel Spolsky)。文字セットとエンコーディングの違いを説明する部分には特に注意してください。Java I/Oを理解する上で重要です。 Java Writersは、クライアント指定のエンコーディングをテキストに適用し、そのバイトをOutputStreamに送信することによって、文字出力をバイト出力に変換するクラスです。

1

Java文字列は16ビット幅の文字に基づいており、明確な仕様がない場合は、その前提を中心に変換を実行しようとします。

次のサンプルコードでは、データを直接バイトとして書き込み、読み取ります。これは、8ビットの数値で、ASCIIの意味が関連付けられています。7ビットのASCIIコードの固定サブセットが印刷可能である

import java.io.*; 
public class RWBytes{ 
    public static void main(String[] args)throws IOException{ 
     String filename = "MiTestFile.txt"; 
     byte[] bArray1 =new byte[5]; 
     byte[] bArray2 =new byte[5]; 
     bArray1[0]=65;//A 
     bArray1[1]=66;//B 
     bArray1[2]=67;//C 
     bArray1[3]=68;//D 
     bArray1[4]=69;//E 
     FileOutputStream fos = new FileOutputStream(filename); 
     fos.write(bArray1); 
     fos.close(); 
     FileInputStream fis = new FileInputStream(filename); 
     fis.read(bArray2); 
     ByteArrayInputStream bais = new ByteArrayInputStream(bArray2); 
     for(int i =0; i< bArray2.length ; i++){ 
      System.out.println("As the bytem value: "+ bArray2[i]);//as the numeric byte value 
      System.out.println("Converted as char to printiong to the screen: "+ String.valueOf((char)bArray2[i])); 
     } 
    } 
} 

、例えばA = 65、発見し、「印刷」と、画面上の一行を降圧「改行」の文字に対応する10。文字指向のスクリーンを操作する他の多くのコードが存在し、これらは目に見えず、タブ、スペースなどのようなスクリーン表現を操作します。例えばベルを鳴らす目的を持った他の制御文字もあります。

127より上位の8ビットは、実装者が望むものとして定義され、下位半分だけが標準的な意味を関連付けています。

一般的なバイナリバイト処理では、そのようなクオンムはありません。データを表す数字です。画面に印刷しようとするときだけ、あらゆる種類の意味があります。

関連する問題