2011年9月3日土曜日

Javaの入出力(Stream)について

 Javaの入出力は、java.io.* クラスを使って行います。

JavaのStream

 Javaでは、各種データをストリームとして扱うことができます。 ストリームデータには、ファイル内のデータ、標準入力や標準出力、通信データ、文字列データなどがあります。 
 ストリームには、バイト単位に扱う最も下位のクラスと、バッファリングしたり文字コード変換を行うクラスと、行単位で入出力を行うクラスがあり、組み合わせて使います。

バイトストリームを扱うStreamクラス

 バイト単位で扱うストリームで、各種データをバイトストリーム形式に変換するクラスです。

クラス名 機能 形式 入出力
FileInputStream ファイルのデータを読み込むバイトストリームを作成 バイト 入力
FileOutputStream ファイルにデータを書き込むバイトストリームを作成 バイト 出力
Socket::getInputStream() 通信ソケットから受信するバイトストリームを取得 バイト 入力
Socket::getOutPutStream() 通信ソケットに送信するバイトストリームを取得 バイト 出力
ServletRequest::getInputStream() サーブレットのリクエスト入力バイトストリームを取得 バイト 入力
ServletResponse::getOutputStream() サーブレットのレスポンス出力バイトストリームを取得 バイト 出力

バイトストリームと文字ストリームの変換を行うStreamReader/Writerクラス

 バイトストリームと文字ストリームの変換を行うクラスで、InputStreamReaderクラスとOutputStreamWriterクラスがあります。 
 文字コード変換などの機能を持っています。 文字コード変換処理が不要な場合は、使う必要はありません。

クラス名 機能 形式 入出力
InputStreamReader バイトストリームのデータを、文字ストリームに変換
指定された「文字エンコーディング」に従って、文字コード変換
バイト→文字
エンコードあり
入力
OutputStreamWriter 文字ストリームのデータを、バイトストリームに変換
指定された「文字エンコーディング」に従って、文字コード変換
文字→バイト
エンコードあり
出力

 Javaでサポートしている日本語のエンコードには、以下の種類があります。 InputStreamでは、JISAutoDetectを指定すると、文字コードを自動判定しUnicodeに変換してくれます。 当然ですが、Readerクラスでのみ指定可能です。
 文字コードについての詳細は、文字コードについてのページを参考にしてください。 
 JDK1.1では、Java独自形式しかサポートしていませんでしたが、現在では、IANAが規定している標準的なエンコード形式にも対応しています。

Javaエンコード名 対応する文字コード
ISO-2022-JP
ISO2022JP
JISコード(ISO-2022-JP)
Shift_JIS
SJIS
シフトJISコード(Shift_JIS)
EUC-JP
EUC_JP
日本語EUCコード(EUC-JP)
UTF-8 Unicode(UTF-8)
UTF-16 Unicode(UTF-16)
JISAutoDetect 文字コードの自動判定(Readerクラスのみ利用可)

文字ストリームを扱うReader/Writerクラス

 文字ストリームを扱うクラスで、行単位の入出力が可能なクラスです。 Streamクラスや、StreamReader/StreamWriterクラスと組み合わせて利用します。 
 バッファリングせずにバイト単位で処理する場合は、使う必要はありません。

クラス名 機能 形式 入出力
BufferedReader 文字、配列、行をバッファリングして、文字ストリームから効率良く入力 文字 入力
BufferedWriter 文字、配列、行をバッファリングして、文字ストリームに効率良く出力 文字 出力
PrintWriter フォーマットされたオブジェクトの表現を文字ストリームに出力 文字 出力

ソースの記述例

import java.io.*;  // ファイルからバイト単位で読み込む例 FileInputStream in = new FileInputStream("ファイル名"); // ファイルからバイト単位で書き込む例 FileOutputStream out = new FileOutputStream("ファイル名");  // Shift_JISのファイルから文字コード変換して読み込む例 BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("ファイル名"), "Shift_JIS")); // Shift_JISのファイルから文字コード変換して書き込む例 PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream("ファイル名"), "Shift_JIS"));  // サーブレットでリクエストデータを文字コードを自動変換して読み込む例 BufferedReader in = new BufferedReader(new InputStreamReader(req.getInputStream(), "JISAutoDetect")); // サーブレットでレスポンスデータをEUCコードに変換して書き込む例 PrintWriter out = new PrintWriter(new OutputStreamWriter(res.getOutputStream(), "EUC-JP")); 

Java入出力

■ 入出力

データの 入出力 には多数のクラスが用意されています。クラスの階層構造を下記に示します。InputStream系クラスは主にバイナリデータを扱う際に、Reader系クラスは主にテキストデータを扱う際に用いられます。

□ Object ├□ InputStream(抽象クラス:主にバイナリ用) │├□ AudioInputStream │├□ ByteArrayInputStream │├□ FileInputStream(バイナリファイル読み込み) │├□ FilterInputStream ││├□ BufferedInputStream(非推奨) ││├□ CheckedInputStream ││├□ CipherInputStream ││├□ DataInputStream ││├□ DigestInputStream ││├□ InflaterInputStream │││├□ GZIPInputStream │││└□ ZipInputStream │││ └□ JarInputStream ││├□ LineNumberInputStream ││├□ ProgressMonitorInputStream ││└□ PushbackInputStream │├□ ObjectInputStream │├□ PipedInputStream │├□ SequenceInputStream │└□ StringBufferInputStream └□ Reader(抽象クラス:主にテキスト用)  ├□ BufferedReader(1行ずつ読み込む)  │└□ LineNumberReader  ├□ CharArrayReader  ├□ FilterReader  │└□ PushbackReader  ├□ InputStreamReader(文字コード指定が可能)  │└□ FileReader(テキストファイル読み込み)  ├□ PipedReader  └□ StringReader 

■ バイナリファイルを読み込む(FileInputStream)

FileInputStream は指定したファイルをバイナリファイルとして読み込みます。

§FileInputStreamTest.java
import java.io.*;  class FileInputStreamTest {     public static void main(String[] args) {         try {             FileInputStream in = new FileInputStream("file.txt");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 

シフトJISの「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。82a0 は「あ」、82a2 は「い」、82a4 は「う」のシフトJIS文字コード、d は復帰コード(CR)、a は改行(LF)コードです。漢字コードがそのまま、1バイトずつ読み込まれています。

82 a0 82 a2 82 a4 d a 

■ テキストファイルを読み込む(InputStreamReader)

InputStreamReader は指定したストリームを、指定した文字コードで構成されるテキストファイルとして読み込みます。

§InputStreamReaderTest.java
import java.io.*;  class InputStreamReaderTest {     public static void main(String[] args) {         try {             FileInputStream is = new FileInputStream("file.txt");             InputStreamReader in = new InputStreamReader(is, "SJIS");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 

「あいう」という内容のファイルを読み込んだ場合、結果は次のようになります。

3042 3044 3046 d a 

3042 は「あ」、3044 は「い」、3046 は「う」の Unicode表現です。InputStreamReader を用いることでシフトJIS のファイルを Java の標準文字コードである Unicode に変換しながら読み込むことができました。

文字コード "SJIS" を省略した場合は、プラットフォームに依存したデフォルト(省略時の)文字コードで読み出されます。日本語 Windows の場合のデフォルト文字コードは "MS932" になります。SJIS と MS932 はほとんど同じものですが、「〜」や「‖」など一部の文字で動作が異なります。

文字コード 説明
ISO-8859-1 ASCII。
ISO-2022-JP JISコード。
Shift_JIS JDK1.1 までは SJIS と同義。JDK1.2 からは MS932 と同義。
SJIS シフトJIS。
MS932 Microsoft 932。シフトJISとほぼ同様だが若干異なる。
CP932 Code Page 932。MS932 とほぼ同様だが若干異なる。
EUC_JP EUC。

使用可能な文字コードに関しては下記のページを参照してください。

■ テキストファイルを読み込む(FileReader)

FileReader は InputStreamReader の面倒さを解消するために用意されたサブクラスです。InputStreamReader より簡単に扱えますが、文字コードには常に省略時文字コードが用いられます。

§FileReaderTest.java
import java.io.*;  class FileReaderTest {     public static void main(String[] args) {         try {             FileReader in = new FileReader("file.txt");             int ch;             while ((ch = in.read()) != -1) {                 System.out.print(Integer.toHexString(ch) + " ");             }             in.close();         } catch (IOException e) {             System.out.println(e);         }     } } 
FileReader in = new FileReader("file.txt"); 

は、下記のコードとほぼ同じ意味を持ちます。

FileInputStream is = new FileInputStream("file.txt"); InputStreamReader in = new InputStreamReader(is); 

■ ファイルを1行ずつよみこむ(BufferedReader)

ファイルを 1行ずつ読み込むには BufferedReader を用います。

§BufferedReaderTest.java
import java.io.*;  class BufferedReaderTest {     public static void main(String[] args) {         try {             FileReader in = new FileReader("file.txt");             BufferedReader br = new BufferedReader(in);             String line;             while ((line = br.readLine()) != null) {                 System.out.println(line);             }             br.close();             in.close();         } catch (IOException e) {             System.out.println(e);         }     } }
 
 
 

読み込む時に文字コードを指定する

デフォルトのエンコードの設定って?

ファイルを読み込んだり書き込んだりするときに勝手に使ってくれるデフォルトの文字コードが設定されてるんだって。

それを調べる方法は
System.out.println(System.getProperty("file.encoding"));
ってするとコンソールにでてくるぜよ。

うちの開発環境での「MS932」 
ってなんだろ?(無知

MS932(Windous-31J)

そんなときにはうぃきぺでぃあ 
http://ja.wikipedia.org/wiki/Windows-31J

またびるげいつですか。。。

まてよ。 
Windous-31Jってよく目にするわ。 
JSPで文字コードの設定とかするときばしばし見かけますなあ。 
シフトJISの拡張版とな。

開発環境はWinマシンだからデフォルトがMS932なわけね。で、ファイル読み込みとか書き込みのときに文字コード指定してないからこのMS932で読んじゃってるわけかあ。 
なるほど。。

つまりこれをUTF-8にすればいいわけね。 
やっちゃおう。やってみますよ。


読み込む時に文字コードを指定する

うちのはcsvファイルを入力するです。 
txtとかバイナリファイルなら↓のやり方で大丈夫だって。

文字コードを指定しなくていいならFileReader

これまでこんな風に読み込んでました。
BufferedReader inFile = new BufferedReader(new FileReader(filename.csv));

読む時はこんな。例外は省略
while (inFile.ready()) { 
System.out.println(inFile.readLine()); 
} 
inFile.close();

文字コードを指定するならInputStreamReader

今回使うのはこれこれ。
InputStreamReader(Stream,文字コード)

これはバイトストリーム(Stream)を指定しないといかんのでFileInputStreamを作ってファイル名を指定。それを使います。 
 とほほさんのページ>http://www.tohoho-web.com/java/file.htm#FileInputStream

InputStreamReader isr = new InputStreamReader(new FileInputStream(filename.csv),"UTF-8"));
これで文字コードは指定できた。

実際にはこんな風に使ってみた

ああでも1行ずつ読み込んでくれてるってのは生かしたい。上のままだと読むだけ。

じゃあBufferedReaderを残してFileReaderの代わりにInputStreamReaderを使ってみましたよ。どうよ?
BufferedReader inFile = new BufferedReader(new InputStreamReader(new FileInputStream(filename.txt),"UTF-8"));

ラップしまくりでわかんないですね。 
これと同じ意味
FileInputStream fis = new FileInputStream(filename.txt); 
InputStreamReader in = new InputStreamReader(fis,"UTF-8"); 
BufferedReader inFile = new BufferedReader(in);

BufferdReaderでラップしたので1行ずつ読み込んでくれました。 
使い方は最初のときと同じ。変わったのはFileRearderがInputStreamRearderにしただけ。


書き込む時に文字コードを指定する

やはりcsvファイルとして書き込むです。

文字コードを指定しなくていいなら

これまでこんな風に書き込んでました。
PrintWriter outFile = new PrintWriter(new BufferedWriter(new FileWriter(new File(filename.csv).getAbsolutePath())));

書く時はこんな。例外は省略
for (int i = 0 ; i < 10 ; i++) { 
outFile.println("これで,おっけー?," + i + "回目" ); 
} 
outFile.close();

文字コードを指定するならOutputStreamWriter

今回使うのはこれこれ。
OutputStreamWriter(Stream,文字コード)
読み込みの時と似てるね。

やっぱりFileOutputStreamを作ってファイル名を指定。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename.csv),"UTF-8");
これで文字コードは指定できた。

実際にはこんな風に使ってみた

やっぱ1行ずつ書き込むのって生かしたい。

じゃあBufferedWriterを残してFileWriterの代わりにOutputStreamWriterを使ってみましたよ。どうよ?
PrintWriter outFile = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename.csv),"UTF-8")));

ラップしまくりでわかんないですね。 
使い方は最初のときと同じ。変わったのはFileWriterがOutputStreamWriterにしただけ。

SQLiteのメモ

◆ ソフト系

◆ Tips

  • データベースを作るときの拡張子
    『.db』『.db3』『.sqlite3』
  • Androidで作成したデータベースのエンコード
    unicode(UTF-8)
  • Windowsのコマンドプロンプトでの注意
    コマンドプロンプトは、エンコードが『MS932』(Shift-JIS)なので、コマンドプロンプトで日本語を含むDBを作成してSQLite StudioやPupSQLiteで開くと文字化け(Androidは試してない)。SQLite ControlCenter 日本語版の設定「強制S-JIS」で文字化けしない

2011年9月2日金曜日

Installation Guide--XDAndroid

Installation of the XDAndroid project releases is fairly simple. This short, concise guide will outline what must be done to boot into an XDAndroid system on your device.

[edit]Downloading and Unpacking

Download an XDAndroid project release from the files repository (North American Mirror). The latest system is Version 2.2.2 FRX07 and may be downloaded as a system image update from here - system image only. However, most prefer the full bundle, which is available here - full bundle.

The XDAndroid project releases are typically packed as Zip files. Zip and most other archives may be unpacked by the 7-Zip program.

XDAndroid currently requires a MicroSD card for use. This SD card needs to be inserted into your phone and must remain in the phone while XDAndroid is running. It should be formatted (Full Format) FAT32. We recommend using the HP Tool to format if you use Windows. The card should also be at least 512mb, with a 1gb card recommended.

Unpack the entire XDAndroid 'full bundle' to the root of your SD card. If you want to extract everything into a folder (andboot, FRX06, etc) that's fine - if haret.exe et al aren't at the root of the SD, you need to specify a rel_path in the startup.txt file. More on this later.

It is recommended that you update the various components of XDAndroid with incremental updates. Please see Incremental Updates for information on updating those pieces.

[edit]Configuring XDAndroid

The XDAndroid release package is unified. This means the project can release a single package which supports all of the devices capable of running the system. As a consequence, the user must do some minor configuration to tell the system which device it will be running on.

This configuration is done within a startup.txt file. For convenience, a variety of startup.txt files have been provided in the STARTUPS directory wherever you extracted the package to. The appropriate startup.txt needs to be copied into the root directory (or where you run haret.exe from.) For example, I like to run Android two folders deep. Assume /sdcard is the root of the SD - so my Android install is in /sdcard/Androids/FRX06. In this case, you need to put a rel_path=Androids/FRX06 statement in the startup.txt file, between the quotes after set cmdline. Obviously you need to change this statement to however your build is setup - if everything is at the root of the SD this statement is not necessary, and if everything is in a folder,andboot then rel_path=andboot. In STARTUPS is a directory for each supported device. See the table below to find which directory serves certain devices. The FAQ also has some useful tips on sorting out which device you have.

Directory

Devices

RAPH

GSM Touch Pro

RAPH800

CDMA Touch Pro

FUZE

AT&T Fuze (GSM Touch Pro)

DIAMOND

GSM Touch Diamond

DIAM500

CDMA Touch Diamond

BLACKSTONE

Touch HD

TOPAZ

GSM Touch Diamond2

RHODIUM

GSM Touch Pro2

TILT2

AT&T Tilt2 (GSM Touch Pro2)

Once the proper startup.txt is in place, the system may be booted.

[edit]Booting the System

Currently, the XDAndroid system must be booted while running Windows Mobile, using HaRET in a manner similar to loadlin. That is, it is not currently possible to boot XDAndroid immediately from the BIOS (à la GRUB or LILO). This is because XDAndroid is not currently able to properly initialize all of the hardware devices, and depends on Windows Mobile to do so.[1]

Using the Windows Mobile File Manager (or your preferred alternative), navigate to your MicroSD card and into the directory that was setup earlier.

Run the program haret.exe. This will load the Linux kernel into your device's memory and begin executing it. This will cause Windows Mobile to shut down immediately and ungracefully (though due to the TFAT filesystem on the device's storage, there should be no worry of data loss).

During boot, you should see console text scroll along the screen. This text is white on a black background and is part of the normal boot process.

The first boot into XDAndroid will take some time. The device must do a number of things: create a data filesystem where apps and settings are stored; unpack the current kernel's modules; calibrate the screen; and set up and execute the Android system.

The screen calibration is a rudimentary five-point location check very similar to what Windows Mobile does on first boot of a newly installed ROM. The program will prompt the user to tap each consecutive box in the center, firmly and shortly. After this calibration is complete, the system will begin running Android. If you have any issues with calibrating, see the FAQ.

Once the system begins to run Android itself, you will see a boot animation instead of the old console text. At this point, the first boot of Android must do quite a bit of work to install and optimize packages, configure default settings, and provision the device for the user. Overall first boot time will likely be up to 5 or 10 minutes. Even after seeing the UI/lock screen, you may want to let the device settle for a few additional minutes.

[edit]Initial Android Setup

After all the waiting, you should see a lock screen. Unlock the device and enjoy! Initially you might want to go to Settings -> Accounts & Sync and setup a gmail sync account so you can use the Market and sync your contacts.

Your XDAndroid system is fully configured and ready to use. Congratulations!

 

http://files.xdandroid.com/

http://xdandroid.com/wiki/Installation_Guide