[hadoop 2.7.1]I/OのIntWritableテスト例(詳細)

7593 ワード

使用するオープンソースキット:hamcrest,junit
IDE:MyEclipse 2013 SR1
使用するツール:
1、String java.lang.String.format(Locale l,String format,Object... args)
指定した言語環境、フォーマット文字列、およびパラメータを使用して、フォーマット文字列を返します.
パラメータ:l-フォーマット中に適用する言語環境.lがnullの場合、ローカライズは行われません.format-書式文字列args-フォーマット文字列のフォーマット・ディスクリプタによって参照されるパラメータ.フォーマット・ディスクリプタ以外のパラメータがある場合は、これらの追加のパラメータは無視されます.パラメータの数は可変であり、0であってもよい.パラメータの最大数は、Java Virtual Machine Specificationによって定義されたJava配列の最大次元によって制限されます.nullパラメータに関する挙動は変換に依存する.
戻り値:
書式設定文字列
2、java.lang.StringBuilder
可変文字シーケンス.これにより、StringBufferと互換性のあるAPIが提供されるが、同期は保証されない.このクラスは、文字列バッファが単一スレッドで使用される場合に使用されるStringBufferの簡易置換として設計される(この場合は一般的である).可能であれば、ほとんどの実装ではStringBufferよりも速いため、クラスを優先的に採用することをお勧めします.StringBuilderにおける主な動作は、appendおよびinsertの方法であり、これらの方法は、任意のタイプのデータを受け入れるために再ロードすることができる.各メソッドは、所与のデータを文字列に効率的に変換し、その文字列の文字を文字列ジェネレータに追加または挿入することができる.appendメソッドは、常にこれらの文字をジェネレータの末端に追加する.insertメソッドでは、指定されたポイントに文字を追加します.
たとえば、zが現在のコンテンツが「start」である文字列のジェネレータオブジェクトを参照する場合、このメソッドはz.append("le")を呼び出して文字列ジェネレータに「startle」を含み、z.insert(4, "le")は「starlet」を含むように文字列ジェネレータを変更する.
一般に、sbがStringBuilderの例を参照する場合、sb.append(x)および sb.insert(sb.length(), x)は同じ効果を有する.各文字列ジェネレータには一定の容量があります.文字列ジェネレータに含まれる文字シーケンスの長さがこの容量を超えていない限り、新しい内部バッファを割り当てる必要はありません.内部バッファがオーバーフローした場合、この容量は自動的に増加します.StringBuilderのインスタンスを複数のスレッドに使用するのは安全ではありません.このような同期が必要な場合は、StringBufferを使用することを推奨します.
1、2で16進数文字の変換を実現しました.
	public static String byteToHexString(byte[] bytes, int start, int end) {
		if (bytes == null) {
			throw new IllegalArgumentException("bytes == null");
		}
		StringBuilder s = new StringBuilder();
		for (int i = start; i < end; i++) {
			s.append(format("%02x", bytes[i]));
		}
		return s.toString();
	}

	/** Same as byteToHexString(bytes, 0, bytes.length). */
	public static String byteToHexString(byte bytes[]) {
		return byteToHexString(bytes, 0, bytes.length);
	}

	/** The same as String.format(Locale.ENGLISH, format, objects). */
	public static String format(final String format, final Object... objects) {
		return String.format(Locale.ENGLISH, format, objects);
	}

3、java.io.ByteArrayOutputStream
このような出力ストリームは、byte配列にデータが書き込まれる出力ストリームを実現する.バッファは、データの書き込みに伴って自動的に増加します.データは、toByteArray()およびtoString()を使用して取得することができる.
ByteArrayOutputStreamを無効にします.このようなメソッドは、IOExceptionを生成することなく、ストリームを閉じた後も呼び出されます.4、java.io.DataOutputStream
データ出力ストリームでは、アプリケーションが基本Javaデータ型を適切な方法で出力ストリームに書き込むことができます.その後、アプリケーションは、データ入力ストリームを使用してデータを読み込むことができます.
5、java.io.ByteArrayInputStream ByteArrayInputStreamは、ストリームから読み出されたバイトを含む内部バッファを含む.内部カウンタは、readメソッドが提供する次のバイトを追跡する.
ByteArrayInputStreamを閉じるのは無効です.このようなメソッドは、IOExceptionを生成することなく、ストリームを閉じた後も呼び出されます.6、java.io.DataInputStream
データ入力ストリームを使用すると、アプリケーションは、マシンに関係なく最下位の入力ストリームから基本的なJavaデータ型を読み出すことができます.アプリケーションは、データ出力ストリームを使用して、後でデータ入力ストリームによって読み出されるデータを書き込むことができます.
DataInputStreamはマルチスレッドアクセスに対して必ずしも安全ではありません.スレッドセキュリティはオプションで、このような方法の使用者が担当します.
3、4、5、6を使用して、それぞれ1つのシーケンス化および1つの逆シーケンス化方法を実装します.
	public static byte[] serialize(Writable writable) throws IOException {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		DataOutputStream dataOut = new DataOutputStream(out);
		writable.write(dataOut);
		dataOut.close();
		return out.toByteArray();
	}
	
	public static byte[] deserialize(Writable writable, byte[] bytes)
			throws IOException {
		ByteArrayInputStream in = new ByteArrayInputStream(bytes);
		DataInputStream dataIn = new DataInputStream(in);
		writable.readFields(dataIn);
		dataIn.close();
		return bytes;
	}

完全なテスト例は次のとおりです.
package org.apache.hadoop.io;

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Locale;

import org.junit.Test;

public class THT_testWritable  {

	@Test
	public void walkthroughWithNoArgsConstructor() throws IOException {
		IntWritable writable = new IntWritable();
		writable.set(1234);
		checkWalkthrough(writable);
	}

	@Test
	public void walkthroughWithValueConstructor() throws IOException {
		IntWritable writable = new IntWritable(1234);
		checkWalkthrough(writable);
	}

	private void checkWalkthrough(IntWritable writable) throws IOException {

		byte[] bytes = serialize(writable);
		assertThat(bytes.length, is(4));
		assertThat(byteToHexString(bytes), is("000004d2"));

		IntWritable newWritable = new IntWritable();
		deserialize(newWritable, bytes);
		assertThat(newWritable.get(), is(1234));
	}

	@Test
	public void comparator() throws IOException {
		RawComparator<IntWritable> comparator = WritableComparator
				.get(IntWritable.class);

		IntWritable w1 = new IntWritable(163);
		IntWritable w2 = new IntWritable(67);
		assertThat(comparator.compare(w1, w2), greaterThan(0));

		byte[] b1 = serialize(w1);
		byte[] b2 = serialize(w2);
		assertThat(comparator.compare(b1, 0, b1.length, b2, 0, b2.length),
				greaterThan(0));
	}

	@Test
	public void test() throws IOException {
		IntWritable src = new IntWritable(163);
		IntWritable dest = new IntWritable();
		assertThat(writeTo(src, dest), is("000000a3"));
		assertThat(dest.get(), is(src.get()));
	}

	/**
	 * Given an array of bytes it will convert the bytes to a hex string
	 * representation of the bytes
	 * 
	 * @param bytes
	 * @param start
	 *            start index, inclusively
	 * @param end
	 *            end index, exclusively
	 * @return hex string representation of the byte array
	 */
	public static String byteToHexString(byte[] bytes, int start, int end) {
		if (bytes == null) {
			throw new IllegalArgumentException("bytes == null");
		}
		StringBuilder s = new StringBuilder();
		for (int i = start; i < end; i++) {
			s.append(format("%02x", bytes[i]));
		}
		return s.toString();
	}

	/** Same as byteToHexString(bytes, 0, bytes.length). */
	public static String byteToHexString(byte bytes[]) {
		return byteToHexString(bytes, 0, bytes.length);
	}

	/** The same as String.format(Locale.ENGLISH, format, objects). */
	public static String format(final String format, final Object... objects) {
		return String.format(Locale.ENGLISH, format, objects);
	}
	
	public static byte[] serialize(Writable writable) throws IOException {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		DataOutputStream dataOut = new DataOutputStream(out);
		writable.write(dataOut);
		dataOut.close();
		return out.toByteArray();
	}
	
	public static byte[] deserialize(Writable writable, byte[] bytes)
			throws IOException {
		ByteArrayInputStream in = new ByteArrayInputStream(bytes);
		DataInputStream dataIn = new DataInputStream(in);
		writable.readFields(dataIn);
		dataIn.close();
		return bytes;
	}

	
	public static String writeTo(Writable src, Writable dest)
			throws IOException {
		byte[] data = deserialize(dest, serialize(src));
		return byteToHexString(data);
	}
	
	public static String serializeToString(Writable src) throws IOException {
		return byteToHexString(serialize(src));
	}

}

実行結果は次のとおりです.