20210103のJavaに関する記事は5件です。

JavaでRedis Streamを使う

https://paluch.biz/blog/174-a-first-look-at-redis-streams-and-how-to-use-them-with-java.html

Redis Streams have made it into Redis’ unstable branch since the beginning of this year, and the first clients start with the adoption of Redis Streams APIs. That makes it an excellent time to take a look what Redis Streams provide and how you can use them from a client perspective.

Disclaimer: Redis Streams are available as a first draft and are not part of a stable release yet. APIs are subject to change.

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

【Java】string.formatの使い方

string.format とは?

引数に指定した書式を元に文字列を整形して返すというメソッドです。

書き方

第一引数は決められた書式に従って書く必要があります。第二引数以降は第一引数で決めた書式に割り当てるための変数を渡します。

public static String format(String format,Object... args)

実装例

指定された書式の文字列と引数を使って、書式付き文字列を返します。
書式は(%〜)と書いて指定します。
整数(10進整数)を整形する場合はd、文字列を整形する場合はsを使います。

        int year = 2021;
        String str = String.format("今年は%d年です。", year);
        System.out.println(str); //今年は2021年です。

        // はじめに0を追加
        System.out.println(String.format("%05d", 1000)); //01000
        System.out.println(String.format("%06d", 1000)); //001000

        // 文字を追加
        System.out.println(String.format("%dと%d", 1000,2000)); //1000と2000

        // 文字列を整形
        System.out.println(String.format("%s/%s/%s", "2021","01","03")); //2021/01/03

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

【Java】フォルダの作成方法

プログラミング勉強日記

2020年1月3日
フォルダの作成方法について簡単にまとめる。Java7から機能を改善したjava.nio(NEW I/O 2)でのフォルダ作成についてまとめる。

フォルダを作成する方法

 作成するフォルダのパスの指定にはjava.niofile.Pathsクラスのgetメソッドで行う。フォルダを1つだけ作成する場合は、java.nio.FilesクラスのcreateDirectoryメソッドを使う。親フォルダを含めたすべてのフォルダ階層をまとめて作成する場合にはcreateDirectoriesメソッドを使う。

サンプルコード

 ファイルがすでに存在する場合は、FileAlreadyExistsExceptionの例外が発生する。

try {
    // 絶対パスで作成
    Path path1 = Paths.get("c:\\Test1");
    Files.createDirectory(path1);

    // 親フォルダを含めて作成
    Path pat<h2><span id="_PathsgetquotcTest2abcquot">= Paths.get("c:\\Test1\\abc");</span></h2>
    Files.createDirectories(path2);

    // 相対パスで作成
    Path pat<h3><span id="_PathsgetquotTest1quot">= Paths.get("Test1");</span></h3>
    Files.createDirectory(path3);

} catch (IOException e) {
    e.printStackTrace();
}

フォルダの作成日時を取得する方法

 java.nioではフォルダの作成日時を取得することができる。getAttributeメソッドで引数にcreatiTimeを設定して取得する。

Path path = Paths.get("c:\\Test1");
System.out.println(Files.getAttribute(path, "creationTime"));
実行結果
2020-01-03T02:54:45.903849Z

参考文献

【Java入門】フォルダを作成する方法(java.nio.file)
ディレクトリを作成する

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

Java + SpringBoot + Gradle + thymeleaf で 簡易DRUDアプリ作成 ( 1 )

はじめに

エンジニアに転職してから1年半が経とうとしているのでそろそろ、JavaとSpringBootで基本的なアプリ開発ができるようにならないといけないと思い始めました。現在使用している参考書はSpring Boot 2 プログラミング入門です。まだ全て手を動かしながら実践できていませんが簡易的なアプリを作成するまではできたので纏めておきます。ところどころ自分オリジナルのコードも入れながら作成したので良い勉強になりました。何回かに分けて復習がてら書いていきたいと思います。

github: https://github.com/noydmt/myboot

まず使用したツールやFWの説明から。

Gradle

Groovyによるビルドツール。
ビルドの情報や処理はGroovyで記述されている。Groovyとはプログラミング言語の一種でJavaを踏襲した文法で書くことができ、アプリも作れる。使用用途としてはGradleの記述以外にも本格的なアプリ開発の前のプロトタイプを作るときに用いられることが多い。
mavenと違い、pom.xmlは使用せず、プロジェクトの中にbuild.gradleファイルを置いて環境を管理する。
STSでプロジェクト作成を行うときは予め、gradle専用のプラグインツールをインストールしておく必要があり、STSで始めることが多いと思われるのでヘルプ=>Eclipseマーケットプレイス=>「Buildship」で検索=>Buildship gradle integrationをインストールすることでgradleプロジェクトを作成可能。

Thymeleaf

Java用に作られたテンプレートライブラリ。SpringBootにデフォルトで組み込まれている為、特にライブラリ等をインストールする必要はなし。JSPと違ってHTMLに影響を及ぼさないth${}などを用いて画面を表示することが可能。正直個人的な感想では今更、テンプレートエンジンを学ぶ旨味もそこまでないような気がする。

SpringBoot

Springフレームワークを基にさらに拡張されたJavaフレームワーク。railsライクに高速開発できることが強み。
Spring framework同様にDIが兼ね備えられており、わざわざ依存クラス内で使いたいクラスのインスタンスを生成する必要がない。AOPについては調べたけどよくわからない。

続いては実際にアプリ開発で使用した環境を紹介していきます。

build.gradle

build.gradle
plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'com.gradle.springboot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.hsqldb:hsqldb')
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}

中身をざっと見てみるとpluginsrepositoriesdependenciesがこのファイルの構成要素になっており、pluginsではJavaspringBootdependencyなどの使用言語や使うフレームワーク、管理ツール、バージョンなど管理されている。
バージョンによって使える機能が限られることがあるので注意。
とは言いても個人の開発者がよりいじる可能性があるのはdependenciesである。
このdependenciesではどんなライブラリを使いたいか予め記述するだけでビルド時に勝手にダウンロードをしてくれる。
build.gradleを使わないと使いたいライブラリがあった場合、のちに外部からjarファイルをダウンロードしてクラスパスを通さないと使えなかったがgradleはそんな手間を掛けずにライブラリを使用することができるのだ。

今回私が使用したライブラリは下記になる。
・SpringBoot
・thymeleaf
・HSQLDB
・JPA

HSQLDBはJavaアプリケーション内部にDBを内蔵することを可能にするもので本来のサーバー上でなくメモリ上にデータベースを保管することができる。開発段階のテスト用データベースとして使用されることが多い。メモリ上に保管する為、揮発性を持ち、一度保管したレコードはアプリケーションを再起動すると消えてしまう。

JPAとはエンティティクラスを利用してRDBのテーブル操作をもっと簡易的に実現できるORマッパー。

次回に続く。。。

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

JavaでのスレッドとCallableの基本【初心者】

JavaでのThreadの基本

マルチスレッドを使えば複数処理を並列に走らせたりできる。
こういう処理の一つ一つをスレッドと呼ぶ。
Javaにおいてスレッド処理をするには継承(extends)を使う方法とインターフェイスを実装(implements)して使う方法がある。
前者の場合はThreadクラスを継承してstart()メソッドを呼び出す。
後者の場合はRunnableインターフェイスを実装してrun()メソッドを呼び出す。
Javaでは多重継承ができないため、Threadを使う方法だと他のクラスを継承できないが、インターフェイスを使った方法であれば可能。
後者の場合はCallableインターフェイスを実装してcall()メソッドを呼び出す方法もある。

RunnableとCallableの違い

Runnableの場合は返り値の指定ができず、例外も飛ばせない。

Runnable_interface
public interface Runnable {
    public abstract void run();
}

こんな感じで実装する。run()メソッドをoverrideする。

Runnable_implements
static class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnableだよ");
    }
}

Callableの場合は返り値の指定ができ、例外を飛ばせる。

Callable_interface
public interface Callable<V> {
    V call() throws Exception;
}

こんな感じで実装する。call()メソッドをoverrideする。
<>の部分がジェネリクスと呼ばれる部分で、返り値の型を指定できる。(以下ではString)

Callable_implements
static class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        String result = "Callableだよ";
        return result;
    }
}

Callableの呼び出し

オブジェクトを作ってCallableを使ってみたい。

main
MyCallable myCallable = new MyCallable();

ここでFutureExecutorServiceを使うと便利。

main
// ExecutorServiceインスタンスを生成
ExecutorService executorService = Executors.newSingleThreadExecutor();
// Executorにスレッドの実行を依頼
Future<String> future = executorService.submit(myCallable); 
//結果を取り出すにはget()メソッドを使う
String result = future.get(100, TimeUnit.MILLISECONDS);

ExecutorService経由でmyCallableを実行し、結果をFuture型の変数に格納している。
返り値の型はジェネリクスで指定。上ではStringにしている。
結果はFutureget()メソッドを使って取り出す。
また、上のように引数を指定することで、0.1秒以上かかった場合に例外を発生させたりできる。

よくわかってない僕からすると、
「Runnableの時みたいにmyCallable.call()を直接呼び出すのじゃだめなの?」
とか思ったりしたのだけど、
myCallableの処理は別スレッドで行われるため、処理が終わってから返り値が返ってくるのを待ってなきゃいけないのよね。
ExucutorServiceを使えばちゃんと処理が終わるまで待った上で、返り値をfutureオブジェクト経由で取得可能ということだと思う。(多分)
Futureっていう名前も未来っぽいし。

ThreadLocalを使った方法

classのstaticメンバは共有リソースとして管理されるために、別のスレッドから書き換え可能になってしまう。
スレット内で完結させるにはThreadLocalを使うと便利。

main
// ThreadLocalのインスタンスを作成
private final ThreadLocal<ExecutorService> executorServicePool = new ThreadLocal<>();
// SingleThreadExecutorをセットする
executorServicePool.set(Executors.newSingleThreadExecutor());
//結果を取り出すにはget()メソッドを使う
ExecutorService executorService = executorServicePool.get();

これでよりスレッドセーフになる。

参考にしたページ

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