top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
結構品揃えが増えてきました。
先日 梅田紀伊国屋に行ったら 私のチューリップ本は 平積み状態が解除されていました (T_T)ちょっと寂しかったです。撤去されたわけではなくって 立てて並べられていました。良い夢を見させて頂きました (笑)
みなさまにお断り。このC++クラスはフリーソフト的には公開できないでしょう。とりあえずは 自分用メモということで…下記のようなクラスを作成しました。(当然 クラスメイトファイル名とは一致させています)
io_BufferedInputStream.h
io_BufferedOutputStream.h
io_FileInputStream.h
io_FileNotFoundException.h
io_FileOutputStream.h
io_FilterInputStream.h
io_FilterOutputStream.h
io_InputStream.h
io_IOException.h
io_OutputStream.h
lang_Exception.h
nbb_MimeBase64.h
nbb_MimeInputStream.h
nbb_MimeOutputStream.h
net_URL.cpp
net_URL.h
net_URLConnection.cpp
net_URLConnection.h
net_URLConnectionInputStream.h
net_URLConnectionOutputStream.h
上記のクラスが揃いました。もちろん必要なメソッドしか実装していませんが…。このクラスを利用したら、下記のようにコーディングできます。ちょっとJavaっぽく見えます。
ちょっとデータをMIME BASE64化する例。
try
{
io_InputStream* fileRead =
new io_BufferedInputStream(
new io_FileInputStream((unsigned char*)"aaa.txt"));
io_OutputStream* fileWrite =
new nbb_MimeOutputStream(
new io_BufferedOutputStream(
new io_FileOutputStream((unsigned char*)"bbb.txt")));
unsigned char szBuf[1024 + 1];
for (;;)
{
int read = fileRead->read(szBuf, 0, 1024);
if (read < 0)
break;
fileWrite->write(szBuf, 0, read);
}
fileWrite->close();
fileRead->close();
delete fileRead;
delete fileWrite;
}
catch (io_IOException* ex)
{
printf("Error occur: %s", ex->toString());
delete ex;
}
HTMLファイルをダウンロードする例。
net_URL* url = new net_URL((unsigned char*)"http://www.tcct.zaq.ne.jp/iga/tosiki/igapyon/diary/");
net_URLConnection* conn = url->openConnection();
io_InputStream* fileRead =
new io_BufferedInputStream(
conn->getInputStream()
);
io_OutputStream* fileWrite =
new io_BufferedOutputStream(
new io_FileOutputStream((unsigned char*)"ddd.txt"));
for (;;)
{
int read = fileRead->read(szBuf, 0, 1024);
if (read < 0)
break;
fileWrite->write(szBuf, 0, read);
}
fileWrite->close();
fileRead->close();
delete fileRead;
delete fileWrite;
delete conn;
delete url;
ずいぶん幸せな気持ちになることができます。Javaの良い点の一つは 良くこなれたAPIセットの存在なのですもの。あとはこのまま MD5ダイジェストストリームとGZIPストリームが出来上がったら完成です。もうちょっと頑張ろう…。(なんでも自作してしまう癖はなかなか治りませんなぁ…)
Java APIをC++に移植して分かったのですが、全てをヘッダーファイルで表現することは出来ませんでした。クラスを相互に参照するため、とりあえず *.cpp を利用する必要がありました。これはちょっと残念。というか C++言語ってそういうものですよね。
POSTする場合のコードで一点気になったのが、WinInetでは 事前に送信サイズがわかっていないといけないのですが、Java API では そのような取り決めはありません。これはなぜだろうと思いました。