marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (17) ファイル入出力

2010年04月05日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (17) ファイル入出力
================================================================

ファイル入出力を行います。

今回は、光センサーの調整を行い、このデータをファイルに格納してお
きます。
そのファイルに格納した値を入力することで、プログラムを起動するた
びに光センサーの調整を行う必要がなくなります。


■ファイル出力

光センサーからreadNormalizedValue()メソッドを使って、暗いときの
値と明るいときの値をファイルに保存します。


---
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーの最小値と最大値をint型でファイルに保存する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class Calibrator02 {

    public static void main(String[] args) throws Exception {

        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // ファイルを作成する。
        File file = new File("light.dat");              // (1)
        file.delete();                                  // (2)
        file.createNewFile();                           // (3)
        DataOutputStream out = 
                new DataOutputStream(
                        new FileOutputStream(file));    // (4)
        
        // 最小値を設定する。
        System.out.println("Press Button if dark.");
        Button.waitForPress();
        int lowValue = lightSensor.readNormalizedValue();
        lightSensor.setLow(lowValue);
        System.out.println(lowValue + " " + 
                            lightSensor.readValue());
        out.writeInt(lowValue);                         // (5)
        
        // 最大値を設定する。
        System.out.println("Press Button if bright.");
        Button.waitForPress();
        int highValue = lightSensor.readNormalizedValue();
        lightSensor.setHigh(highValue);
        System.out.println(highValue + " " + 
                            lightSensor.readValue());
        out.writeInt(highValue);

        // ファイルを閉じる
        out.close();                                    // (6)
    }
}
---

□ File file = new File("light.dat");              // (1)

ファイル名を指定して、Fileオブジェクトを生成します。

Fileクラスのコンストラクタ
---
File(String name) 
---


Fileクラスの主なメソッド
---
 boolean         createNewFile()
 boolean         delete()
 boolean         exists()
 static int      freeMemory()
 String          getName()
 long            length()
 static File[]   listFiles()
 void            moveToTop()
 static void     reset()
 boolean         setReadOnly() 
---


□ file.delete();                                  // (2)
□ file.createNewFile();                           // (3)

新規にファイルを生成したいので、一度、指定されたファイルを削除
(delete)してから、新規に作成(createNewFile)しなおします。
leJOSの場合は、一度削除してからでないと、同じファイル名の場合、
不具合が起きる場合があります。


□ DataOutputStream out = new DataOutputStream(
                  new FileOutputStream(file));     // (4)

DataOutputStreamオブジェクトを指定したファイルを基に作ります。
このクラスを使うと、プリミティブ型の Java データを移植性のある形
で出力ストリームに書き込むことができます。

DataOutputStreamクラスの主なコンストラクタ
---
DataOutputStream(OutputStream out) 
---

DataOutputStreamクラスは、フィルタークラスとして、OutputStreamオ
ブジェクトをその生成時に指定します。ここでは、コンストラクターの
引数として、FileOutputStreamオブジェクトを指定しています。


DataOutputStreamクラスの主なメソッド
---
 void     close() 
 void     flush()
 int      size()
 void     write(byte[] b, int off, int len)
 void     write(int b)
 void     writeBoolean(boolean v)
 void     writeByte(int v)
 void     writeChar(int v)
 void     writeFloat(float v)
 void     writeInt(int v)
 void     writeShort(int v) 
---


FileOutputStreamクラスの主なコンストラクタ
---
FileOutputStream(File f)
FileOutputStream(File f, boolean append)
---


□ out.writeInt(lowValue);                         // (5)

int 型データを、上位バイトを先頭とする 4 バイトデータ(ビックエン
ディアン)として基本となる出力ストリームに書き込みます。


□ out.close();                                    // (6)

出力ストリームを閉じ、これに関連するすべてのシステムリソースを解
放します。 


■ファイル入力

ファイルから光センサーの最小値と最大値を取得して、センサーを調整
します。

---
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

import lejos.nxt.Button;
import lejos.nxt.LightSensor;
import lejos.nxt.SensorPort;

/**
 * 「トライボット」使用
 * 光センサーの最小値と最大値をファイルから読み取り、調整する。
 * 
 * @author marunomaruno
 * @version 1.0, 2010/03/15
 * @since 1.0
 */
public class Calibrator03 {

    public static void main(String[] args) throws Exception {

        // 光センサーオブジェクトをポート3で生成する。
        LightSensor lightSensor = new LightSensor(SensorPort.S3);

        // ファイルを作成する。
        File file = new File("light.dat");
        DataInputStream in = 
                new DataInputStream(
                        new FileInputStream(file));     // (1)
        
        // 最小値を設定する。
        int lowValue = in.readInt();                    // (2)
        lightSensor.setLow(lowValue);
        System.out.println(lowValue);
        
        // 最大値を設定する。
        int highValue = in.readInt();
        lightSensor.setHigh(highValue);
        System.out.println(highValue);

        // ファイルを閉じる
        in.close();                                     // (3)
        
        // 終了メッセージ
        System.out.println("Press button for exit program.");
        Button.waitForPress();
    }
}
---

□ DataInputStream in = 
           new DataInputStream(
                   new FileInputStream(file));     // (1)

データ入力ストリームにより、アプリケーションは、プリミティブ型の
 Java データを基本となる入力ストリームからマシンに依存せずに読み
込むことができます。

DataInputStreamクラスの主なコンストラクタ
---
DataInputStream(InputStream in)  
---

DataInputStreamクラスは、フィルタークラスとして、InputStreamオブ
ジェクトをその生成時に指定します。ここでは、コンストラクターの引
数として、FileInputStreamオブジェクトを指定しています。


DataInputStreamクラスの主なメソッド
---
 void     close() 
 boolean  readBoolean()
 byte     readByte()
 char     readChar()
 double   readDouble()
 float    readFloat()
 void     readFully(byte[] b)
 void     readFully(byte[] b, int off, int len)
 int      readInt()
 long     readLong()
 short    readShort()
 int      readUnsignedByte()
 int      readUnsignedShort()
 String   readUTF()
 int      skipBytes(int n) 
---


FileInputStreamクラスの主なコンストラクタ
---
FileInputStream(File f) 
---


□ int lowValue = in.readInt();                    // (2)

4 バイトの入力データを読み込んで、int 値を返します。


□ in.close();                                     // (3)

入力ストリームを閉じ、これに関連するすべてのシステムリソースを解
放します。 


                                                           以上