解答例 - 実習課題1 - 3.ファイルチャネル
(実習課題1)
以下の仕様を満たすアプリケーションを作成してください。
- ファイルを読み込み、その内容をすべてビット反転した新しいファイルを出力するプログラム。
- 1番目の引数で入力するファイル名を指定すること。
- 2番目の引数で出力するファイル名を指定すること。
- ファイルの入出力にはFileChannelを使用すること。
- 処理にかかった時間をミリ秒単位でコンソールに出力すること。
解答例
public class Main { private static final String IN_FILE = "in.dat"; private static final String OUT_FILE = "out.dat"; public static void main(String[] args) { Main buff = new Main(); String inFile = IN_FILE; String outFile = OUT_FILE; long start = System.currentTimeMillis(); buff.turnBit(inFile, outFile); long end = System.currentTimeMillis(); System.out.print("経過時間:"); System.out.println((end - start) + "msec\t"); } private void turnBit(String inFile, String outFile) { try { FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); FileChannel inCh = input.getChannel(); FileChannel outCh = output.getChannel(); long size = 0; size = inCh.size(); ByteBuffer buffer = null; try { // バッファ生成 buffer = ByteBuffer.allocate((int) size); } catch (Throwable e) { e.printStackTrace(); } inCh.read(buffer); // 内容を反転する byte[] bytes = turnBit(buffer); outCh.write(ByteBuffer.wrap(bytes)); outCh.force(false); input.close(); output.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private byte[] turnBit(ByteBuffer buffer) { int len = 8 * buffer.capacity(); // ビット配列を生成する BitArray array = new BitArray(len); byte[] bytes = buffer.array(); int x = 0; for (int i = 0; i < bytes.length; i++) { for (int j = 0; j < 8; j++) { if (x > len) break; int mask = 1 << j; boolean value = (mask & bytes[i]) != 0; array.set(x, value); x++; } } // 反転 for (int i = 0; i < len; i++) { boolean bit = array.get(i); array.set(i, !bit); } return array.toByteArray(); } }