Java Memo」タグアーカイブ

Eclipseのショートカットキーまとめ

Eclipseのショートカットキーに関する情報をまとめます。

基本的なショートカット

以下のサイトが参考になります。エディタにフォーカス当てるとか、選択中のビューの最大化とかは基本中の基本なので、作業効率アップの為にも癖にしておいた方が良い。

eclipsewiki.net – このウェブサイトは販売用です! -&nbspeclipsewiki リソースおよび情報
http://shortcutkey.ivory.ne.jp/Eclipse/list1-2.html

TOMCATプラグイン用に僕が設定しているもの

TOMCAT起動 Alt + Shift + T, S
TOMCAT停止 Alt + Shift + T, T
TOMCAT再起動 Alt + Shift + T, R

いちいちマウスでアイコンをクリックするのは手間だし、上部のメニューから選ぶのも結構面倒臭いので、この機能にもショートカットを割り当てている。若干押しにくい配置ではあるが、そこまで頻繁に行う作業ではないので問題はない。

Vim好きの僕がカーソル移動用に設定しているもの

カーソルを左に移動 Ctrl + Alt + H
カーソルを下に移動 Ctrl + Alt + J
カーソルを上に移動 Ctrl + Alt + K
カーソルを右に移動 Ctrl + Alt + L
ページダウン Ctrl + Alt + F
ページアップ Ctrl + Alt + B
行頭に移動 Ctrl + Alt + 0
行末に移動 Ctrl + Alt + 4

viプラグイン等も試してみたのだが、Eclipseに搭載されている機能とViのカーソル移動を両立させるにはこの方法が一番良いように思う。ちなみにCtrl + Alt + HはCallHierarchyに割り当てられていたので、これをCtrl + Alt + Cに移動した。

ある単語を検索するときに便利な方法

検索したい単語の上でShift + Alt + ↑を押し、その後Ctrl + Kで検索を進める。戻りたければCtrl + Shift + Kを押す。

FileクラスのrenameToメソッド使用時の注意

既に知っている方も多いと思うが、仕事で引っかかったので。
FileクラスのrenameToメソッドはどんな場合でも使えるという訳ではなく、ファイルシステムを超えて使おうとしたときにどうなるかはOS依存らしい。

File (Java 2 Platform SE v1.4.2)

Whether or not this method can move a file from one filesystem to another is platform-dependent. The return value should always be checked to make sure that the rename operation was successful.

なのでファイルの移動したいときには、例えばきちんとFileInputStreamで読んでFileOutputStreamで書くなどの対処が正攻法のようだ。

文字コードや改行コードを考慮したファイル転送

以前このエントリこのエントリでファイル転送プログラムを作ってみたが、クライアント側とサーバ側で文字コードや改行コードが違う場合について考慮されていないので、それらを考慮したファイル転送プログラムを作る。

—–

続きを読む

Serializableインターフェースを用いて、インスタンスを送受信する

PythonのPickleモジュールについて学んだので、ついでにJavaの場合を調べてみた。

JavaではSerializableインターフェースというのを継承したクラスであれば、そのインスタンスをバイトストリーム化し、ソケットなどにも書き込めるようだ。簡単な通信テストのため、SerializeServer、SerializeClient、送受信するTransDataクラスを作成した。

—–

続きを読む

FileStreamって何だろう

http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352

で作成したプログラムだが、.exeも.xlsでもなんでも送れることが確認できた。FileStreamというのは一体どういう仕組みなのか、勉強しようと思う。非常に便利だ。便利すぎて馬鹿になりそうだから勉強しよう。

まあファイルをバイト列に分解しているということのはずだが。。

ソケット通信でファイル転送その2

簡単なファイル転送プログラムを作ってみた。

サーバ側のソースは以下。ソケットから受けとったバイト配列を、引数で指定したファイルのストリームに書き込んでいるだけ。特に理由はないが、32バイトずつその作業を行っている。

import java.net.*;
import java.io.*;
public class FileTranServer {
public static void main(String[] args) throws IOException{
if (args.length != 2)
throw new IllegalArgumentException("An argument should be port and filename");
int servPort = Integer.parseInt(args[0]);
String filename = args[1];
System.out.println("Output file name : " + args[1]);
//Create FileOutputStream
FileOutputStream fout = new FileOutputStream(filename);
//Create ServerSocket
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize;
//int bufSize = servSock.getReceiveBufferSize();
int bufSize = 32;
System.out.println("Size of ReceiveBuffer : " + bufSize);
//Socket accepting loop
while(true){
System.out.println("Wait for accepting... ");
Socket clntSock = servSock.accept();
byte[] byteBuffer = new byte[bufSize];
System.out.println("Accepted client at " +
clntSock.getInetAddress().getHostAddress() +
" on port " +
clntSock.getPort());
//Create InputStream
InputStream in = clntSock.getInputStream();
//Read message and print it out
int totalByte = 0;
while((recvMsgSize = in.read(byteBuffer)) != -1){
System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize));
System.out.println("Size    : " + recvMsgSize);
//Write to file
totalByte = totalByte + recvMsgSize;
fout.write(byteBuffer,0,recvMsgSize);
}
System.out.println("Recieved file size : " + totalByte);
clntSock.close();
fout.close();
fout = null;
}
}
}

次はクライアント側。これも引数で指定したファイルのストリームから、32バイトずつソケットのバイト配列に書き込むだけ。

import java.net.*;
import java.io.*;
public class FileTranClient {
public static void main(String[] args) throws IOException{
if (args.length != 3)
throw new IllegalArgumentException("Arguments should be host,port and filepath");
String server = args[0];
int serverPort = Integer.parseInt(args[1]);
String filename = args[2];
byte[] data = new byte[32];
//ソケットの作成
Socket socket = new Socket(server,serverPort);
System.out.println("Connected to server");
//ストリームの作成
FileInputStream fin = new FileInputStream(filename);
OutputStream out = socket.getOutputStream();
//ファイルの内容を読み出し、送信する
System.out.println("Sending file : " + filename);
int totalSize = 0;
int len = 0;
while ((len = fin.read(data)) != -1) {
totalSize = totalSize + len;
System.out.println(new String(data,0,len));
out.write(data, 0, len);
}
fin.close();
fin = null;
System.out.println("size of file : " + totalSize);
socket.close();
}
}

32バイトずつでも、250KBくらいだったらあっという間に送信できる。まあ同じPC内だから当たり前なのだろうか。別のPCと接続してやってみる必要あり。

ソケット通信でファイル転送その1

ソケット通信でファイル転送をするプログラムを作ってみようと試みている。とりあえず手始めとして、簡単な文字列を送るプログラムを作ってみた。本日はファイル転送までは手が回らず。

クライアント側のソースは以下。引数として、サーバのアドレスと、サーバ側プログラムが使用するポート番号、送信する文字列を指定する。

import java.net.*;
import java.io.*;
public class FileTranClient {
public static void main(String[] args) throws IOException{
if (args.length != 3)
throw new IllegalArgumentException("Arguments should be host,port and
    message");
  String server = args[0];
int serverPort = Integer.parseInt(args[1]);
  byte[] byteBuffer = args[2].getBytes();
  //Create Socket
  Socket socket = new Socket(server,serverPort);
  System.out.println("Connected to server");
  //Create OutputStream
  OutputStream out = socket.getOutputStream();
  out.write(byteBuffer);
  System.out.println("sent message : " + args[2]);
  socket.close();
}
}

サーバ側のソースは以下。引数として、このプログラムが実行されるポート番号を指定する。

import java.net.*;
import java.io.*;
public class FileTranServer {
public static void main(String[] args) throws IOException{
if (args.length != 1)
throw new IllegalArgumentException("An argument should be port");
int servPort = Integer.parseInt(args[0]);
//Create ServerSocket
ServerSocket servSock = new ServerSocket(servPort);
int recvMsgSize;
//int bufSize = servSock.getReceiveBufferSize();
int bufSize = 32;
System.out.println("Size of ReceiveBuffer : " + bufSize);
//Socket accepting loop
while(true){
System.out.println("Wait for accepting... ");
Socket clntSock = servSock.accept();
byte[] byteBuffer = new byte[bufSize];
System.out.println("Accepted client at " +
clntSock.getInetAddress().getHostAddress() +
" on port " +
clntSock.getPort());
//Create InputStream
InputStream in = clntSock.getInputStream();
//Read message and print it out
while((recvMsgSize = in.read(byteBuffer)) != -1){
System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize));
System.out.println("Size    : " + recvMsgSize);
}
clntSock.close();
}
}
}

サーバ側にて、

    //int bufSize = servSock.getReceiveBufferSize();
int bufSize = 32;

としてるところがポイントで、クライアント側から送られてきた文字列を1回32バイトずつ読み込むようにしてみた。ちなみにコメントアウトされてるほうでbufSizeを宣言すると、8192バイトずつ読み込まれるようになった。これはおそらく、僕のPCのデフォルト値なのだろう。
送信するメッセージは、以下の105バイトの文字列とした。

TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori

以下に実行結果を示す。

クライアント側の実行結果。

Connected to server
sent message : TokyoNagoyaOsakaNewYorkFukuokaSeoulSapporoSeattleLosAngelesChibaYokohamaKyotoNaraParisFlorenceAkitaAomori

サーバ側の実行結果。

Size of ReceiveBuffer : 32
Wait for accepting...
Accepted client at 127.0.0.1 on port 1045
Message : TokyoNagoyaOsakaNewYorkFukuokaSe
Size    : 32
Message : oulSapporoSeattleLosAngelesChiba
Size    : 32
Message : YokohamaKyotoNaraParisFlorenceAk
Size    : 32
Message : itaAomori
Size    : 9
Wait for accepting... 

32バイトずつ文字列が読み取られている様子が目にみえた。次回はこれを改良し、ファイルの転送にまで繋げたい。おそらくファイルストリームとかいうやつを使うことで出来るのではないか。

今回Javaを勉強しているのだが、ネットワークなどについても何も知らないことに気付かされる。勉強しないとなぁ。

以下が参考にしている書籍。非常にわかり易く解説されていると思う。実例から理論的な説明まで載っているし、何より薄くて扱い易いところが○。大学の教科書として書かれたようで、手始めには適していると思う。ただファイル転送に関する話は載っていないようなので、また情報を探さないと。

TCP/IPソケットプログラミング Java編

TCP/IPソケットプログラミング Java編

Java本無料プレゼント

id:hyukiさんのエントリで、『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』無料プレゼントを行っている。僕も早速応募してみる。

ちょうどJavaの勉強中だし、d:hyukiさんの文章はわかり易くて好感が持てた記憶がある。これを機会にプレゼントの対象になっていない以下の本は購入しよう。

改訂第2版 Java言語プログラミングレッスン (上)

改訂第2版 Java言語プログラミングレッスン (上)

改訂第2版 Java言語プログラミングレッスン (下)

改訂第2版 Java言語プログラミングレッスン (下)

Tomcatにearファイルをdeployする方法

earファイルをTomcatにdeployする方法が分からない。以下のサイトによると、

http://searchwebservices.techtarget.com/ateQuestionNResponse/0,289625,sid26_cid480013_tax292065,00.html

Tomcat is a servlet/JSP container available from the jakarta.apache.org site. Tomcat deals only with WAR files. So, in order to auto-deploy a Web application to a Tomcat environment, you must place an application’s WAR file in the appropriate directory or use Tomcat’s deployment tools to manually deploy the file. If you already have an EAR file that contains the WAR file, you can extract the WAR file and use it as is. If you do not have the EAR file or the WAR file, you can use any number of compliant tools to create the WAR file. The following sites discuss the Tomcat deployment process in detail:

と書いてある。つまりwarファイル形式しかTomcatは自動で扱ってくれないということだろうか。earファイルからwarファイルを抜き出せと書いてあるが、今度はその方法が分からない。

あとwarファイルだが、以下の説明を読んだら、Tomcatは展開してから利用するようだ。つまり「纏めすぎてうんぬん」と書いた件は杞憂に終わった。

http://tomcat.apache.org/tomcat-4.0-doc/appdev/deployment.html

When Tomcat is started, it will automatically expand the web application archive file into its unpacked form, and execute the application that way. This approach would typically be used to install an additional application, provided by a third party vendor or by your internal development staff, into an existing Tomcat installation.