| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Java SE 7」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
==Java SE 7==
+
==[[Java SE 7]]==
[[Java]][[SJC-P]]
+
[[Java]] | [[SJC-P]] |
  
 
{{amazon|B005XSS8VC}}
 
{{amazon|B005XSS8VC}}
10行目: 10行目:
 
*AutoCloseable は close() のみを持つ Closeable インターフェースの子
 
*AutoCloseable は close() のみを持つ Closeable インターフェースの子
 
=====例=====
 
=====例=====
  import java.io.BufferedReader;
+
  import java.io.Buffered[[R]]eader;
 
  import java.io.BufferedWriter;
 
  import java.io.BufferedWriter;
 
  import java.io.File;
 
  import java.io.File;
 
  import java.io.FileNotFoundException;
 
  import java.io.FileNotFoundException;
  import java.io.FileReader;
+
  import java.io.File[[R]]eader;
 
  import java.io.FileWriter;
 
  import java.io.FileWriter;
 
  import java.io.IOException;
 
  import java.io.IOException;
 
   
 
   
  public class AutomaticResourceManagement {
+
  public class Automatic[[R]]esourceManagement {
 
     public static void main(String[] args) {
 
     public static void main(String[] args) {
 
          
 
          
         try (BufferedReader reader  
+
         try (Buffered[[R]]eader reader  
                 = new BufferedReader(new FileReader(new File("/home/piroto/work/test.txt")));
+
                 = new Buffered[[R]]eader(new File[[R]]eader(new File("/home/piroto/work/test.txt")));
 
               BufferedWriter writer
 
               BufferedWriter writer
 
                 = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt")))
 
                 = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt")))
135行目: 135行目:
 
  }   
 
  }   
 
===ファイル・ディレクトリ変更の検知===
 
===ファイル・ディレクトリ変更の検知===
*WatchService の作成。このサービスはWatchKeyへのキューからなる
+
*WatchSer[[vi]]ce の作成。このサービスはWatchKeyへのキューからなる
*WatchService でモニターしたいディレクトリ、ファイルを登録
+
*WatchSer[[vi]]ce でモニターしたいディレクトリ、ファイルを登録
 
*イベントをリッスンするループの開始
 
*イベントをリッスンするループの開始
 
*イベントが発生すると、WatchKey がキューに入れられる
 
*イベントが発生すると、WatchKey がキューに入れられる
148行目: 148行目:
 
  import java.nio.file.WatchEvent.Kind;
 
  import java.nio.file.WatchEvent.Kind;
 
  import java.nio.file.WatchKey;
 
  import java.nio.file.WatchKey;
  import java.nio.file.WatchService;
+
  import java.nio.file.WatchSer[[vi]]ce;
 
   
 
   
 
  public class FileChangeNotifications {
 
  public class FileChangeNotifications {
154行目: 154行目:
 
     public static void main(String[] args) {
 
     public static void main(String[] args) {
 
         try {
 
         try {
             WatchService watchService = FileSystems.getDefault().newWatchService();
+
             WatchSer[[vi]]ce watchSer[[vi]]ce = FileSystems.getDefault().newWatchSer[[vi]]ce();
 
             Path watchDir = Paths.get("/home/piroto/work");
 
             Path watchDir = Paths.get("/home/piroto/work");
             watchDir.register(watchService,  
+
             watchDir.register(watchSer[[vi]]ce,  
                     StandardWatchEventKinds.ENTRY_CREATE,
+
                     StandardWatchEventKinds.ENT[[R]]Y_C[[R]]EATE,
                     StandardWatchEventKinds.ENTRY_MODIFY,
+
                     StandardWatchEventKinds.ENT[[R]]Y_MODIFY,
                     StandardWatchEventKinds.ENTRY_DELETE);
+
                     StandardWatchEventKinds.ENT[[R]]Y_DELETE);
 
             while(true) {
 
             while(true) {
                 WatchKey watchKey = watchService.take();
+
                 WatchKey watchKey = watchSer[[vi]]ce.take();
 
                 for (WatchEvent<?> event : watchKey.pollEvents()) {
 
                 for (WatchEvent<?> event : watchKey.pollEvents()) {
 
                     Kind<?> kind = event.kind();
 
                     Kind<?> kind = event.kind();
174行目: 174行目:
 
  }
 
  }
 
===フォークとジョイン===
 
===フォークとジョイン===
*fork/join フレームワークは、ExecuterServiceインターフェースの実装
+
*fork/join フレームワークは、ExecuterSer[[vi]]ceインターフェースの実装
 
*複数のプロセッサーがある場合に有利
 
*複数のプロセッサーがある場合に有利
  
 
=====例=====
 
=====例=====
 
  import java.util.concurrent.ForkJoinPool;
 
  import java.util.concurrent.ForkJoinPool;
  import java.util.concurrent.RecursiveTask;
+
  import java.util.concurrent.[[R]]ecursiveTask;
 
   
 
   
 
  public class ForkAndJoin {
 
  public class ForkAndJoin {
189行目: 189行目:
 
             pool.invoke(fnc);
 
             pool.invoke(fnc);
 
              
 
              
             System.out.println("RESULT:" + fnc.get());
+
             System.out.println("[[R]]ESULT:" + fnc.get());
 
         } catch (Exception e){
 
         } catch (Exception e){
 
             e.printStackTrace();
 
             e.printStackTrace();
198行目: 198行目:
 
  }
 
  }
 
  /**
 
  /**
   * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/RecursiveTask.html
+
   * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/[[R]]ecursiveTask.html
 
   */
 
   */
  class Fibonacci extends RecursiveTask<Integer> {
+
  class Fibonacci extends [[R]]ecursiveTask<Integer> {
 
     final int n;
 
     final int n;
 
   
 
   
227行目: 227行目:
 
  info.typea.javase7.nio.Fibonacci@4f9c205b
 
  info.typea.javase7.nio.Fibonacci@4f9c205b
 
  info.typea.javase7.nio.Fibonacci@13105f32
 
  info.typea.javase7.nio.Fibonacci@13105f32
  RESULT:610
+
  [[R]]ESULT:610

2020年2月16日 (日) 04:27時点における最新版

Java SE 7

Java | SJC-P |

自動リソース管理

  • close を手動で行う必要がない
    で複数のリソースを同時に管理
  • java.lang.AutoCloseable インターフェースを実装する必要あり
  • AutoCloseable は close() のみを持つ Closeable インターフェースの子
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class AutomaticResourceManagement {
    public static void main(String[] args) {
        
        try (BufferedReader reader 
                = new BufferedReader(new FileReader(new File("/home/piroto/work/test.txt")));
              BufferedWriter writer
                = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt")))
                ) {
    
            String line = null;
            while((line = reader.readLine()) != null) {
                writer.write(line);
                writer.write("\n");
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

ダイヤモンド演算子

これまで

Map<String,Integer> numMap = new HashMap<String, Integer>();

<> (ダイアモンドオペレーター) シンボルを利用することで、すべての型リストを書く必要はない

new hashmap() だと、これまで通りコンパイラはタイプセーフ警告を発する
import java.util.HashMap;
import java.util.Map;

public class DiamondOperator {
    public static void main(String[] args) {
        Map<String,Integer> numMap = new HashMap<>();
    }
}

例外ハンドリング

  • | オペレータで、複数の例外をキャッチできる
import java.io.FileNotFoundException;
import java.nio.file.FileAlreadyExistsException;


public class ExceptionHandling {
    public static void main(String[] args) {

        try {
            doSomethingWithMultiException();
        } catch (FileAlreadyExistsException | FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    private static void doSomethingWithMultiException() 
            throws FileNotFoundException, FileAlreadyExistsException {
    }
}

数値リテラル

  • 数字リテラル _ を入れられる(値としては無視される)
  • 二進数リテラル 0b で始める
public class NumericLiteralWIthUnderScore {
    
    public static void main(String[] args){
        
        final int million = 1_000_000;
        final int binary = 0b101;
        
        System.out.println(million);
        System.out.println(binary);
    }
}

文字列によるSwitch

  • case ラベルでは、String.equals() で判定される
public class StringSwitch {
   public static void main(String[] args) {
       
       String[] status = {"new","old","New","Old"};
       int idx = (int)(Math.random()*10d % status.length);
       
       switch (status[idx]) {
       case "new":
           System.out.println("new:" + status[idx]);
           break;
       case "old":
           System.out.println("old:" + status[idx]);
           break;
       default:
           System.out.println("other:" + status[idx]);
           break;
       }
       
   }

}

Path

  • Pathはファイルパスへの簡易な参照
  • java.io.File と同等で追加機能をもつ
import java.nio.file.Path;
import java.nio.file.Paths;

public class WorkingWitPath {

    public static void main(String[] args) {
        
        Path path = Paths.get("/home");
        Path source = path.resolve("piroto/work/test.txt");
        System.out.println(source);
        
        Path dist = source.resolveSibling("out.txt");
        System.out.println(dist);
    }
}  

ファイル・ディレクトリ変更の検知

  • WatchService の作成。このサービスはWatchKeyへのキューからなる
  • WatchService でモニターしたいディレクトリ、ファイルを登録
  • イベントをリッスンするループの開始
  • イベントが発生すると、WatchKey がキューに入れられる
  • WatchKeyを消費し、問い合わせを実行
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class FileChangeNotifications {

    public static void main(String[] args) {
        try {
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Path watchDir = Paths.get("/home/piroto/work");
            watchDir.register(watchService, 
                    StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE);
            while(true) {
                WatchKey watchKey = watchService.take();
                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    Kind<?> kind = event.kind();
                    System.out.println(event.context().toString() + " is " + kind);
                }
            }
        
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

フォークとジョイン

  • fork/join フレームワークは、ExecuterServiceインターフェースの実装
  • 複数のプロセッサーがある場合に有利
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

public class ForkAndJoin {
    public static void main(String[] args) {
        try {
            // n番目のフィボナッチ数を求める
            Fibonacci fnc = new Fibonacci(15);
            ForkJoinPool pool = new ForkJoinPool();
            pool.invoke(fnc);
            
            System.out.println("RESULT:" + fnc.get());
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
    
}
/**
 * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/RecursiveTask.html
 */
class Fibonacci extends RecursiveTask<Integer> {
    final int n;

    public Fibonacci(int n) {
        System.out.println(this.toString());
        this.n = n;
    }

    @Override
    protected Integer compute() {
            if (n <= 1) {
                return n;
            }
            Fibonacci f1 = new Fibonacci(n - 1);
            f1.fork();
            Fibonacci f2 = new Fibonacci(n - 2);
            return f2.compute() + f1.join();
    }
}
結果
info.typea.javase7.nio.Fibonacci@6ab41dbb
info.typea.javase7.nio.Fibonacci@570c16b7
info.typea.javase7.nio.Fibonacci@22fdffb1
                  :
info.typea.javase7.nio.Fibonacci@519dcf69
info.typea.javase7.nio.Fibonacci@4f9c205b
info.typea.javase7.nio.Fibonacci@13105f32
RESULT:610