Tagbangers Blog

ターミナルのコマンドをJavaで作る

こんにちは、藤岡です。

今週も学んだことを共有していきたいと思います。

今週はパソコンの受け継ぎを行ったので、MBAからMBPにグレードアップしました。

いつの年のものかは知りませんが、明らかにPCの解像度が綺麗になっていたので、時代の進歩を感じました。

また、キーボードもApple純正の「Magic Keyboard」になり、ディスプレイも2画面から3画面となったことで、作業がかなり快適になりました。

自分にはもったいない環境だとは思いますが、是非とも活用していきたいです。


さて、今週は主にJavaについて学んだのですが、以下の2つの課題を出していただきました。

  1. javaでcatコマンドを作る
  2. javaでlsコマンドを作る(オプション付き)

それぞれ解説していきます。


1.catコマンド

catコマンドとは、ファイルを実行したり、標準出力をそのまま入力させるターミナルのコマンドのことです。

そして、それをJavaで実装するというのが今回挑戦したことです。完成品はこちらです。

このプログラムの特徴は、ファイルを読み込む時と、標準入出力させる時とで処理をまとめることができることです。

普通に考えれば処理を分けなければならないと思いますが、InputStreamReaderが文字コードを指定できるため、このようにまとめることができています。

また、文字を読み込む処理については、readメソッドを用いています。while中の処理は、-1が返ってくるまで繰り返し文字を出力させるというものです。さらに、ストリームで入出力を行った時は、closeメソッドを使ってクローズする必要があるのにも気をつけなければなりません。


2.lsコマンド

lsコマンドとは、ディレクトリやファイルの情報を表示するものです。

通常のlsコマンドのみなら簡単なのですが、-latrのオプションをつけようとすると難しいです。

プログラム自体はまだ問題点が多く、まともに動く状態ではないのですが、新しく学んだことはいくつかあります。

まず、mainメソッドの引数である、(String[] args)の正体が発覚しました。これはコマンドライン引数といって、Javaアプリケーションにパラメータを渡すことができるものです。例えば、コマンドラインに渡された最初の引数は、args[0]で参照できます。これは前々から疑問だったことの一つなので、解消されてスッキリしました。

その他には、

  • 参照型の等価比較では「==」ではなく、equalsメソッドを用いるということ。
  • IntelliJにおいて部分的に正しいかどうか確かめる時に、debag機能を用いて、ステップオーバーを使って1行ずつ実行していく方法があるということ。
  • 抽象的な概念を定義するのには、「abstract」を用いること。
  • 「final」は、後に変更されてしまうと支障が出てしまうものに対して用いる。

ということを知ることができました。

Javaは静的言語なので、気をつけないとすぐにエラーが出てしまい、一見面倒に感じますが、コンパイルレベルでエラーを出してくれるので、どこにミスがあるのかわかりやすいという長所も兼ね備えています。最近はそれと、IntelliJがいかに高機能か知らしめられたので、Javaの魅力に気がつき始めました。