質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

4回答

2343閲覧

java 文字列連結と設定ファイル取得の処理速度の違いについて

javabigineer

総合スコア87

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/12/11 00:47

javaで開発中の開発初心者です。
疑問に思ったことがあるので、ご存知の方いらっしゃいましたら教えてください。
複数のフォルダパスを取得する際に、設定ファイルにフルパスを記述して毎回設定ファイルを読み込むのと、
ルートパスのみ設定ファイルに記述し、ルートパスから文字列連結してフォルダパスを作るのでは処理速度としてどちらが早いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ご質問の趣旨とは少し違ってしまいますが、java.io.Filejava.nio.file.Pathあたりを使うことは想定されていないのでしょうか?

これらのAPIを使うことで、ある程度は、プラットフォームの違いを意識せずにパスを処理することができます。Windowsでもパス区切りを/で書けたりとか、相対パスを解決したりとかできます。
ただし、全く意識しないわけには行きません。例えば、Windowsのドライブレターなど。

文字列の結合に比べるとパフォーマンスは多少下がりますが、面倒な処理や間違いを減らせるかも知れません。


参考リンク:

java.io.File - Java SE 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/api/java/io/File.html

java.nio.file.Path - Java SE 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/api/java/nio/file/Path.html

投稿2015/12/11 06:55

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ケースによると思います。
絶対ごっちってのはないです。

上記時間計測コードを使って実際にやってみるのをおすすめします。

投稿2015/12/11 01:51

liguofeng29

総合スコア801

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Javaに限って言うと、パスの連結という処理は避けたいです。
なぜかというと、標準ライブラリに「パスを連結する」というメソッドが用意されていないから。
文字列だから連結するのに標準メソッドなんか必要ないのではと思われますか? 文字列を連結するのに、Windows環境なら''で、POSIX環境なら'/'で連結する、と場合分けしないといけなくなります。
(「どうせLinuxでしか動かさないから」という前提はあるかもしれませんが、いつ顧客から移植を要求されるかわかりませんし、前提を知らない後任者がWindows環境で動かそうとして謎の誤動作に悩まされることもあるでしょう)

そういう環境依存のデータは外出しにしてしまうのがトラブルを避ける知恵となります。

Javaでなく.NET Frameworkだとパスを操作する標準クラスが用意されていて、ちょっと事情が変わってくるんですけどね。

投稿2015/12/11 01:04

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/11 01:53

.NET Frameworkの事情は全く知らないので同等機能かはわかりませんが、Javaでは[`File.separator`](https://docs.oracle.com/javase/jp/8/api/java/io/File.html#separator)で区切り文字を取得することができます(そして少なくともOracle JVMであればWindowsで/を使おうがUnixで¥を使おうが区切り文字として認識されたはず)。パスの連結メソッドは[`Paths.get`](https://docs.oracle.com/javase/jp/8/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...-)で可能ですね。こちらも参考になるかと: [https://docs.oracle.com/cd/E26537_01/tutorial/essential/io/pathOps.html](https://docs.oracle.com/cd/E26537_01/tutorial/essential/io/pathOps.html)
yuba

2015/12/11 03:08 編集

File.separator って、確かにありますね。なるほど、OSを判別するコードは書かなくて済みましたか。 それでも依然として、パス名をアプリケーションロジックで操作するのはできる限り避けるのがいいと考えます。ファイルシステムというのはプログラムにとっては環境であり、動作ロジックはできる限り環境から切り離された状態で組み上げるのがクリーンだからとなります(Webアプリで永続化層やビューをモデルから切り離すのと同様です。これらも環境との対話です)。 早い話、パスにまつわるOS依存は区切り文字だけでなく、最大長・禁則文字・ドライブ名システム・マルチストリームなどキリが無いのです。
javabigineer

2015/12/11 06:25

環境とロジックは切り離して組むほうがプログラムとして良いのですね。勉強になりました。ありがとうございます。
guest

0

こういうのは質問サイトに投稿するより自分でやった方が早いです。

Java

1long start = System.currentTimeMillis(); 2 3// 適当に10000回くらい繰り返す 4for(int i = 0; i < 10000; i++){ 5 //計測する処理 6} 7 8long end = System.currentTimeMillis(); 9System.out.println((end - start) + "ms");

投稿2015/12/11 01:01

moredeep

総合スコア1507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javabigineer

2015/12/11 06:24

実際にこのロジックで計測してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問