20220112のJavaに関する記事は7件です。

初めてのjda-utilties (JavaのDiscordBot)

使い方・初めてではまったことを書いていきます。 jda初心者なのでミスがあるかもしれないです。 appとbotの作成 まずDiscord Developer Portalに行きます。 https://discordapp.com/developers/applications/ NewApplicationを押す 名前の入力 create ここで画像とかを設定できます 左のメニューからbotを選択します AddBotを押す これでbotができました。 botの招待urlの取得 左のメニューからOAuth2 > URL Generatorを選択します botを選択し、権限も設定します。 Copyでurlをコピーできます。 tokenの取得 左のメニューのbotを選択します。 アイコンの右にあるTOKENの下のCopyでコピーできます。 ownerIdの取得 botのオーナーでログインします。 設定を開き詳細設定を開きます。 開発者モードをオンにします。 マイアカウントを開きます。 ユーザー名の隣の点々を押すと出てくるユーザーIdをコピーを押してコピーできます。 プロジェクトの作成 今回はmavenを使います プロジェクト内のpom.xmlに依存関係を追記します jdaとjda-utiltiesのバージョンがわかりにくかったのでurlを張っておきます。 jda: https://mvnrepository.com/artifact/net.dv8tion/JDA?repo=jcenter jda-utlties: https://mvnrepository.com/artifact/com.jagrosh/jda-utilities?repo=jcenter githubのurl JDA: https://github.com/DV8FromTheWorld/JDA jda-utilties: https://github.com/JDA-Applications/JDA-Utilities pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" 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>groupeId</groupId> <artifactId>artifactId</artifactId> <version>version</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <!--ここから追記--> <repositories> <repository> <id>central</id> <name>bintray</name> <url>https://jcenter.bintray.com</url> </repository> </repositories> <dependencies> <dependency> <groupId>net.dv8tion</groupId> <artifactId>JDA</artifactId> <version>4.2.0_247</version> </dependency> <dependency> <groupId>com.jagrosh</groupId> <artifactId>jda-utilities</artifactId> <version>3.0.5</version> <scope>compile</scope> <type>pom</type> </dependency> </dependencies> <!--ここまで--> </project> コードを書く botにログインするコードを書きます。 import com.jagrosh.jdautilities.command.CommandClient; import com.jagrosh.jdautilities.command.CommandClientBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.OnlineStatus; import net.dv8tion.jda.api.entities.Activity; import javax.security.auth.login.LoginException; public class Bot { private static final String TOKEN = "token"; private static final String OWNER_ID = "ownerId"; private static final String COMMAND_PREFIX = "cmd"; private static JDA jda; public static void main(String[] args) { CommandClient commandClient = new CommandClientBuilder() .setPrefix(COMMAND_PREFIX) .setOwnerId(OWNER_ID) .setStatus(OnlineStatus.ONLINE) .setActivity(Activity.playing("play中")) .build(); try { jda = JDABuilder.createDefault(TOKEN) .addEventListeners(commandClient) .build(); } catch (LoginException e) { e.printStackTrace(); } } } 最後に ネットに転がっている情報だと古くてうまく動かなかったり苦労しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaのHttpClientで、APIのレスポンスボディを自作クラスのインスタンスにする方法

以下のAPIのレスポンスボディを扱いやすくしたい { "id":"1", "name":"田中" } 方法 レスポンスボディに対応したプロパティを持つクラスを作成する public class ApiResponseBody { private String id; private String name; } jacksonを導入する(今回はMaven) <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.1</version> </dependency> レスポンスボディを自作クラスのインスタンスにする // APIにリクエスト var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("URL")) .build(); var response = client.send(request, HttpResponse.BodyHandlers.ofString()); // レスポンスボディをApiResponseBodyにパーシング var objectMapper = new ObjectMapper(); var apiResponseBody = objectMapper.readValue(response.body(), ApiResponseBody.class);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaで簡単なパスワードジェネレーターを作ってみた

Java初心者なので、とりあえずJavaのアルゴリズムを作成してみました。 今回の要件としては、 ・パスワードは数字のみ ・桁数と数はユーザーが指定できる といったものになります。 処理の内容 ・ユーザーから入力された値(桁数・パスワードの数) ・指定された桁数×指定されたパスワードの数分の乱数を生成する。 ・指定された桁数で区切る ・もしユーザーが全角・半角の数字以外のものを入力してきたら、「入力は数字のみでお願いします」 という言葉を出力し、もう一度入力させる。 繰り返し数字を入力してこなかったら、数字を入力するまでそのアナウンスを繰り返す。 といった処理になります。 それではやっていきましょう!!!!! まず、パスワードを作るために必要なユーザーからの入力を受け付ける部分を作っています。 まず、ほしいパスワードの数を求めます まず3行目から、 System.out.println("ほしいパスワードの数を入力してください"); String inputQuantity = passQuantity.next(); とすることで、パスワードの数をまずきいてその後に変数inputQuantityにユーザーが入力した数字を文字列型として格納します。 その次のWhile文で、数字かそうではないかの確認を行ってもし数字ではなかったら、何度も何度も同じアナウンスをして数字を入力させる while (!inputQuantity.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputQuantity = passQuantity.next(); if(inputQuantity.matches("[0-90-9]{1,}")){ break; } } 最初のwhileの条件式に while (!inputQuantity.matches("[0-90-9]{1,}")){ とすることで、もしinputQuentityの中身が数字ではなかった場合というのが成り立ちます。 最初に!があると思うのですが、これは否定演算子というもので、条件式の内容がもしtrueならfalseで、falseだったらtrueになるというものです。 今回の場合は、 「変数inputQuentityが正規表現にマッチしない場合」 がtrueになっています。 なぜかというと、 「変数inputQuentityが正規表現にマッチする場合」 の条件式に!(否定演算子)がついているため、上記のように 「変数inputQuentityが正規表現にマッチしない場合」 がtrueになります。そして、while文なのでtrueの条件がfalseにならない限り無限ループし続けます。 正規表現について 正規表現からわかるかもしれませんが、 「半角と全角の一桁以上の数字を正とする」 というものです。 {1,} とすることで、一桁以上とすることができます。 これをつけないで "[0-90-9]" としてしまうと、二桁以上入力してしまうとfalseになってしまいます。 なので、 "[0-90-9]{1,}" とすることで対応しています。 これをしないとwhile文の中に入って入力は数字のみでお願いしますの文字が出力されてしまいます。 そして中身に System.out.println("入力は数字のみでお願いいます"); inputQuantity = passQuantity.next(); として、入力は数字のみでお願いします。 それをしてユーザーが入力した値が数字ではないと言うことを示せます。 そして変数inputQuantityを初期化することで、再入力された値を変数inputQuentityに格納します。 そうすることでinputQuentityの値があら不思議!! 前に入力された値が手放されて新しい値が入りました!!!!! んで、while文からどうやって抜けるんだよと思うかもしれませんが、それを今から解説しします。 以下の条件にすると、入力された値が正規表現にきちんとマッチする場合は、breakとすることでwhile文から抜けられる様になっています、 if(inputQuantity.matches("[0-90-9]{1,}")){ break; } 変数inputQuentityの値がきちんと正規表現に沿っていた場合はtrueになって、if文の中に入ります。 そしてbreak;の処理が動きます。 その次に Integer digits = Integer.valueOf(inputDigits); とすることでString型の変数の値をInteger型に変更します。 こうしないとpasswordメソッドのなかのfor文でループカウンターで使うことができないということが置きます。 そして最後に System.out.println(inputQuantity + "ですね。わかりました"); として、入力された値をユーザーに確認させます。 次にほしいパスワードの桁数を指定する。 いっちょ前に区切っていますがやっていることは今まで解説したことと変わりません。 System.out.println("次に、ほしい桁数をお願いします"); String inputDigits = passQuantity.next(); 最初にほしい桁数の数を入力させて、それを文字列型で格納します。 それでwhile文に入って変数inputDigitsの中身が数字かどうかを確認しています。 while (!inputDigits.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputDigits = passQuantity.next(); if(inputDigits.matches("[0-90-9]{1,}")){ break; } } そして、もしこのwhile文の条件である変数inputDigitsが一桁以上かつ全角・半角の数字ではない場合はtrueになるようにして、 while (!inputDigits.matches("[0-90-9]{1,}")){ このwhileの中に入っているif文の条件である変数inputDigitsの内容が全角・半角の条件になる場合はtrueになります。 if(inputDigits.matches("[0-90-9]{1,}")){ break; } そしてtrueになったら、break;があるのでこのwhile文のループから抜けられる。 そしてその後に、変数inputDigitsを文字列型から数値型に変換して、変換した値を変数digitsに格納する これでできた2つの値を、配列に格納する。 int[] result = new int[2]; result[0] = quantity; result[1] = digits; return result; 数値型の配列を宣言して、0番目に最初に出したquentityを格納して、その後に求めたdigitsを格納する。 ユーザーからの入力を受け取るためのメソッドの全体のコード public static int[] operater(){ Scanner passQuantity = new Scanner(System.in); System.out.println("ほしいパスワードの数を入力してください"); String inputQuantity = passQuantity.next(); while (!inputQuantity.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputQuantity = passQuantity.next(); if(inputQuantity.matches("[0-90-9]{1,}")){ break; } } Integer quantity = Integer.valueOf(inputQuantity); System.out.println(inputQuantity + "ですね。わかりました"); System.out.println("次に、ほしい桁数をお願いします"); String inputDigits = passQuantity.next(); while (!inputDigits.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputDigits = passQuantity.next(); if(inputDigits.matches("[0-90-9]{1,}")){ break; } } Integer digits = Integer.valueOf(inputDigits); System.out.println(digits + "桁ですね。わかりました"); //ユーザーから入力された値を配列に格納して返す。 int[] result = new int[2]; result[0] = quantity; result[1] = digits; return result; } そして、これから返り値を用いてパスワードを生成していきます。 まず、これらを用いてユーザーの要望を聞いていた部分を呼び出します。 上で説明したoperaterメソッドは配列で帰ってきているので、配列としてoperaterメソッドを呼び出します。 そして、operaterメソッドを変数resultに格納します。 int[] result; result = operater(); これで、operaterメソッドで作成した値を今回のpasswordメソッドでも使うことができます。 次に、パスワードを実際に作成している処理について書いていきます。 for文をネストさせて書いていますね。 result[0]に入っているのはほしいパスワードの数です。外側のfor文でほしいパスワードの数分ループさせています。 そこで、StringBuilderを用いてパスワードの数のタイミングで改行が挟まるようになっています。 これをしないと、出力されたパスワードが横一列にずっと並んでしまいます。 例として、5桁のパスワードを3つ作るとしたら生成される数字の数は15個です。ですが、StringBuilderを用い無いで出力をさせると、 908715434533456 のように5桁ごとに区切られないで表示されてしまいます。正しく表示させるなら、 90871 54345 33456 と表示させないと非常に使いにくいですよね。 なので、StringBuilder型の変数sbを定義する必要があるわけです。 それを、一つのパスワードが生成されるタイミング(外側のループが一周するタイミングで)StringBuilderオブジェクトを生成することで区切っているわけです。 StringBuilder sb; for (int i = 0; i < result[0]; i++){ sb = new StringBuilder(); for (int j = 0; j < result[1]; j++){ sb.append((int)Math.ceil(Math.random() * 9)); } System.out.println(sb); } 更に、内側のresult[1]を使っているfor分で、変数sbの中に入る値を作っています。 このfor文で、sbに対して0以上9以下の乱数(小数点切り捨て)をほしい桁数分生成して、それを変数sbの中に格納しています。  返り値を用いてパスワードを生成するメソッドの全体のコード public static void main(String args[]){ password(); } public static void password() { int[] result; result = operater(); StringBuilder sb; for (int i = 0; i < result[0]; i++){ sb = new StringBuilder(); for (int j = 0; j < result[1]; j++){ sb.append((int)Math.ceil(Math.random() * 9)); } System.out.println(sb); } } 説明は以上になります 最後に、今回作成舌コード全文を載せます。 import java.util.Random; import java.util.Scanner; class makePassword { public static void main(String args[]){ password(); } public static void password() { int[] result; result = operater(); StringBuilder sb; for (int i = 0; i < result[0]; i++){ sb = new StringBuilder(); for (int j = 0; j < result[1]; j++){ sb.append((int)Math.ceil(Math.random() * 9)); } System.out.println(sb); } } /** ユーザーの入力値を受け取るメソッド。 * ただ、while文では、数値以外の入力があった場合(a,b、顔文字など)は、もう一度ユーザーに入力させるためのコードである。 */ public static int[] operater(){ Scanner passQuantity = new Scanner(System.in); System.out.println("ほしいパスワードの数を入力してください"); String inputQuantity = passQuantity.next(); while (!inputQuantity.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputQuantity = passQuantity.next(); if(inputQuantity.matches("[0-90-9]{1,}")){ break; } } Integer quantity = Integer.valueOf(inputQuantity); System.out.println(inputQuantity + "ですね。わかりました"); System.out.println("次に、ほしい桁数をお願いします"); String inputDigits = passQuantity.next(); while (!inputDigits.matches("[0-90-9]{1,}")){ System.out.println("入力は数字のみでお願いいます"); inputDigits = passQuantity.next(); if(inputDigits.matches("[0-90-9]{1,}")){ break; } } Integer digits = Integer.valueOf(inputDigits); System.out.println(digits + "桁ですね。わかりました"); //ユーザーから入力された値を配列に格納して返す。 int[] result = new int[2]; result[0] = quantity; result[1] = digits; return result; } } もし何か、質問・指摘灯ありましたらよろしくおねがいします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaを使用してWord文書に複数のテキスト透かしを追加する方法

頭語 Word文書の透かしについて、皆よく知っているはずです。以前は単一行の透かしを紹介したことがありますが、日常でWordを使用していると、常に複数の透かしを追加しなければならないです。故にこの記事で、Javaを使用してWord文書に複数のテキスト透かしを追加する方法を紹介します。 コードのテスト環境 Intellij Idea 2019.1 JDK 1.8.0 Spire.Doc.jar jarパッケージの取得とインポート JarパッケージをIDEAに手動でインポートします。具体的な手順は次のとおりです。 ステップ1:E-iceblueの公式Webサイトに登録してログインし、Spire.Doc for Javaダウンロードページにアクセスして製品パッケージをダウンロードします。 ステップ2:製品パッケージを解凍し、libファイルの下でSpire.Doc.jarを見つけます。 ステップ3:Spire.Doc.jarをIDEAに手動でインポートします。 構成が完了したら、IDEAで「変更のインポート」をクリックしてJARパッケージをインポートする必要があります。Eclipseでは、「保存」ボタンをクリックする必要があります。 コード一覧 Spire.Doc for Javaは、WordヘッダーにWordArtを追加することにより、ドキュメントに複数行のテキスト透かしを追加することを実装しています。具体的なコードは次のとおりです。 import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.HeaderFooter; import com.spire.doc.Section; import com.spire.doc.documents.Paragraph; import com.spire.doc.documents.ShapeLineStyle; import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import java.awt.*; public class multiTextWatermark { public static void main(String[] args) { //テストドキュメントをロードする Document doc = new Document(); doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Sample.docx"); //WordArtを追加してサイズを設定する ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text); shape.setWidth(60); shape.setHeight(20); //WordArtのテキストコンテンツ、色、位置、スタイルを設定する shape.setVerticalPosition(30); shape.setHorizontalPosition(20); shape.setRotation(315); shape.getWordArt().setText("内部使用"); shape.setFillColor(Color.green); shape.setLineStyle(ShapeLineStyle.Single); shape.setStrokeColor(new Color(192, 192, 192, 255)); shape.setStrokeWeight(1); Section section; HeaderFooter header; for (int n = 0; n < doc.getSections().getCount(); n++) { section = doc.getSections().get(n); //セクションのヘッダーを取得する header = section.getHeadersFooters().getHeader(); Paragraph paragraph1; for (int i = 0; i < 4; i++) { //ヘッダーに段落を追加する paragraph1 = header.addParagraph(); for (int j = 0; j < 3; j++) { //WordArtを複製し、複数行、複数列の位置を設定する shape = (ShapeObject) shape.deepClone(); shape.setVerticalPosition(50 + 150 * i); shape.setHorizontalPosition(20 + 160 * j); paragraph1.getChildObjects().add(shape); } } } //ドキュメントを保存する doc.saveToFile("output/multi-lineTextwatermark.docx", FileFormat.Docx_2013); } } 結語 以上は、Word文書に複数のテキスト透かしを追加する方法でした、最後まで読んでいただきありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Twitter投稿

前提 Javaを利用してTwitterで呟くためには、twiiter4jを利用する記事を多く拝見しました。しかし、2021年12月にtwitterAPIがバージョンアップした為、twitter4jを利用した投稿は上手く行きませんでした。(twitter4j-v2というTwitter API v2向きのtwitter4jが存在しますが、自分の環境では依存関係を上手く読み込むことができませんでした。)2022年1月現在ではJavaでのTwitter API V2向きに対応している記事が少なかった為、記事録的に残しておきます。初学者な為至らない点があるかもしれません。 Twitter Developer 開発者申請(事前準備) Twitter Developerにアクセスし、開発者申請を行います。 以下リンクなどを参照し、申請を完了させます。 https://auto-worker.com/blog/?p=3157 自分の場合は長文で答えるような質問はありませんでした。バージョンアップで質問内容が少し異なっているようです。 ログイン後に以下の様に移動します。 Developer Portal → Projects&Apps → Projects → 自分で作成したプロジェクト名 User authentication settingsのEditをクリックします。 OAuth 1.0aにチェックを入れます。 App permissionsからRead and writeを選択します。こちらを選択することでTwitter APIを利用し、ツイートすることができる様になります。 GENERAL AUTHENTICATION SETTINGSのCallbak URI / Redirect URLとWebsiter URLに自分のツイッターURLを入力します。(自分はそうしました。。) 例:https://twitter.com/自分のユーザー名 一番下にあるSaveをクリックして、保存します。 続いて、keys and tokensを選択します。 ここで以下2点を発行し、保存します。(発行した値をメモしておいてください。) API Key and Secret Access Token and Secret twittered 今回はtwitteredを利用して、ツイートすることにしました。 Java開発者向けのTwitterAPIクライアントになります。 pom.xmlの設定 mavenの場合pom.xmlに対して、以下を設定します。(gradleの場合は公式ドキュメント を参照していただければと思いますmm) VERSIONにリリースされているバージョンを指定します。(2022年1月現在では以下の様になります。) <dependency> <groupId>io.github.redouane59.twitter</groupId> <artifactId>twittered</artifactId> <version>2.14</version> </dependency> ログを見る為に、以下の導入も推奨されている様です。 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> jsonファイルの作成 以下の様にjsonファイルを作成します。 メモした値をxxx箇所に設定します。 { "apiKey": "xxx", "apiSecretKey": "xxx", "accessToken": "xxx", "accessTokenSecret": "xxx" } ツイート ではいよいよ、本文を作成していきたいと思います。 公式ドキュメントのCode Samplesを参考に、作成しました。 ファイルパスは先ほど作成した、jsonファイルのパスを指定します。 以下の様にposteTweet内に文字列を指定することでツイートすることができます。 TwitterClient twitterClient = new TwitterClient(TwitterClient.OBJECT_MAPPER .readValue(new File("sample/key.json"), TwitterCredentials.class)); Tweet resultPost = twitterClient.postTweet("test"); 最後に ここではtwitterdを利用した、Javaでのツイート方法を記録しました。知識が浅い為至らない部分があったと思いますが、ここまでお読みいただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java Twitter投稿(twittered)

前提 Javaを利用してTwitterで呟くためには、twiiter4jを利用する記事を多く拝見しました。しかし、2021年12月にtwitterAPIがバージョンアップした為、twitter4jを利用した投稿は上手く行きませんでした。(twitter4j-v2というTwitter API v2向きのtwitter4jが存在しますが、自分の環境では依存関係を上手く読み込むことができませんでした。)2022年1月現在ではJavaでのTwitter API V2向きに対応している記事が少なかった為、記事録的に残しておきます。初学者な為至らない点があるかもしれません。 Twitter Developer 開発者申請(事前準備) Twitter Developerにアクセスし、開発者申請を行います。 以下リンクなどを参照し、申請を完了させます。 https://auto-worker.com/blog/?p=3157 自分の場合は長文で答えるような質問はありませんでした。バージョンアップで質問内容が少し異なっているようです。 ログイン後に以下の様に移動します。 Developer Portal → Projects&Apps → Projects → 自分で作成したプロジェクト名 User authentication settingsのEditをクリックします。 OAuth 1.0aにチェックを入れます。 App permissionsからRead and writeを選択します。こちらを選択することでTwitter APIを利用し、ツイートすることができる様になります。 GENERAL AUTHENTICATION SETTINGSのCallbak URI / Redirect URLとWebsiter URLに自分のツイッターURLを入力します。(自分はそうしました。。) 例:https://twitter.com/自分のユーザー名 一番下にあるSaveをクリックして、保存します。 続いて、keys and tokensを選択します。 ここで以下2点を発行し、保存します。(発行した値をメモしておいてください。) API Key and Secret Access Token and Secret twittered 今回はtwitteredを利用して、ツイートすることにしました。 Java開発者向けのTwitterAPIクライアントになります。 pom.xmlの設定 mavenの場合pom.xmlに対して、以下を設定します。(gradleの場合は公式ドキュメント を参照していただければと思いますmm) VERSIONにリリースされているバージョンを指定します。(2022年1月現在では以下の様になります。) <dependency> <groupId>io.github.redouane59.twitter</groupId> <artifactId>twittered</artifactId> <version>2.14</version> </dependency> ログを見る為に、以下の導入も推奨されている様です。 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.30</version> </dependency> jsonファイルの作成 以下の様にjsonファイルを作成します。 メモした値をxxx箇所に設定します。 { "apiKey": "xxx", "apiSecretKey": "xxx", "accessToken": "xxx", "accessTokenSecret": "xxx" } ツイート ではいよいよ、本文を作成していきたいと思います。 公式ドキュメントのCode Samplesを参考に、作成しました。 ファイルパスは先ほど作成した、jsonファイルのパスを指定します。 以下の様にposteTweet内に文字列を指定することでツイートすることができます。 TwitterClient twitterClient = new TwitterClient(TwitterClient.OBJECT_MAPPER .readValue(new File("sample/key.json"), TwitterCredentials.class)); Tweet resultPost = twitterClient.postTweet("test"); 最後に ここではtwitterdを利用した、Javaでのツイート方法を記録しました。知識が浅い為至らない部分があったと思いますが、ここまでお読みいただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Jython】AutoCloseable / Closeable 実装オブジェクトに with 文を使うには

try-with-resources文とwith文 Java にはtry-with-resources文があり、これを、インターフェースAutoCloseable又はインタフェースCloseableを実装したクラスをインスタンス化したオブジェクト(以下、AutoCloseable/Closeable実装オブジェクト)が使用すると、ブロック終了時又は例外発生時に於いて、自動的にそのオブジェクトのclose()メソッドが呼び出され、クローズ処理が為される。 次に示すJavaソースコードファイルMain.javaには、2 つのtry-with-resources文があり、変数bw及び変数brに、AutoCloseable/Closeable実装オブジェクトの参照が格納されている。 Main.java // -*- coding: UTF-8; -*- import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; class Main { public static void main(String[] args) { final File file = new File("iroha.txt"); // ファイル書き込み try (final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) { bw.write("いろはにほへと ちりぬるを"); bw.newLine(); bw.write("わかよたれそ つねならむ"); bw.newLine(); bw.write("うゐのおくやま けふこえて"); bw.newLine(); bw.write("あさきゆめみし ゑひもせす"); bw.newLine(); } catch (IOException e) { e.printStackTrace(); } // ファイル読み込み try (final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } 次に、Java コンパイラのバージョン確認、ソースコードのコンパイル、及び実行例を示す。 $ javac -version javac 17.0.1 $ javac -encoding UTF-8 Main.java $ java Main いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす 多くのJVM言語は、Java のtry-with-resources文に相当する機能を備えている。例えば、Kotlin のuseメソッド1、Jython (Javaで記述されたPython処理系) のwith文が挙げられる。 もし、Main.javaを Jython スクリプトに移植しようとするなら、だいたい次のようなものを想像するだろう。 # -*- coding: UTF-8; -*- from java.io import BufferedReader, BufferedWriter, File, FileInputStream, FileOutputStream, InputStreamReader, OutputStreamWriter from java.nio.charset import StandardCharsets file = File(u"iroha.txt") # ファイル書き込み with BufferedWriter(OutputStreamWriter(FileOutputStream(file), StandardCharsets.UTF_8)) as bw: bw.write(u"いろはにほへと ちりぬるを") bw.newLine() bw.write(u"わかよたれそ つねならむ") bw.newLine() bw.write(u"うゐのおくやま けふこえて") bw.newLine() bw.write(u"あさきゆめみし ゑひもせす") bw.newLine() # ファイル読み込み with BufferedReader(InputStreamReader(FileInputStream(file), StandardCharsets.UTF_8)) as br: line = br.readLine() while line: print(line) line = br.readLine() しかし、上記スクリプトは動作せず、次のエラー文を印字する。 AttributeError: 'java.io.BufferedWriter' object has no attribute '__exit__' Jython は、他のJVM言語とは異なり、AutoCloseable/Closeable実装オブジェクトであろうと関係なく、上記エラー文の指摘にもある実装要件を満たしていなければ、with文を使うことはできない。 しかしながら、AutoCloseable/Closeable実装オブジェクトにwith文を使う方法はある。 AutoCloseable/Closeable実装オブジェクトにwith文を使うには とっても簡単である。標準ライブラリのcontextlib.closing関数を作用させれば良い。具体的には、上記スクリプトを次のように修正する。 # -*- coding: UTF-8; -*- + from contextlib import closing from java.io import BufferedReader, BufferedWriter, File, FileInputStream, FileOutputStream, InputStreamReader, OutputStreamWriter from java.nio.charset import StandardCharsets file = File(u"iroha.txt") # ファイル書き込み - with BufferedWriter(OutputStreamWriter(FileOutputStream(file), StandardCharsets.UTF_8)) as bw: + with closing(BufferedWriter(OutputStreamWriter(FileOutputStream(file), StandardCharsets.UTF_8))) as bw: bw.write(u"いろはにほへと ちりぬるを") bw.newLine() bw.write(u"わかよたれそ つねならむ") bw.newLine() bw.write(u"うゐのおくやま けふこえて") bw.newLine() bw.write(u"あさきゆめみし ゑひもせす") bw.newLine() # ファイル読み込み - with BufferedReader(InputStreamReader(FileInputStream(file), StandardCharsets.UTF_8)) as br: + with closing(BufferedReader(InputStreamReader(FileInputStream(file), StandardCharsets.UTF_8))) as br: line = br.readLine() while line: print(line) line = br.readLine() 修正済み Jython スクリプトファイルMain.pyを、次に示す。 Main.py # -*- coding: UTF-8; -*- from contextlib import closing from java.io import BufferedReader, BufferedWriter, File, FileInputStream, FileOutputStream, InputStreamReader, OutputStreamWriter from java.nio.charset import StandardCharsets file = File(u"iroha.txt") # ファイル書き込み with closing(BufferedWriter(OutputStreamWriter(FileOutputStream(file), StandardCharsets.UTF_8))) as bw: bw.write(u"いろはにほへと ちりぬるを") bw.newLine() bw.write(u"わかよたれそ つねならむ") bw.newLine() bw.write(u"うゐのおくやま けふこえて") bw.newLine() bw.write(u"あさきゆめみし ゑひもせす") bw.newLine() # ファイル読み込み with closing(BufferedReader(InputStreamReader(FileInputStream(file), StandardCharsets.UTF_8))) as br: line = br.readLine() while line: print(line) line = br.readLine() 次に、Jython のバージョン確認、及び実行例を示す。 $ jython --version Jython 2.7.2 $ jython Main.py いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす 参考 try-with-resources文 インタフェースAutoCloseable インタフェースCloseable Jython with文 contextlib.closing関数 但し、Closeable未実装のAutoCloseable実装オブジェクトをuseメソッドに対応させるには、kotlin-stdlib-jdk7.jarをクラスパスに追加しなければならない。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む