20200406のJavaに関する記事は6件です。

【Java】カレントディレクトリの取得方法

きっかけ

Javaで同階層のファイルを開こうと相対パスを与えたのだが開いてくれなかった
そこで絶対パスを与えてやろうと検索してみたら記事が少なかったので覚書

簡単

あまりにも簡単だから誰も書かないのか
常識の範囲だから書かないのか
わからないけどとっても簡単でした

それがこちら

Dir.java
import java.io.File;

class Dir {
    public static void main(String[] args) {
        String path = new File(".").getAbsoluteFile().getParent();
        System.out.println(path);
        // 例:C:\Users\xxxxx\Documents\java
    }
}

もうひとつ

Dir.java
class Dir {
    public static void main(String[] args) {
        String path = System.getProperty("user.dir");
        System.out.println(path);
        // 例:C:\Users\xxxxx\Documents\java
    }
}

おまけ

Dir.java
import java.io.File;

public class Dir {
    public static void main(String[] args) {
        String path = new File(".").getAbsolutePath();
        System.out.println(path);
        // 例:C:\Users\xxxxx\Documents\java\.
    }
}

.のごみが付きますが置換でやっつ…

けられませんでした
ユーザー名などにピリオド入ってたらいっかんの終わりです。

感謝

散々探してやっとたどり着いたページがこちらです
【Java】カレントディレクトリを取得する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

stack の pop() と peek() の違い

java.util.Stack の pop() と peek() 動作確認メモ

挙動確認に関するブログ等が無かったため、メモ。

API 上で確認出来ることを以下に。

public E pop()

スタックの先頭のオブジェクトを削除し、そのオブジェクトを関数の値として返します
戻り値:スタックの先頭にあるオブジェクト(Vectorオブジェクトの最後の項目)。
例外:EmptyStackException - このスタックが空の場合
(https://docs.oracle.com/javase/jp/8/docs/api/java/util/Stack.html#pop--)

public E peek()

スタックの先頭にあるオブジェクトを取り出します。このときオブジェクトはスタックから削除されません。
戻り値:スタックの先頭にあるオブジェクト(Vectorオブジェクトの最後の項目)。
例外:EmptyStackException - このスタックが空の場合
(https://docs.oracle.com/javase/jp/8/docs/api/java/util/Stack.html#peek--)

peekの場合.java
public static void main(String[] args) {
  try {
    Stack<String> stack = new Stack();
    stack.push("Good Morning!");
    stack.push("Hello!");
    stack.peek();
    stack.stream().forEach(System.out::println);
    // Good Morning!
    // Hello!
  } catch (EmptyStackException e) {
    System.out.println("stack が空です");
  }
}
popの場合.java
public static void main(String[] args) {
  try {
    Stack<String> stack = new Stack();
    stack.push("Good Morning!");
    stack.push("Hello!");
    stack.pop();
    stack.stream().forEach(System.out::println);
    // Good Morning!
  } catch (EmptyStackException e) {
    System.out.println("stack が空です");
  }
}

pop の場合は stack から取り出され、 peek は stack から取り出されません。
peek の API を見ると戻り値を返しますので、 値を検証しながら pop することが可能です。

検証しながらpopする.java
public static void main(String[] args) {
  try {
    Stack<String> stack = new Stack();
    stack.push("Good Morning!");
    stack.push("Hello!");
    if (stack.peek().equals("Hello!")) {
      stack.pop();
    }
    System.out.println(stack.peek());
    // Good Morning!
  } catch (EmptyStackException e) {
    System.out.println("stack が空です");
  }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オブジェクト指向(Java)基本

オブジェクト指向について

Androidアプリを作成しようと思いましたが、javaの理解が薄くて進みが悪かったので、Javaについてもう一度学び直す必要があると思いました。

特にオブジェクト指向について分かっていなかったので、そこについて分かりやすく説明してくれてたサイトをあげます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CUIとGUIの違い

CUIとは

Character User Interface(キャラクターユーザーインターフェース)の略。

文字だけで操作するアプリケーション。
コマンドプロンプト等で見られる。対話式の処理。
最近はあまり使われない。

ex

コマントプロンプトで ver で Enter おすと、新しい行にうつる。

GUIとは

Graphical User Interface(グラフィカルユーザーインターフェース)の略。

ボタンや入力欄が表示されて、マウスやタッチで操作する入力方式。
普段見ているパソコンの表示もGUI。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

javaが動く手順について

javaが動く仕組み

1.プログラムを記述
2.javaコンパイラがプログラムを変換
3.Java用ファイルが作られる
4.java仮想マシンがファイルを読み取る
5.プログラムとして動作する

2〜5を自動でしてくれる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Logback]ローテーション時に不要ファイルが消えない時の対処方法

Logbackのローテーション設定の妥当性を検証していた時に、不要ファイル(=保存切れとなったアーカイブファイル)が消えなくて「なぜだ〜」となった時に調べた時のメモ。

NOTE:

検証時は、デバッグログを1つだけ出力するmainメソッドを作って、システム日付をずれして実行していました。

バージョン

  • Logback 1.2.3

なぜ不要ファイルが消えなかったのか!?

細かい条件は調べていませんが、実行時間が短命なスタンドアロンアプリ(=ログ出力後にすぐにプロセスが終了するようなアプリ)の場合、ログファイルのローテーション後に行われるはずの不要ファイル(=保存切れとなったアーカイブファイル)削除処理が行われる前のJVMが終了してしまうことがあるようです。

どうすればよい?

アプリ起動時に不要ファイル(=保存切れとなったアーカイブファイル)を消す処理を呼び出すためのオプションを有効化しておくことで、次回の実行タイミングで不要なファイルを削除することができます。

起動時に不要ファイルを削除する処理を実行する際の設定例
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/var/log/app-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>7</maxHistory>
        <cleanHistoryOnStart>true</cleanHistoryOnStart> <!-- ★★★ ここを追加 ★★★ -->
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

NOTE:

Webアプリケーションなどの常駐型のアプリケーションの場合は、よほどのことがない限りはローテーションタイミングで不要ファイルも削除されます(=切り替え時にプロセスが終了する可能性が非常に低いため)。仮に運悪く削除されないことがあっても、次のローテーションの機会で削除されるので上記設定がなくても問題になることはないと思われます。

まとめ

おそらく・・・商用サービスで動くようなアプリでは cleanHistoryOnStart を指定しなくてもほとんど大丈夫でしょう。瞬殺で終わるようなバッチアプリ!?(瞬殺で終わるならバッチにしなくてええやん・・・という話はありそうだが・・)がある場合は、念のためにこのオプションを指定しておくとよいかもしれません。
あと・・・私のようにローテーションの動作確認する時はこのオプション入れておかないと「何故だ〜」と無駄な時間を過ごすことになるかもしれません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む