@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

次のファイルを使用したJavaファイル作成のヒントを下さい

投稿者投稿内容
dejavu
ベテラン
会議室デビュー日: 2009/03/13
投稿数: 71
投稿日時: 2009-04-13 01:19
プログラム名はEnshu1.javaとします。

  1. ファイルに書き込む
    実行時:java Enshu1 wあいう
    ※ファイルに「あいう」が書き込まれる。
  2. ファイルを読み込み、内容を出力する。
    実行時:java Enshu1 r
  3. このプログラムに利用するファイルのソース

コード:

import java.io.*;
import java.util.*;

public class FileIOSample {

private static final String FILE_PATH = "c:\\data.txt";

public String[] fileRead() {

FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
String[] ret = null;
String dat = "";
ArrayList<String> array = new ArrayList<String>();

try {
fis = new FileInputStream(FILE_PATH);
isr = new InputStreamReader(fis, "Shift_JIS");
br = new BufferedReader(isr);
while ((dat = br.readLine())!= null) {
array.add(dat);
}
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}finally {
try {
if (br != null) {
br.close();
br = null;
}
if (isr != null) {
isr.close();
isr = null;
}
if (fis != null) {
fis.close();
fis = null;
}
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
if (array.size() < 0) {
ret = new String[1];
ret[0] = "";
}else{
ret = new String[array.size()];
array.toArray(ret);
}
return ret;
}
public void fileSave(String[] a_arryStr) {
FileOutputStream fos = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;

try {
fos = new FileOutputStream(FILE_PATH, false);
osw = new OutputStreamWriter(fos, "Shift_JIS");
bw = new BufferedWriter(osw);
for (int i=0; i<a_arryStr.length; i++) {
bw.write(a_arryStr[i]);
bw.newLine();
}
bw.flush();
} catch (FileNotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}finally{
try {
if (bw != null) {
bw.close();
bw = null;
}
if (osw != null) {
osw.close();
osw = null;
}
if (fos != null) {
fos.close();
fos = null;
}
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}





引数の数が正しくない場合や実行時の第1引数が「w」や「r」以外の場合は『引数を正しく入力して下さい。』と出力させてプログラムを終了させる。

このプログラムで分からないのはファイルに書き込む場合最初の「w」を書き込まずにどうやって書き込むのか。
ファイルを読み込む場合、「r」が大きな鍵を握ると思うのですが、やはりここはargs[]を使用するのでしょうね。
質問は以上なんですけど、ヒントでもいいので教えて頂けると大変有り難いです。

[ メッセージ編集済み 編集者: dejavu 編集日時 2009-04-13 21:48 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-13 08:46
なんでわざわざ配列に戻して返却してるのか不思議な気もしますが

ヒントがそのまま答えになってしまいそうなのですが
引用:

ファイルに書き込む場合最初の「w」を書き込まずにどうやって書き込むのか。


Google 検索 (java 文字列 一部)

引用:

やはりここはargs[]


argsとはmainメソッドの引数のことでいいですか?
だとすれば、rに限らず argsに格納されたコマンドライン引数は大きな鍵を握るでしょう。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2009-04-13 09:23
エントリポイント(mainメソッド)って知っていますか?
また、実行時引数って理解していますか?
おそらくは理解していないのはファイルの作成方法ではなく、Javaのプログラムの実行方法とその仕組みです。

具体的に言えば、
> ファイルに書き込む
> 実行時:java Enshu1 wあいう
これが間違いです。
通常は、
> 実行時:java Enshu1 w あいう
とします。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2009-04-13 16:06
わたなべさんのヒントをもとに書いてみました。
「動く」ものですから、こぴぺで試してください。
掲示板にコード載せるときは、動くコードの方が
いいと思いますよ。

コード:
package jp.at.it.test;

import java.io.*;

public class Sample1 {

	private static final String FILE_PATH = "C:/test.txt";
	
	public static void main(String[] args) {
		
		try {

			if (args.length < 1) { //r or w が必要
				throw new IllegalArgumentException("r or w が必要");
			}

			if (args[0].compareToIgnoreCase("w") != 0 && 
					args[0].compareToIgnoreCase("r") != 0) {
				throw new IllegalArgumentException("オプション指定ミス");
			}
	
			if (args[0].compareToIgnoreCase("w") == 0) {
				if (args.length < 2) { //w は2つ以上必要
					throw new IllegalArgumentException("w は2つ以上");
				}
				new Sample1().writeFile(args);
			}
			else { //r は1個でOK
				System.out.println(new Sample1().readFile());
			}
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String readFile() throws Exception {

		//w しないで r が最初だと読み込むファイルが無いので当然エラー
		BufferedReader br = new BufferedReader(new FileReader(new File(Sample1.FILE_PATH)));

		try {
			StringBuffer sb = new StringBuffer();
			
			String s;
			while ((s = br.readLine()) != null) {
				sb.append(s).append("\n");
			}

			return sb.toString();
			
		}
		finally {
			br.close();
		}
		
	}

	public void writeFile(String[] args) throws Exception {
		//Sample1 w aiuoe

		BufferedWriter bw = new BufferedWriter(new FileWriter(new File(Sample1.FILE_PATH)));
		try {
			for (int i=1;i < args.length;i++) {
				bw.write(args[i]);
				bw.newLine();
			}
		}
		finally {
			bw.close();
		}
	}
}




デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-04-13 19:08
引用:

具体的に言えば、
> ファイルに書き込む
> 実行時:java Enshu1 wあいう
これが間違いです。
通常は、
> 実行時:java Enshu1 w あいう
とします。


java Enshu1 w あいう
の方が見てくれ的にも一般的かもしれませんが、
だからといって間違いということもないと思います。

ちなみにEnshu1クラスはライブラリ的に外部のクラスとして利用したい雰囲気に見えましたので、そこはわけておいてあげた方がいいんじゃないかなと思いました。

dejavu
ベテラン
会議室デビュー日: 2009/03/13
投稿数: 71
投稿日時: 2009-04-13 19:21
かなりヤバいですね。
わたなべさんのおっしゃるのはwとあいうの間にスペースを入れるという事ですよね。
自分も仮に「w」をargs[0]とした場合wあいうだと読み取るとき、全部読み取ってしまうな、と思いました。
それで悩んでたんですけど、わたなべさんの指摘して頂いた事は大変参考になりました。
「w」でいったん文字を区切るのですね。
順番が逆になってしまいましたが、デューンさん、いつもアドバイスありがとうございます。
ヒントなんて強がりを言うものじゃないですね。
この貼り付けて頂いたURLだけでは解決しませんでした。
最初に「w」を入力し、その後スペースをいれて「あいう」と入力すると「w」と文字が一致する場合、書き込まれるという事になると思いますが、私の見落としの可能性は大ですが、もう少しアドバイスを頂戴できないものでしょうか。
最後に、ぴあちゃんさんですね。
ハンドルネームは別のサイトでも拝見しました。
まぁ、別人かもしれないので別に構いませんが……。
あのサイトには今でも酷くショックを受けています。
何でか。
それはここにいる人たちを高度な知能を持つ分別を弁えた人たちだと思っていたからです。
大きく裏切られました。IT業界にはこんな低次元の人間しかいないのか、と思うと哀れでなりません。
横道にそれましたので本題に戻ります。
まず、私の日本語能力が下手糞なせいか、ぴあちゃんさんには大きな誤解をさせてしまったみたいです。
私が言いたかったのはEnshu1.javaというファイルを作成する。
その際に、ソースコードを貼り付けたファイルをインスタンス化(?)して使用するという事です。
これでご理解して頂けたでしょうか。
日本語が拙いもので、誠に申し訳ありません。
ぴあちゃんさんにも余計な労力を使わせてしまい、ここにお詫び申し上げます。
dejavu
ベテラン
会議室デビュー日: 2009/03/13
投稿数: 71
投稿日時: 2009-04-13 19:34
デューンさん、わずかな時間の違いで順番がズレてしまいました。
引用:

具体的に言えば、
> ファイルに書き込む
> 実行時:java Enshu1 wあいう
これが間違いです。
通常は、
> 実行時:java Enshu1 w あいう
とします。


引用:

java Enshu1 w あいう
の方が見てくれ的にも一般的かもしれませんが、
だからといって間違いということもないと思います。


これは擁護して頂いたと言ってよいのでしょうか。
大変有り難いお言葉に感謝する次第です。
引用:

ちなみにEnshu1クラスはライブラリ的に外部のクラスとして利用したい雰囲気に見えましたので、そこはわけておいてあげた方がいいんじゃないかなと思いました。


深い洞察力というのでしょうか。
恥ずかしながら、そのクラスを新たに利用するところま、私の頭脳では思いもつきませんでした。
デューンさんのように次の二手、三手まで見抜けるようになれるものならなりたいですね。
まぁ、これを見ている人の大半が『お前じゃ無理』と言っているようにも聞こえますが。

[ メッセージ編集済み 編集者: dejavu 編集日時 2009-04-13 21:38 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2009-04-13 21:04
結局"wあいう"みたいにwとあいうの間にスペースを入れないのか
"w あいう"みたいに入れるのかどちらが希望ですか?
入れる方法なら、ぴあちゃんさんの投稿にあるプログラムに
ちょっと手を入れるだけで動くような気がするんですけど。

# 未実行なので間違ってるかも
コード:
public class Enshu1 {
	public static void main(String[] args) {
		try {

			if (args.length < 1) { //r or w が必要
				throw new IllegalArgumentException("r or w が必要");
			}

			if (args[0].compareToIgnoreCase("w") != 0 && 
					args[0].compareToIgnoreCase("r") != 0) {
				throw new IllegalArgumentException("オプション指定ミス");
			}
	
			FileIOSample io = new FileIOSample();
			if (args[0].compareToIgnoreCase("w") == 0) {
				if (args.length < 2) { //w は2つ以上必要
					throw new IllegalArgumentException("w は2つ以上");
				}
				io.fileSave(new String[]{args[1]});
			}
			else { //r は1個でOK
				String[] lines = io.fileRead();
				for (String line : lines) {
					System.out.println(line);
				}
			}
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}

	}
}



# ここから質問内容とは関係ないです。
引用:

今度はいつ見て頂けるのでしょうか。
また書き込んで頂ける事を心からお待ちしております。


返答を期待して待つのはいいですが、それをこういう場で要求するような
意図を滲ませるのは、あまりよろしくないと思います。

引用:

まぁ、これを見ている人の大半が『お前じゃ無理』と言っているようにも聞こえますが。


別に無理とか思ってないです。
そういう皮肉は不特定多数の人が見る場では控えましょう。

引用:

この貼り付けて頂いたURLだけでは解決しませんでした。
最初に「w」を入力し、その後スペースをいれて「あいう」と入力すると「w」と文字が一致する場合、書き込まれるという事になると思いますが、私の見落としの可能性は大ですが、もう少しアドバイスを頂戴できないものでしょうか。


見てみたがわからなかった。
以上のことがわかりません。もうちょっと具体的に整理した内容で説明して頂けると
返事がしやすいです。
でないと、丸投げの俗に言う教えて君状態になってしまいます。

個人的には、"wあいう"とくっついてしまうのを最初1文字目と
それ以降の文字に分割したいというdejavuさんの質問(そういう質問だと読み取りました)には
十分すぎる内容だと思います。


引用:

ハンドルネームは別のサイトでも拝見しました。
まぁ、別人かもしれないので別に構いませんが……。
あのサイトには今でも酷くショックを受けています。
何でか。
それはここにいる人たちを高度な知能を持つ分別を弁えた人たちだと思っていたからです。
大きく裏切られました。IT業界にはこんな低次元の人間しかいないのか、と思うと哀れでなりません。


ショックを受けられるような内容だと思います。
ただ、dejavuさんも上記に指摘したように、こういう場ではあまりやらないようなことを
この数回のやり取りの中でいくつかやっています。
そういう点を控えてやり取りを行っていれば、そのうち沈静化します。

dejavuさんの文章は、感情を書きなぐってる部分と質問内容が文章の中で
混ざっていて質問内容を読み取るのが若干難しく感じます。
その点を分離して、質問で聞きたい部分だけに絞って
後の、愚痴や必要以上に謙ったり、相手を持ち上げる文章は別段落で
最低限だけ書いて頂ければ読みやすくなると思います。

スキルアップ/キャリアアップ(JOB@IT)