2017年8月21日月曜日

【Java】File Downloadその3(commons-io)

String str = IOUtils.toString(new URL(targetUrl), Charset.defaultCharset());
FileUtils.writeStringToFile(new File(filePath), str, Charset.defaultCharset());

ファイル保存される。ちょっとしたものは上記で良いが、apache httpclientを推奨。apache httpclientはアクセス先がページ移動(301)したとき等に自動で移動してくれる。

◆ソースコード
package sample.httpget;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

public class App {
  public static void main(String[] args) {
    try {
      download("http://google.com/", "/tmp/google.htm", Charset.forName("Shift_JIS"));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void download(String targetUrl, String filePath, Charset ch) throws IOException {
    String str = IOUtils.toString(new URL(targetUrl), ch);
    FileUtils.writeStringToFile(new File(filePath), str, Charset.defaultCharset());
  }
}

◆pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>sample</groupId>
 <artifactId>HttpGet</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>HttpGet</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
  </dependency>

 </dependencies>
</project>

2017年8月20日日曜日

【Java】簡易HTTP Post

■3つ程。3番目はcommons-ioが必要。

◆ソースコード
package sample.httppost;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;

import javafx.util.Pair;

public class App {
  public static void main(String[] args) {
    try {
      sendPost1("http://localhost:8090/", "abc");
      System.out.println(sendPost2("http://localhost:8090/", "abc"));
      System.out.println(sendPost3("http://localhost:8090/", "abc", Charset.defaultCharset()));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void sendPost1(String targetUrl, String sendStr) throws IOException {
    URLConnection conn = new URL(targetUrl).openConnection();
    conn.setDoOutput(true);

    try (OutputStream st = conn.getOutputStream()) {
      st.write(sendStr.getBytes());
    }
  }

  public static int sendPost2(String targetUrl, String sendStr) throws IOException {
    HttpURLConnection conn = (HttpURLConnection) new URL(targetUrl).openConnection();
    conn.setDoOutput(true);

    try (OutputStream st = conn.getOutputStream()) {
      st.write(sendStr.getBytes());
    }
    return conn.getResponseCode();
  }


  public static Pair<Integer,String> sendPost3(String targetUrl, String sendStr, Charset chSet) throws IOException {
    HttpURLConnection conn = (HttpURLConnection) new URL(targetUrl).openConnection();
    conn.setDoOutput(true);
    conn.setRequestProperty("Accept-Charset", chSet.name());
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + chSet.name());
    conn.setRequestProperty("User-Agent", "Mozilla/5.0");

    try (OutputStream st = conn.getOutputStream()) {
      st.write(sendStr.getBytes());
    }

    try (InputStream st = conn.getInputStream()) {
      int code = conn.getResponseCode();
      String str = IOUtils.toString(st, chSet);
      return new Pair<Integer, String>(code, str);
    }
  }
}

◆pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>sample</groupId>
 <artifactId>HttpPost</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>HttpPost</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
  </dependency>
 </dependencies>
</project>

【Java】File Downloadその2(commons-io)

FileUtils.copyURLToFile(new URL("http://google.com/"), new File("/tmp/google.htm"));

1行ですむが文字コードが指定できない。保存したファイルをブラウザで開くとサイトによっては文字化けする。何故だ…
ちょっとしたものは上記で良いが、apache httpclientを推奨。apache httpclientはアクセス先がページ移動(301)したとき等に自動で移動してくれる。

◆ソースコード
package sample.httpget;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.apache.commons.io.FileUtils;

public class App {
 public static void main(String[] args) {
  try {
   download("http://google.com/", "/tmp/google.htm");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public static void download(String targetUrl, String filePath) throws IOException {
  FileUtils.copyURLToFile(new URL(targetUrl), new File(filePath)); // 文字コードが設定できないのでサイトによっては文字化けする?
 }
}



◆pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>sample</groupId>
 <artifactId>HttpGet</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>HttpGet</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
  </dependency>

 </dependencies>
</project>



【Java】File Downloadその1(commons-io)

IOUtils.toString(new URL("http://google.com/"), "Shift_JIS");

ちょっとしたものは上記で良いが、apache httpclientを推奨。apache httpclientはアクセス先がページ移動(301)したとき等に自動で移動してくれる。

◆ソースコード
package sample.httpget;

import java.io.IOException;
import java.net.URL;

import org.apache.commons.io.IOUtils;

public class App {
  public static void main(String[] args) {
    try {
      System.out.println(download("http://google.com/", "Shift_JIS"));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static String download(String targetUrl, String ch) throws IOException {
    return IOUtils.toString(new URL(targetUrl), ch);
  }
}

◆pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>sample</groupId>
 <artifactId>HttpGet</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>HttpGet</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
  </dependency>

 </dependencies>
</project>



2017年8月19日土曜日

【Java】ServletでFile download(nio)

Files.copyでiostreamが指定可能とのことなので、試してみる。ちなみにサーブレットコンテナはJetty。
◆ソース(必要に応じてtry-catchを入れること。でないとexception発生時にexceptionがブラウザに出てしまう。)
package sample.niocopy;

import java.io.BufferedOutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;

public class MyServlet extends HttpServlet {
  public static void main(String[] args) throws Exception {
    ServletHandler handler = new ServletHandler();
    handler.addServletWithMapping(MyServlet.class, "/*");

    Server server = new Server(8090);
    server.setHandler(handler);
    server.start();
    server.join();
  }

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
      Path uri = Paths.get("c:/tmp" + req.getRequestURI());

      if (Files.notExists(uri) || Files.isDirectory(uri)) {
        res.setStatus(404);
      } else {
        res.setContentType("application/octet-stream");
        res.setContentType("text/html; charset=UTF-8");
        res.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", uri.getFileName()));
        try (BufferedOutputStream bos = new BufferedOutputStream(res.getOutputStream())) {
          Files.copy(uri, bos);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

◆速度

◆結論
普通に使える。パット見メモリリークはないが、要確認。BufferedOutputStream,BufferedInputStreamの2つを利用した場合と比較したが、速度は同じ。

◆pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>sample</groupId>
 <artifactId>NioCopy</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>NioCopy</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <jetty.version>9.3.6.v20151106</jetty.version>
 </properties>

 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-server</artifactId>
   <version>${jetty.version}</version>
  </dependency>
  <dependency>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-webapp</artifactId>
   <version>${jetty.version}</version>
  </dependency>
 </dependencies>
</project>

◆環境
  • 速度確認した仮想マシン
    • CPU core数:4
    • メモリ:2.5GB
    • OS:Windows10 Pro x64
    • 仮想マシン:VMWare vShpere ESXi6.5
    • Java:1.8

  • ホストPCの性能(参考)
    • CPU:Intel Core i5-4250U(2Core 2HT)
    • メモリ:16GB
    • ドライブ:SSD(ウルトラ II mSATA SSD SDMSATA-512G-G25C)
    • 仮想マシン:VMWare ESXi6.5上の仮想マシン