Javaテキストファイルコピープログラムの改良方法
- テキストファイルコピープログラムを使って…と同じプログラムを別の形で作ってみようと思いました。
- 考えている方法としては、元のプログラムで一文字書く毎に文字数をカウントし、10で割り切れたら改行を入れるという条件を追加したいです。
- 正しいプログラムの書き方やif文の記入場所について教えてください。
- ベストアンサー
テキストファイルコピープログラムを使って…
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1198241 と同じプログラムを別の形で作ってみようと思いました。 import java.io.*; public class CopyText{ public static void main(String[] args) throws IOException { FileReader in = new FileReader("inputtext.txt"); FileWriter out = new FileWriter("outputtext.txt"); int ccode; while ((ccode = in.red()) ! = -1){ out.write(ccode); } in.close(); out.close(); } } というプログラムに手を加えて「外部から読み込んだテキストファイルを10字ごとに改行を入れて別のファイルに書き出すプログラム」を作りたいです。 考えている方法としては、上記のプログラムで一文字書く毎に「count++」等で文字数をカウントし、if文でcountが10で割り切れたら改行、という形にしてみようと思っています。 まず、上のプログラムは正しいのでしょうか? また、「int count; count=count+1」は、 int ccode; int count; while ((ccode = in.red()) ! = -1){ out.write(ccode); count=count+1; で正しいですか? 最後に、if文はどこに記入すれば良いかがわかりません。 回答よろしくお願いします。
- angelicus
- お礼率63% (7/11)
- Java
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >if文でcountが10で割り切れたら改行、 >という形にしてみようと思っています。 惜しい!惜しいです。 でも、ずいぶん、いいところまで来ました。 あと、ちょっとです。 countはなにも10で割り切れるか判定する必要はありません。 countが10になったら、改行し、countを0に戻してあげればいいのです。 if文もそのまま続きに書けば、大丈夫です。 後、ヒントとして、改行はBufferedWriterのnewLine()メソッドを使うのがそれぞれのプラットフォームに適した改行コードを入れてくれるので、お得です。
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
あっ、ごめんなさい。勘違いしてました。 今回は、BufferedReaderとBufferedWriterを使ってないのですね。 混乱させたせいか、前回のコードと今回のコードが混じった変なことになってしまいましたね。 でも、まあ、言いたいことは、わかります。 BufferedWriterを使ってないのでnewLine()メソッドが使えません。よって out.write('\n'); で、いいと思いますが、Writerのwriteメソッドの引数にchar型一文字の物がないので、コンパイラに怒られると思います。 工夫してください。 ただ、OSがWindowsとかだと、\nだけだと改行として反映されません。 できたファイルをメモ帳で、開いてみても、改行されてないので、それが我慢ならない場合は、BufferedWriterを使い、newLine()メソッドで改行することを考えてください。 それと、読み込むデータが小さいときは、FileReaderとFileWriterをそのまま使っても、良いかも知れませんが、ちょっと、大きいデータの時は、BufferedReaderとBufferedWriterをかました方が、断然パフォーマンスがいいので、そちらがおすすめです。 タイプミスや文法間違いも多いですが、それは、コンパイラが指摘してくれます。 考え方はあっているので、あとは、学校に行って、コンパイルエラーと戦ってください。
補足
ありがとうございました。 重ね重ね申し訳ないのですが、改行についてもう一つ、fw.write("\n");というのは使えるのでしょうか。
関連するQ&A
- プログラムの添削をお願いします。
読み込んだテキストファイルを十文字ごとに改行して、別のファイルにコピーするプログラムです。 import java.io.*; public class CopyText{ public static void main(String[] args) throws IOException { FileReader in = new FileReader("inputtext.txt"); FileWriter out = new FileWriter("outputtext.txt"); int ccode, count; while ((ccode = in.read()) ! = -1){ out.write(ccode); count=count+1; if (count=10){fw.write('\n');, count=0}; } in.close(); out.close(); } } 7行目のところで、「')'がありません」「互換性のない型」というエラーが出るのですが、どう直したらいいのかがわからないのでご指導お願いします。
- ベストアンサー
- Java
- BMP画像の画像データ本体をテキストデータとして保存したい
BMP画像を読み込んで、ヘッダ箇所などの本体と関係ない部分を読み飛ばして、画像本体をテキストファイルとして保存するプログラムを作ったのですが、実際の画像の大きさ(512x480)と出力結果(質問箇所最下に記載)の画像の大きさが異なってしまいます。あまり画像に詳しくないので、どこが間違っているのか分かりません。どこを修正すべきか教えてください。以下が作成したプログラムです。 public class bmpTotxt { public static void main(String[] args){ try { FileReader fr = new FileReader("./1.bmp"); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter("./pic.txt"); int i,count=0,len=0,width=512*4,height=0; while((i = br.read()) != -1){ /* 画像本体箇所なら */ if(len >= 54){ fw.write(i+" "); len++; count++; if(count == width){ fw.write("\n"); height++; count = 0; } } else{ len++; } } System.out.println("ヘッダ長:"+54); System.out.println("画像データ長:"+(len-54)); System.out.println("width:"+width/4); System.out.println("height:"+height); fr.close(); fw.close(); } catch (Exception e) { e.printStackTrace(); } } } /* 出力結果 ヘッダ長:54 画像データ長:648480 width:512 height:316 */
- ベストアンサー
- Java
- javaプログラム初心者です。
入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }
- 締切済み
- Java
- CSVファイルを二次元配列に格納するプログラム
前回のソースコードを改変してみました String Str = ""; int Count = 0; try { File inFile = new File("./res/test.csv"); FileReader fr = new FileReader(inFile); BufferedReader br = new BufferedReader(fr); while (br.ready()) { Str = br.readLine(); String[] temp = Str.split(","); int[] m = new int[temp.length]; for (int i = 0; i < temp.length; i++) { m[i] = Integer.parseInt(temp[i]); System.out.print(m[i] + ","); } System.out.println(); Count++; } br.close(); fr.close(); } catch (Exception e) { System.out.println("ファイル読み込みに関するエラー"); } 今一次元配列になっているのですが、これを二次元配列に代入したいのです Countで何回ループしたかによって二次元配列の縦の要素数としたかったのですが、 そうすると横の要素数になるループ中の一次元配列が使えないので困っています
- 締切済み
- Java
- java ファイル操作
現在javaでファイル操作しファイルの文字列を検索したりファイルに文字列を追加したりする ものを作成しています。 現状のコードはこのような感じです。 class addresskensaku{ public static void main(String[] args)throws IOException{ System.out.println("数字を選択\n1.名前で検索\n2.年齢で検索\n3.出身地で検索\n4.追加"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); char res = str.charAt(0); //1が選択された場合 if(res == '1' || res == '1'){ System.out.println("名前を入力してください。"); BufferedReader fn = new BufferedReader(new InputStreamReader(System.in)); String str1 = fn.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 System.out.println("検索結果 :"); while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[0].indexOf(str1) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //2が入力された場合 if(res == '2' || res == '2'){ System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String ol = o.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp =null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //完全一致 if (ol.equals(words[1])){ // System.out.println("検索結果:"); System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //3が入力された場合 if(res == '3' || res == '3'){ System.out.println("出身地を入力してください。"); BufferedReader p = new BufferedReader(new InputStreamReader(System.in)); String pref = p.readLine(); try{ FileReader freader = new FileReader("addressdata.txt"); BufferedReader breader = new BufferedReader(freader); String tmp = null; //検索 while((tmp=breader.readLine())!=null){ String[] words = tmp.split(","); //部分一致 if(words[2].indexOf(pref) != -1){ System.out.println(tmp); } } breader.close(); }catch(IOException e){ System.out.println("e"); } } //4が入力された場合 追加 if(res == '4' || res == '4'){ //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader n = new BufferedReader(new InputStreamReader(System.in)); String str2 = n.readLine(); //年齢入力 System.out.println("年齢を入力してください。"); BufferedReader o = new BufferedReader(new InputStreamReader(System.in)); String str3 = o.readLine(); //住所入力 System.out.println("住所を入力してください。"); BufferedReader a = new BufferedReader(new InputStreamReader(System.in)); String str4 = a.readLine(); //ファイルに書き込み try{ File file = new File("addressdata.txt"); FileWriter filewriter = new FileWriter(file, true); filewriter.write(str2+","+str3+","+str4+"\r\n"); filewriter.close(); }catch(IOException e){ System.out.println("e"); } } } } これをカプセル化し 各機能ごとにメソッドを分けて作ろうかなと思っています。 結果の出力はmainでやる予定です。
- 締切済み
- Java
- java utf-8 で ファイル出力
【やりたい事】 ファイルを読み込んで、改行コードCRLFをLFに変換して、空白行は削除して、「正常終了しました。」は削除。 文字コードUTF8で出力したい。 【問題】 UTF-8で指定してるのに、Shift_JISで出力される。 【入力ファイル】 ファイル名:test.tsv 文字コード:UTF-8 改行コード:CRLF ************************ test test1 1 2 1 3 正常終了しました。 ************************ 【現在のソース】 import java.io.*; public class writeFile { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { //(1)FileReaderオブジェクトinFileを生成 FileReader inFile = new FileReader("test.tsv"); //(2)FileWriterオブジェクトoutFileを生成 FileWriter outFile = new FileWriter("test_lf.tsv"); //(3)BufferedReaderオブジェクトinBufferを生成 BufferedReader inBuffer = new BufferedReader(inFile); //(4)BufferedWriterオブジェクトoutBufferを生成 BufferedWriter outBuffer = new BufferedWriter(outFile); String line; int cnt=0; //(5)読み込みデータがなくなるまで、読み込み while ((line = inBuffer.readLine()) != null) { //(6)データの書き込み処理 if (line.equals("")){ cnt=cnt+1; }else{ if(cnt<=1){ outBuffer.write(line+"\n"); } } } outBuffer.flush(); //(7)バッファをフラッシュ inBuffer.close(); //(8)読み込みストリームのクローズ outBuffer.close(); //(9)書き込みストリームのクローズ } catch (IOException e) { } try { //(1) //(2)FileInputStreamオブジェクトの生成 FileInputStream abc = new FileInputStream("test_lf.tsv"); //(3)FileOutputStreamオブジェクトの生成 FileOutputStream xyz = new FileOutputStream("test_lf_utf.tsv"); //(4)InputStreamReaderオブジェクトの生成 InputStreamReader in = new InputStreamReader(abc, "Shift_JIS"); //(5)OutputStreamWriterオブジェクトの生成 OutputStreamWriter out = new OutputStreamWriter(xyz, "UTF-8"); int contents; //(6) //(7)読み込むデータがなくなるまで読み込み while ((contents = in.read()) != -1) { //(8)書き込むデータがなくなるまで書き込み out.write(contents); } in.close(); //(9)読み込みストリームを閉じる out.close(); //(10)書き込みストリームを閉じる } catch(IOException e) { } } } 【出力結果】 ファイル名:test_lf.tsv 文字コード:Shift_JIS 改行コード:LF ************************ test test1 1 2 1 3 ************************ ファイル名:test_lf_utf.tsv 文字コード:Shift_JIS 改行コード:LF ************************ test test1 1 2 1 3 ************************ 本当に困っています。 もう二日、はまってます。 ご教授願います。
- ベストアンサー
- Java
- java プログラム
javaで下記のプログラムをコンパイルすると複数のシンボルが存在しませんとういう文が出てきます。 どのようにどこを書きなおせばコンパイル出来るのしょうか? public class Email { public static void main(String[] argv) throws Exception { String input = "fileContainingEmails.txt"; String output = "copyPasteMyEmails.txt"; BufferedReader cin; cin = new BufferedReader(new InputStreamReader(System.in)); String userInput; System.out.println("Enter input file name [default name: fileContainingEmails.txt]"); userInput = cin.readLine(); if (userInput.equals("")) userInput = input; String name; if (userInput.equals(input)) name = output; else name = userInput; String userOutput; System.out.println("Enter output file name [default name: " + name + " ]"); userOutput = cin.readLine(); if (userOutput.equals("")) userOutput = name; System.out.println("Input : " + userInput); System.out.println("Output: " + userOutput); BufferedReader fin; fin = new BufferedReader(new FileReader(userInput)); PrintWriter fout; fout = new PrintWriter(new FileWriter(userOutput, true)); String lineFromFile = ""; List listOfMail = new ArrayList(); int indexOfAt = 0; int s,e = 0; while (fin.ready()) { lineFromFile = fin.readLine(); indexOfAt = lineFromFile.indexOf('@',indexOfAt); while(indexOfAt > 0) { for(int i = 0;lineFromFile.charAt(indexOfAt-i) != ' ';i++) s = indexOfAt - i; for(int i = 0;lineFromFile.charAt(indexOfAt+i) != ' ';i++) e = indexOfAt + i; if(listOfMail.indexOf(lineFromFile.substring(s,e).toLowerCase) < 0); { listOfMail.Add(lineFromFile.substring(s,e).toLowerCase); fout.println(lineFromFile.substring(s,e).toLowerCase); System.out.println(lineFromFile.substring(s,e).toLowerCase); } indexOfAt = lineFromFile.indexOf('@',indexOfAt + 1); } } fin.close(); fout.close(); int count = 0; count = listOfMail.size(); if (count == 0) System.out.println("Sorry, no email addresses were found in the file " + userInput); else System.out.println(count + "email addresses "); 補足 またこのままだと読み込んだアドレス全て小文字になってしまうのですがそうではなく読み込んだメールアドレスAAA@BBBとaaa@bbbは同じメールアドレスとして扱い片方だけをコンソールに載せるというかたちにするにはどうすればよいのでしょうか?
- 締切済み
- Java
- ファイル読み込み/書き込み速度を上げるには
下記のようなファイルの読み込み/書き込み処理において、もっと効率よく(速く)読み込み・書き込みをしたい場合どのような工夫をすれば良いでしょうか? BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("sample2.data")); BufferedInputStream in = new BufferedInputStream(new FileInputStream("sample1.data")); int c ; while((c = in.read()) != -1) { out.write(c); } in.close(); out.flush(); out.close();
- ベストアンサー
- Java
- ファイル操作 ファイルにTABを入れる
ファイルの入出力をやっています。一文字を読み込んだ後にOUTPUTファイルにカンマの代わりにTABキーを入れ込みたいのですが、それがどうしてもうまくいきません・・・ public class FileRead { // ファイル名 private static final String INFILE_NAME = "input01.csv"; private static final String OUTFILE_NAME = "output01.tsv"; public static void main(String[] args) { // FileReaderクラス宣言 BufferedReader fr = null; FileWriter fos = null; try { // FileReaderクラス生成 fr = new BufferedReader(new FileReader(INFILE_NAME)); fos = new FileWriter(OUTFILE_NAME); // 読み込み int i; while ((i = fr.read()) != -1) { //System.out.print((char)i); //char chra=(char)i; fos.write(i); } System.out.println("--- 読み込み完了 ---"); } catch (IOException e) { System.out.println("Exception : " + e); } finally { try { // FileReaderクラスを閉じる 続く・・・ 教えてください!!
- 締切済み
- Java
- JAVA テキストからの読み込みについて
以下はsample121.txtというファイルからデータを読み込むプログラムとして とある本に紹介されていた方法を参考にしたものですが while文の中に1文字目を表示したら、2文字めに移行する指示がなされていないように思い 実際に書いて、実行してみましたところ やはり1文字目だけが延々と羅列される結果となりました。 一文字ずつ順番に読み込むとすれば どこを修正すればいいでしょうか。 よろしくお願いします。 import java.io.FileReader; public class traning7 { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { FileReader fw = new FileReader("sample121.txt"); int i = fw.read(); while(i != -1){ char c = (char) i ; System.out.println(c); } System.out.println("ファイルの末尾に到達しました。"); fw.close(); }catch(Exception e){ System.out.println("error"); } } }
- ベストアンサー
- Java
補足
思いつきませんでした! では、全体では import java.io.*; public class CopyText{ public static void main(String[] args) throws IOException { FileReader in = new FileReader("inputtext.txt"); FileWriter out = new FileWriter("outputtext.txt"); int ccode; int count; while ((ccode = in.red()) ! = -1){ out.write(ccode); count=count+1; if (count=10){bw.newLine();, count=0}; } in.close(); out.close(); bw.close(); } } でしょうか? 最後のbw.close()は必要…ですか? また、改行方法としてif (count=10){out.write('\n');, count=0};でも平気ですか? (実は自宅PCは環境が整っておらず、学校に行くまでエラー確認等ができないので、変なところでミスがあるかもしれませんが…)