忍者ブログ
Flex,Java,Html など、調べた事のメモ帳です。 間違ってたらゴメンなさい。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

double や float は浮動小数点の為、誤差が生じてしまいます。
Math#round を利用して四捨五入しようとしても 0 に近い方向に丸めるため期待した値にならない場合があります。 Java で正確に四捨五入を実現したい場合 java.util.BigDecimal を使わなければなりません。
丸めモードは ROUND_HALF_UP を指定します。

ソース記述例


BigDecimal dec = new BigDecimal("0.5");
System.out.println(dec.divide(new BigDecimal(1), 0,
    BigDecimal.ROUND_HALF_UP));


出力結果

1
 

Java プログラムから外部コマンドを実行する為には、java.lang.Runtime の exec メソッドを使用します。 Runtime のインスタンスは Runtime#getRuntime で取得できます。
外部コマンドの標準出力を得る為には、 exec の戻り値である Process の getInputStream() を使用します。 そのままでは、標準出力には何も出力されませんので、Java で System.out.println() する必要があります。


ソース記述例

String command = "ls -laF";
Process process = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(process
    .getInputStream()));
String line;
while ((line = in.readLine()) != null) {
    System.out.println(line);
}
in.close();

出力結果

total 3
drwx------+ 5 Administ なし 4096 Nov 18 16:40 ./
drwx------+ 12 Administ なし 4096 Sep 14 11:31 ../
-rwx------+ 1 Administ なし 1807 Nov 30 13:19 .classpath*
-rwx------+ 1 Administ なし 380 Aug 16 09:56 .project*
drwx------+ 2 Administ なし 0 Nov 18 16:40 .settings/
drwx------+ 6 Administ なし 8192 Dec 1 14:46 bin/
drwx------+ 6 Administ なし 4096 Nov 24 10:21 src/

Thread の起動は start() で行う。但し 1 度しか実行できない。 (run() が終了して再度 start() を実行してもスレッドの run() は呼ばれません) 同じスレッドを再度実行したい場合は new して start() を繰り返す。 また、start() から run() が呼ばれるまでの間隔は VM に依存しており、直ぐに呼ばれるわけではないので、 直ぐに run() が呼ばれる事を期待したソースを書かないように注意すること。


ソース記述例

TestThread th = new TestThread();
th.start();

Thread th = new Thread(new Runnable() {
    public void run() {
        // TODO 処理
    }
});
th.start();

 

実行中の Thread を停止する場合に stop() は基本的に使用禁止。(詳しくは Java 非推奨スレッドプリミティブ を参照)
そこで、別途安全に Thread を停止できるように、 halt() を用意する。
halt() では halt_ を true にして while() を抜けさせる。処理が停止中の事も考えられるので interrupt() もやっておく。


ソース記述例

public class TestThread extends Thread {
    private boolean halt_;

    public TestThread() {
        halt_ = false;
    }
    
    public void run() {
        while (!halt_) {
            // TODO 処理
        }
    }

    public void halt() {
        halt_ = true;
        interrupt();
    }
}
 

Servlet による WEB アプリケーションでは画面遷移の方法に redirect(リダイレクト) と forward(フォワード) があります。それぞれの動作の違いとメリット、デメリットについてまとめておきます。

  redirect forward
ソース response.sendRedirect("[ページ2]"); request.getRequestDispatcher("[ページ2]")
.forward(request, response);
処理の流れ
クライアント [ページ1] を要求
     ↓
サーバ  [ページ2] に redirect 命令を返却
     ↓
クライアント [ページ2] を要求
     ↓
サーバ  [ページ2] を返却
クライアント [ページ1] を要求
     ↓
サーバ  [ページ2] を返却
パフォーマンス 悪い (リクエストを 2 回送信する必要がある) 良い (通常通り 1 回のリクエストで良い)
リクエスト情報 引き継がない (全く別の 2 つのリクエストの為) 引き継ぐ (同一の 1 つのリクエストの為)
転送可能範囲 外部サーバも OK 同一サーバ内のみ

同一サーバー内の処理には出来るだけ forward を使用する事。 別サーバーに転送したい時だけ redirect を使用するように心がける

秘密鍵暗号化方式で暗号化

javax.crypto パッケージを使って、文字列を暗号化して同じ鍵を使用して復号化します。 秘密鍵の生成には KeyGenerator の generateKey() を使用し、暗号化、復号化には Cipher の doFinal を使用します。

以下にアルゴリズムに AES を使用した場合の暗号化、復号化の実装例を書きます。


	

コード記述例

public static void main(String[] args) {
    try {
        SecretKey key = KeyGenerator.getInstance("AES").generateKey();
        Cipher aes = Cipher.getInstance("AES");
        HexDumpEncoder enc = new HexDumpEncoder();
        byte[] text = "暗号化テスト".getBytes();
        System.out.println(enc.encode(text));
 
        // 暗号化
        aes.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptText = aes.doFinal(text);
        System.out.println(enc.encode(encryptText));
 
        // 複合化
        aes.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptText = aes.doFinal(encryptText);
        System.out.println(enc.encode(decryptText));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 

 

出力結果


上から順に 元テキスト → 暗号化配列 → 復元されたテキスト です。

	
0000: 88 C3 8D 86 89 BB 83 65 83 58 83 67
0000: EF A2 F1 18 3A B6 7D 16 7B 89 F9 E3 27 4B 48 F4 ....:.......'KH.
0000: 88 C3 8D 86 89 BB 83 65 83 58 83 67
 
ブログランキング
にほんブログ村 IT技術ブログ IT技術メモへ
 
カレンダー
06 2018/07 08
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
人気ブログランキング
ブログランキング ブログランキング
最新CM
最新TB
ブログ内検索
PR
ATOM  
ATOM 
RSS  
RSS 
Copyright ©   プログラムメモ   All Rights Reserved
Design by MMIT  Powered by NINJA TOOLS
忍者ブログ [PR]