ファイル操作の基本

ファイル操作の基本

⑴ファイル操作とは、代表的には、以下を行うこと。
・ファイル作成
・ファイルの読み込み
・ファイルの書き込み
・ファイル名変更
・ファイル削除

⑵ファイルに付与されているパーミッション(権限)を意識して使用する。

⑶Fileクラスを使用する。
https://techacademy.jp/magazine/17667

Fileクラスはフォルダ(ディレクトリ)とファイルの両方を扱うため、拡張子付きの絶対パスでファイルであることを保証する。

File file = new File("絶対パス");

⑷ファイル操作で意識すべきこと
・ファイルパス
・モード(読み込み専用、書き込み専用、読み書き両方)
文字コード
・改行コード

⑸FileとFiles
import java.io.File
https://www.sejuku.net/blog/20457
java.nio.file.Files(JDK7から)
https://www.sejuku.net/blog/20635#i

プリミティブ型(基本型)と参照型

Javaのデータの種類と扱い方について、

(1)型の分類(2)代入と呼出し(3)同値性と同一性で考える。

 

(1)型の分類
①プリミティブ型(基本型)
・文字型(char)
・整数型(int)
浮動小数点数型(float)
・真偽値(boolean)
https://nobuo-create.net/primitive/

②参照型
・オブジェクト(クラス)型
・配列型
・列挙型
https://nobuo-create.net/sanshougata/#i-3

(2)代入と呼出し
①プリミティブ型(基本型)
・値代入、値渡し

②参照型
・参照値代入、参照渡し

※値渡しと参照渡し
http://ts0818.hatenablog.com/entry/2017/06/29/230038

(3)同値性と同一性
①同値性とは、同じ値であること。
・プリミティブ型(基本型)
==演算子(同値性の比較)
・参照型
equalsメソッド(同値性の比較)

②同一性とは、同じインスタンスの参照であること。
・参照型
==演算子(同一性の比較)

https://nobuo-create.net/sanshougata/#equals

tips
サイズ(メモリ消費量)固定できるデータを基本データ型として定義して、固定できないデータは、参照型として参照先でサイズ可変にしてるってこと。勉強になる。
http://ts0818.hatenablog.com/entry/2017/06/29/230038

プログラミングのパラダイム

パラダイムとは、スタイル、方法、考え方のこと。

 

プログラミングのパラダイムは大きく3つ。

①手続き型プログラミング
関数型プログラミング
オブジェクト指向プログラミング

 

パラダイムの大きな違いは状態(ステート)の持ち方の違い。
ここでの状態とは、変数の値のこと。

 

①手続き型プログラミング
・状態を常にグローバル変数として持つ。
・どこからでも状態(ステート)を書き換えられるので、予期しないエラーが起こりやすいのがリスク。


関数型プログラミング
・ラムダ計算が起源。

・関数に状態を持たせる(引数に状態を渡し、その戻り値を次の関数等の引数に渡す)。
グローバル変数を排除することで、手続き型プログラミングの問題点を解決。

関数型プログラミングには、副作用(コードがグローバル変数の状態を変えること)がないという重要な特徴があります。現在の関数外のデータに依存しませんし、現在の関数外に存在するデータは変更されません。」
メアリー・ローズ・クック

・しかし、関数外のデータを引数に処理をすれば、副作用はそのまま発生します。

 

オブジェクト指向プログラミング
関数型プログラミングのように引数に状態を渡す(関数に状態を持たせる)のではなく、オブジェクトに状態を持たせる。
・オブジェクトとは、クラスのインスタンス
・つまり、データ型はそのクラス型。

・メリットは、コードの再利用が促進されることで、開発、保守にかかる合計時間が短縮されること。
・一方で、デメリットは、プログラムを書く前の計画や設計により多くの時間を費やさなければならないこと。

・メリットとデメリットのトレードオフを考える必要がある。

 

Javaは3つのパラダイムを同時に扱うことが可能。

 

参考

https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-Python%E8%A8%80%E8%AA%9E%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E4%BB%95%E4%BA%8B%E3%81%AE%E3%82%84%E3%82%8A%E6%96%B9%E3%81%BE%E3%81%A7-%E3%82%B3%E3%83%BC%E3%83%AA%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%AB%E3%82%BD%E3%83%95/dp/4822292274/ref=mp_s_a_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&qid=1537693384&sr=8-1&pi=AC_SX236_SY340_QL65&keywords=%E7%8B%AC%E5%AD%A6+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC

 

javaからpostgresqlに接続する

とりあえずのメモですなと。

 

1.インストール手順(Windows10 64bit)

(1)「postgresql-X.X.X-X-windows.exeを実行

・Instration Directory→インストールされるディレクト

C:Program Files (x86)PostgreSQLX.X

・Data Directory→実際に使ったデータの保存先

C:Program Files (x86)PostgreSQLX.Xdata

・Password postgres

・Port 5432

・Locale Japanesejapan

 

2.デバック・動作確認http://si.comp.ae.keio.ac.jp/web_app_dev_material/simple/dev_db/dev_db_java/index.html

 

3.JavaPostgresql接続時エラーと解決策

(1)エラーの文字化け

■事象

エラー内容が文字化けしてしまう。

■解決策

postgresql.confファイルを開く

②lc_messages = 'Japanese_Japan.932'をコメントアウト

③lc_messages = 'C'を追加

PostgreSQL を再起動する

 ・ [コントロールパネル]-[管理ツール]-[サービス] を選択

 ・「postgresql-x64-X.X」 を右クリックし「再起動」を選択

<https://blogs.yahoo.co.jp/dk521123/33325738.html>

 

(2)パスワード権限の失敗

■事象

Class.forName("org.postgresql.Driver");Connection connection =   

DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres", "");

Statement statement = connection.createStatement();

■解決策

Class.forName("org.postgresql.Driver");Connection connection =  

DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres",

"postgres");

Statement statement = connection.createStatement();

<https://blogs.yahoo.co.jp/dk521123/33327164.html>

 

(3)デフォルトのResultSetが巻き戻し不可

■事象

Class.forName("org.postgresql.Driver");Connection connection =

DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres",

"postgres");Statement statement = connection.createStatement();

-----------------------------------

【コンソール出力】

org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY. at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkScrollable(AbstractJdbc2ResultSet.java:236)

at org.postgresql.jdbc2.AbstractJdbc2ResultSet.first(AbstractJdbc2ResultSet.java:318)

at test.UserDB.executeSelect(UserDB.java:117)

at test.UserDB.execute(UserDB.java:100)

at test.UserDB.main(UserDB.java:31)

-----------------------------------

■解決策

Class.forName("org.postgresql.Driver");Connection connection =  

DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres",

"postgres");

Statement statement =

connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,

ResultSet.CONCUR_READ_ONLY);

-----------------------------------

【コンソール出力】

id: 1, name: 1, password: 1

id: 2, name: 2, password: 2

-----------------------------------

 

3.JavaPostgresqlSQL周りのエラー

(1)id列がnot null制約違反と言われる。

■事象

ERROR: null value in column "id" violates not-null constraint Detail: Failing row contains (null, `1 , 1 , 2018-08-27, null).

■解決策

対象テーブルのカラムidにserialを明示的に設定する。(そうしないと、暗黙的にnullが設定されるらしい。)
create table tablename (
colname serial
);

■備考
・まず、postgresqlのserialとは、いわゆる、連番の自動採番のこと。
サロゲートキー(人工キー)です。連番かつ一意ということ。
 http://argius.hatenablog.jp/entry/20120607/1339077696
・serial指定したカラムはinsert文発行時に自動採番される。
 http://developpp.blog.jp/archives/8224244.html

 

(2)serial指定したカラムがResultSetに見つからないと言われる。

■事象

The column name id was not found in this ResultSet.

■解決策
serial指定してるんだから無視してくれよって感じ。
nextval関数を指定…って無理か。。。諦めました。とりあえず、自動採番はやめ。
https://qiita.com/5zm/items/da82cec73e097d2a97d0

再開するなら、ここからだけど、もうこの事象で疲れ果てたので、いったん諦めます。。。。。。
http://si.comp.ae.keio.ac.jp/web_app_dev_material/simple/dev_servlet/dev_servlet_prac/index.html

【作成中】日付と時刻を扱うクラス

■Calenderクラス(java.util.Calender)
・mutable(可変)オブジェクト
・月は0始まり

■LocalDateクラス(java.time.LocalDate)
日付を扱うクラス(Java SE8以上で対応)
・immutable(不変)オブジェクト→参照が変わらない限り、日付が一定。
・月が1始まり

■LocalTimeクラス(java.time.LocalTime)
時刻を扱うクラス(Java SE8以上で対応)
・immutable(不変)オブジェクト→参照が変わらない限り、時刻が一定。
・24時間で時間を扱う。
・午前/午後の区別なし。

■LocalDateTimeクラス(java.time.LocalDateTime)
日付と時刻を扱うクラス(Java SE8以上で対応)

■Durationクラス()
(Java SE8以上で対応)

■Periodクラス()
(Java SE8以上で対応)

immutableとmutable

【mutableオブジェクト】
■概要
可変オブジェクト、可変クラス。
何度でもフィールドセットできる。
オブジェクトやクラスの状態(フィールド)を変更できる。基本原則はmutable。
つまり、例外のimmutableをおさえりゃいい。

【immutableオブジェクト】
■概要
不変オブジェクト、不変クラス
一度セットしたフィールドの値を二度と変更できない。

■代表例
java.lang.String
java.io.File

■実装方法
・クラスをfinalで宣言する。
→メソッドがオーバーライドされない=サブクラスからの変更を防ぐ
・フィールドを全てprivateで修飾する。
・オブジェクトの内部に可変オブジェクトを定義している場合、そのオブジェクトを提供しない
→getterメソッドなどは提供しない
・オブジェクトの内部状態を変更できるメソッドを提供しない
→setterメソッドなどは提供しない

■メリット
・オブジェクトの値の変更有無確認不要
・スレッドセーフ
・データ複製不要
・データ共有可能(複数クライアント間)

【作成中】基本APIの利用

【文字列操作】

java.lang.String

java.lang.StringBuilder

javaの備忘録(StringクラスとStringBuilderクラス)

https://jioatips.hatenablog.com/entry/2018/07/24/013433)

 

【日時操作】

java.util.Calender

java.util.Date

java.util.SimpleDateFormat

Java SE8以降で使用可能↓

java.time.LocalTime

java.time.LocalDate

java.time.LocalDateTime

Java SE8以降で使用可能↑

【コレクション操作】

java.util.ArrayList