LoginSignup
15
18

More than 5 years have passed since last update.

ざっくりJava〜通信、DB操作〜

Posted at

WEBページを表示させる

import java.net.*;
import java.io.*;

URL url = new URL("http://sample.com"); //URLクラスをインスタンス化
InputStream is = url.openStream(); //データを取り出すストリームを取得
InputStreamReader isr = new InputStreamReader(is);
int data = isr.read(); //ストリームから1バイトずつ情報を取り出す
while(data != -1){
  System.out.print((char) data);
  data = isr.read();
  }
  isr.close();
}

Socketを使ってWEBページを取得する

socketは低水準なAPI。ポート番号やヘッダ情報など細かく指定して通信する。

TCP/IPを使って接続する

必要な情報

相手のIPアドレス・・・ホスト名でもいい
相手のポート番号・・・相手に繋げるポート番号

import java.net.*;
import java.io.*;

Socket sck = new Socket("google.com",80);
InputStream is = sck.getInputStream(); //socketから入力ストリームを取得
OutputStream os = sck.getOutputStream(); //socketから出力ストリームを取得
os.write("GET /index.html HTTP/1.0¥r¥n".getBytes()); //HTTP要求を送信
os.write("¥r¥n".getBytes());
os.flush();
InputStreamReader isr = new InputStreamReader(is);
int i = isr.read();
while(i != -1){
  System.out.print((char) i);
  i = isr.read();
}
sck.close(); //ソケットを閉じる

ServerSocketを使う

指定したポート番号で待ち受けることができる。
複数相手から接続を待つ場合にはスレッドを使う。

import java.net.*;

ServerSocket sv = new ServerSocket(29648); //引数に待ち受けるポート番号を指定
Socket sc = sv.accept();  //呼び出す。(ずっと待ち続ける)
sc.getOutputStream().write("Welcome".getBytes); //接続されたら応答
sc.getOutputStream.flush();
sc.close();

DBを使う

JavaにはJDBCというデータベース操作専用のAPIがある。
これを使えば、DBの種類が変わっても都度コードを書き換える必要がない。

仕組み

Javaプログラム ➡ JDBC API ➡ 各DBドライバ(JARファイル) ➡ 各DB

※JDBCドライバのJARファイルには必ずクラスパスを通す事

使い方

import java.sql.*; //java.sqlをインポートする

//事前準備をする
try{
    Class.forName("com.mysql.jdbc.Driver"); //JDBCドライバの有効化(MySQLの場合)
}catch(ClassNotFoundException e){
    e.printStackTrace();  //JDBCドライバJARファイルが見つからない場合の処理
}

Connection cn = null;
try{
String url = "jdbc:mysql://localhost/jdbctestdb"; //サーバ名とDB名を指定
String user = "testuser";
String password = "testpass";

  cn = DriverManager.getConnection(url, user, password); //接続の確立。引数は(JDBCのURL,接続ID、パスワード)

  /****************************
     DBの実際の処理を記述していく
  ******************************/

}catch(SQLException e){
  e.printStackTrace(); //接続やSQL処理失敗時の処理
}finally{
  try{
    if (cn != null){
      cn.close();
    }
  }catch (SQLException e2){
    // 例外処理
  }
}

※try-catchで自動的にガーベジコレクション(GC)がConnectionをクローズしてくれるが、いつGCが呼び出されるかわからないので、ちゃんとcloseしておく。

DBの実際の処理

更新系
//1.SQLのひな形作成
PreparedStatement stmt = cn.prepareStatement("DELETE FROM SAMPLETABLE WHERE ID <= ? OR NAME = ?");

//2.ひな型へ値を流し込んで送信
stmt.setInteger(1,10);
stmt.setString(2,"きむ");
int r = stmt.executeUpdate();

//3.処理結果を判定
if(r != 0){
  System.out.println(r+"件を削除しました。");
}else{

}

検索系
//1.SQLのひな形作成
PreparedStatement stmt = cn.prepareStatement("SELECT * FROM SAMPLETABLE WHERE ID <= ?");

//2.ひな型へ値を流し込んで送信
stmt.setInteger(1,10);
ResultSet rst = stmt.executeQuery();  //executeQueryで送信し、ResultSetインスタンスで取得

//3.処理結果を処理
while(rst.next()){ //nextで結果を1行ずつ取得していく
  System.out.println(rst.getString("NAME")); //文字列を取得する場合はgetString
}
}

トランザクション

import java.sql.*; 

try{
    Class.forName("com.mysql.jdbc.Driver"); 
}catch(ClassNotFoundException e){
    e.printStackTrace();  
}

Connection cn = null;

try{
String url = "jdbc:mysql://localhost/jdbctestdb"; 
String user = "testuser";
String password = "testpass";

  cn = DriverManager.getConnection(url, user, password); 

 cn.setAutoCommit(false); //手動コミットモードにする

  /****************************
     DBの実際の処理を記述していく
  ******************************/

  cn.commit(); //コミットした時点でそれまでのSQLがすべて送信される

}catch(SQLException e){
  e.printStackTrace();
  try{
    cn.rollback(); //エラーになったらそれまでのSQL実行をすべて戻す
  }catch(SQLException e2){
    e2.printStackTrace(); //ロールバック失敗時の処理
  }
}finally{
  try{
    if (cn != null){
      cn.close();
    }
  }catch (SQLException e2){
    // 例外処理
  }
}

ヒープとスタック

javaを実行するのはJVM。
JVMはOSから割り当ててもらったメモリ領域をやりくりしながらプログラムを実行している。
メモリ領域は用途によって「ヒープ」と「スタック」の2種類がある。
newされた時にはヒープ領域の1部が割り当てられる。
もし、膨大な量のメモリを消費するアプリケーションの場合、ヒープ容量が不足する場合がある。
そうすると、newしようとしても「OutOfMemoryError」というエラーが発生して強制的にプログラムが停止してしまう。
その場合は、自分でヒープ領域を設定できる。

ガベージコレクション(GC)

不要なインスタンスを解放するのがガベージコレクション。
無駄なヒープを解放して領域を増やすが、ヒープ領域自体が大きすぎるとGCが無駄なゴミを探すのが大変になり、その分時間がかかってしまい、重くなる。
GCが起動している間は、全ての処理が完全に一時停止する。
GCは「どの変数にも参照されていないインスタンス」を解放する。
ヒープが解放されずに溜まっていくとメモりリークにつながり、フリーズ状態が頻発する.
必ず、使わなくなったインスタンスは明示的に破棄した方が良い。

その他

ライセンスの種類

お金のかからない「オープンソースソフトウェア」とお金のかかる「商用」があるが、
オープンソースの中でもライセンスがいくつかある。
「フリーソフト=何しても自由」なわけじゃない

GPL , LGPL ・・・GPL系ライセンスといわれ、このライセンスを使って開発したソフトにはソースコード公開とGPLライセンスにする必要がある。 
BSD , MIT ,Apache ・・・ BSD系ライセンスといわれ、著作権表示など行えば後は自由。
PublicDomain ・・・ 何しても良い。自由。
15
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
18