1.URLクラス

I/O ストリームの操作について学習しました。ファイルの操作について学習しました。次は何を勉強すればいいでしょうか?インターネットを含むネットワークを使った作業についてはどうでしょうか? 有望ですね。

Java では、インターネットの操作はファイルの操作と同じくらい難しくありません。まあ、ほんの少しだけかもしれない。

インターネット リソースを操作するために、Java には特別なクラス — がありますURL。これからご覧いただくように、スツールと同じくらいシンプルです。

Web ページの取得

インターネットからテキスト ファイルをダウンロードし、その内容を画面に表示するには、何行のコードを記述する必要があると思いますか? 10? 100? 1000? それとも5つでしょうか?

コード ノート
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
ページへのパスを含む URL オブジェクトを作成しますURL オブジェクトから
を取得します すべてのバイトを読み取り、バイトの配列を返します 配列を 文字列に変換します 文字列を表示します InputStream


HTML ファイルの内容が画面に表示されます。

コンソール出力
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

Fileとでの作業の比較URL

URLFileはまたはに似ていますPathが、Pathファイル システム内のリソースへのパスを保存し、URLインターネット上のリソースへのパスを保存します。

InputStreamメソッドを 1 回呼び出してオブジェクトを取得すると、すべての魔法が起こりますopenStream()。これはありふれた物体であり、私たちはすでに内部と外部を研究しています。オブジェクトを取得すると、すべてが明らかになりますInputStream。結局のところ、私たちはそこからデータを取得する方法をすでに知っています。

見てください。最初の 2 行だけが、わずかに異なっています。これで、標準化とデータ ストリームのチェーンの操作の利点がわかりました。

インターネットの操作 ファイルの操作
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2.URLConnectionクラス

単にインターネットからデータを読み取るだけでなく、データをアップロードすることもできます。データのアップロードは、読み取りよりもはるかに複雑です。さらにいくつかの方法が必要になります。例えば:

コード ノート
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
ページへのパスを含む URL オブジェクトを作成します
双方向接続を作成します


出力ストリームを取得し
ます データをそこに置き


ます 入力ストリームを取得します
そこからデータを読み取ります

ここではメソッドを呼び出さないことに注意してくださいurl.openStream()。代わりに、より長いルートを選択します。

  • URLConnection.openConnection()まず、次のメソッドを使用して安定した双方向接続を確立します。
  • 次に、メソッドを使用してデータを送信するためのストリームを取得しconnection.getOutputStream()、データをサーバーに送信します
  • 次に、メソッドを使用してデータを読み取るためのストリームを取得しconnection.getInputStream()、そこからデータの読み取りを開始します。

資源管理

厳密に言えば、安全に処理するには、すべてのストリームをブロックでラップする必要がありますtry-with-resourcesInputStreamそして、裸のものをもっと便利なもので包んでも問題はありませんOutputStream。たとえば、 やPrintStreamなどですBufferedReader

ここまでをすべて行うと、コードは次のようになります。

URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Send data
try (OutputStream output = connection.getOutputStream();
   PrintStream sender = new PrintStream(output))
{
   sender.println("Hello");
}

// Read data
try(InputStream input = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
   while (reader.ready())
      System.out.println(reader.readLine());
}

3. ネットワークの使用例

インターネットから何かをダウンロードしてみましょう。しかも、ダウンロードするだけでなく、ディスクに保存することもできます。

たとえば、Google ホームページの画像をディスクに保存するプログラムを作成してみましょう。

原則として、ここでは複雑なことは何もありません。最も単純な形式では、このコードは次のようになります。

ファイルをディスクに保存する
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

最初の 3 行を使用して、インターネット リソース、つまり画像からデータ ストリームを受信します。

4 行目では、画像を保存するファイルの名前を作成します。名前は任意ですが、ファイル拡張子はインターネット上の画像の拡張子と一致する必要があります。これにより、ローカルの画像ビューアが画像を正しく開くことができるようになります。

そして最後の行は、Filesクラスのcopyメソッドの 1 つです。クラスFilesにはそれらがいくつかあります。InputStream私たちが使用したこのメソッドは、最初のパラメータとしてバイト ストリーム ( ) を受け取り、2 番目のパラメータとしてデータを書き込むファイルの名前を受け取ります。

理論的には、URL画像の が短ければ、このコードは 1 行で書くこともできます。

ストリームからファイルへのデータのコピー
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

もちろん、このように記述する必要はありませんが、この例は、Java の I/O ストリームがいかに便利で強力であるかを示しています。