libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

Google Cloud Storageを利用する (5/5)

作成:2012-06-10 11:20
更新:2012-06-10 11:31

■バイナリファイルの読み書きは?

テキストファイルの読み書きについてはこれでわかりました。ではバイナリファイルは? 実は、こちらはもっと簡単なのです。読み書き共に、ReaChannel/WriteChannelを作成するところまでは同じです。これらのインスタンスが用意できたら、そこから直接メソッドを呼び出してバイナリデータを読み書きできるのです。

・バイナリデータの読み込み
《ReaChannel》.read(《ByteBuffer》);

・バイナリデータの書き出し
《WriteChannel》.write(《ByteBuffer》);

readは、バイナリデータを読み込んで引数に用意したByteBufferにコピーします。またwriteは引数のByteBufferをバイナリデータとして書き出します。これらを利用することでバイナリデータの読み書きも可能になります。

では、先ほどのサンプルを修正して、バイナリファイルとして保存するようにしてみましょう。基本的なインターフェイス(JSP部分)は同じですが、テキストファイルではなく、バイナリデータに変換して保存をしてみます。(下のリストを参照)

では、ファイルの書き出し部分から見てみましょう。ここでは、GSFileOptionsBuilder を作成する際、Mimeタイプを"binary/octet-stream"にしてあります。
GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
        ……略……
        .setMimeType("binary/octet-stream")
そして、テキストからByteBufferインスタンスを作成し、それをwriteで出力しています。
String data = title + "\n\n" + content;
ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
writeChannel.write(buffer);
これで、バイナリデータを書きだすことができます。テキストよりだいぶ簡単ですね。――続いて読み込み部分を見てみましょう。
ByteBuffer buffer = ByteBuffer.allocate(1024);
readChannel.read(buffer);
あらかじめByteBufferインスタンスを用意しておき、readでこのインスタンスにバイナリデータを読み込みます。後は、ここからStringを生成して出力するだけですね。
out.println(new String(buffer.array()));
これで、保存したバイナリデータからテキストを生成して表示できました。今回はテキストのエンコードなど何も考えていませんから、日本語などは読み込む際に文字化けしてしまいます。しかしまぁ、バイナリデータの読み書きの基本はこれでわかったのではないでしょうか。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package com.tuyano.libro.mygaeapp;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;

import javax.servlet.http.*;

import com.google.appengine.api.files.*;
import com.google.appengine.api.files.GSFileOptions.GSFileOptionsBuilder;

@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {
	public static final String BUCKETNAME = "my_cloud_data";
	public static final String FILENAME = "sample.data";

	public void doGet(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		response.setContentType("text/plain");
		request.setCharacterEncoding("utf8");
		response.setCharacterEncoding("utf8");
		PrintWriter out = response.getWriter();
		String filename = "/gs/" + BUCKETNAME + "/" + FILENAME;
		FileService fileService = FileServiceFactory.getFileService();
		AppEngineFile readableFile = new AppEngineFile(filename);
		FileReadChannel readChannel = null;
		try {
			readChannel = fileService.
				openReadChannel(readableFile, true);
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			readChannel.read(buffer);
			out.println(new String(buffer.array()));
		} catch(FileNotFoundException e){
			out.println("no file...");
		} finally {
			try {
				readChannel.close();
			} catch(Exception ex){}
		}
	}

	public void doPost(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		response.setContentType("text/plain");
		request.setCharacterEncoding("utf8");
		response.setCharacterEncoding("utf8");
		String title = request.getParameter("title");
		String content = request.getParameter("content");
		FileService fileService = FileServiceFactory
				.getFileService();
		GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
				.setBucket(BUCKETNAME)
				.setKey(FILENAME)
				.setMimeType("binary/octet-stream")
				.setAcl("public_read");
		AppEngineFile file = fileService
				.createNewGSFile(optionsBuilder.build());
		FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
		String data = title + "\n\n" + content;
		ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
		writeChannel.write(buffer);
		writeChannel.closeFinally();
		response.sendRedirect("/helo.jsp");
	}

}
※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る