プロが教える店舗&オフィスのセキュリティ対策術

javaのプログラムでファイル(テキスト)の連結を考えています。
フォルダ情報を収得しそのフォルダ内の全てのテキストファイルを連結させたいのですが。

File fl =new File("c:\\new\\files");//3つテキストがあるとして
File fls[] =fl.listFiles();


今、fls[0]、[1]、[2]には、"c:\\new\\files"このフォルダのそれぞれのファイルが入っていると思うのですが。
for文でこれらを使おうとしてもうまくいきません。どうすればいいでしょうか。

質問者からの補足コメント

  • 全ての通りを連結させたいので、今回の場合は3つのファイルが出来ると仮定します。

      補足日時:2016/10/28 16:19
  • 全ての通りは語弊がありました。すいません。
    1と2、1と3、2と3ができれば2と1、3と1、3と2は必要ない。ということでした。

      補足日時:2016/10/29 16:33

A 回答 (5件)

指定したフォルダ内のファイルに番号をつけて画面に出力し、一番目と二番目に結合させたい番号を半角数字で入力するとその順に連結されて組み合わせ順の番号名の.txtファイルとして出力されるプログラムです



ファイルを結合するたびに再度結合作業を行うか確認が行われるので継続したければyを入力すると再度結合のための番号入力画面が出力され したくなければnを入力すると終了します。


import java.io.File;
import java.io.Console;
import java.io.*;
class AL4{



static String wr="D:\\Java\\Java\\";//このフォルダ内のファイルを組み合わせ、結果もこの中に出力する

static int flg=0;



public static void main(String[] args){

File fl=new File(wr);
File fls[]=fl.listFiles();

int a=fls.length;


while(flg==0){


String wr2=wr;


for(int b=0;b<a;b++){

String c=fls[b].toString();

System.out.println(b+1+"番目のファイル名"+c);

}

Console console = System.console();

int input2=0;
int input3=0;
int flag=0;
while(flag==0){

String input = console.readLine("連結したいファイル名の番号:");



try{
input2=Integer.parseInt(input);
flag=1;
}catch(Exception e){}

}
flag=0;


while(flag==0){

String input = console.readLine("連結したいファイル名の番号 二番目:");



try{
input3=Integer.parseInt(input);
flag=1;
}catch(Exception e){}

}


wr2=wr+"連結"+input2+"-"+input3+".txt";

File files=new File(wr2);
files.delete();


try(BufferedReader br= new BufferedReader(new FileReader(fls[input2-1]));
BufferedWriter bw=new BufferedWriter(new FileWriter(wr2,true));){

String data=null;
while((data=br.readLine())!=null){
bw.write(data);
bw.newLine();
}

}catch(Exception e){}





try(BufferedReader br= new BufferedReader(new FileReader(fls[input3-1]));
BufferedWriter bw=new BufferedWriter(new FileWriter(wr2,true));){

String data=null;
while((data=br.readLine())!=null){
bw.write(data);
bw.newLine();
}

}catch(Exception e){}


String flg3 = console.readLine("結合ファイル出力を続けますか?(y/n):");

if(flg3.equals("n")){
flg=1;}else if(flg3.equals("y")){
}else{
flg=1;
}


}


}


}
    • good
    • 0
この回答へのお礼

ありがとうございます。

wrに"C:\\new\\files\\"ここの情報を入れてflgは0を宣言しておく。
flにwrの情報を入れfls、その長さ分をaに入れておく。

bがaより上になるまで繰り返し、fls[0]から順番に表示させる。
数字を入力させ、input2,3にそれぞれ入れwr2に
"C:\\new\\files\\"このフォルダに書き込んでいく。

yが入力されたら最初のwhile文から繰り返す。

大雑把ですがやっていることはこんな感じなのでしょうか?

お礼日時:2016/10/30 20:51

No.4です


>wrに"C:\\new\\files\\"~ ?

大体その通りです
flにwrの情報を入れfls、という部分が
flにはwrの情報が、flsにはそれ以下のファイルの情報が、という意味だとしたらその通りです
    • good
    • 0

全ての通りというのは組み合わせの順番の事でしょうか


「フォルダ内にあるファイル全ての全通りの順番の組み合わせ」結果が一つずつ別の.txtファイルに収納されて出力されるプログラムです
3つのファイルが格納されている場合 出力ファイルは6つになります
5つだと120個になります それ以上の数だとファイル数が増えすぎるので試すと結果が出るまでに時間がかかります
出力ファイルの最後にはファイルをどの順番で結合したかの情報が加えられます

import java.io.File;
import java.io.*;
import java.nio.file.*;



class AL3{

static String[] ssubadd={""};

static String wrf="C:\\new\\files\\record\\";//このフォルダ内に全ての組み合わせの結果が毎回入る このフォルダの中にさらにフォルダを入れると誤作動(毎回このフォルダ及び中の全てのファイルが消され新しい結果が入る)
static String sta="C:\\new\\files\\";//このフォルダ内のファイルを結合する ファイルは何個でも可 上のパスのフォルダ以外を入れると誤作動


public static void main(String[] args){

Path path=Paths.get(wrf);

try{
Files.walk(path).filter(s -> s.toString().endsWith("")).forEach(q -> SL(q));
}catch(IOException e){e.printStackTrace();}


try {
Files.delete(path);
} catch (IOException e) {e.printStackTrace();}





File fl=new File(sta);

File fls[]=fl.listFiles();

int g=fls.length;




File fls2[]=new File[g];

String fls3[]=new String[g];

for(int k=0;k<g;k++){

fls3[k]=fls[k].toString();


}






add2(fls3,ssubadd);


}




static int a2=0;



static String wname="";



public static void SL(Path a){

String a2=a.toString();
File a3=new File(a2);

a3.delete();
}


public static void add2(String[] q,String[] a){


File fi1 = new File(wrf);
fi1.mkdirs();

if(q.length <= 1) {
a2++;
System.out.println("組み合わせ"+a2+"種類目");
int c=0;
for(String asub: a){

c++;
if(c!=0 || c!=1){

adds(asub,wrf+a2+".txt");
wname=wname+asub;
System.out.println(asub);
}

}
for(String r:q){
wname=wname+r;
System.out.println(r);
adds(r,wrf+a2+".txt");
}

System.out.println();
System.out.println();

adds2(wrf+a2+".txt",wname);
wname="";
}

else {
for (int i = 0; i < q.length; i++) {

int l=q.length;

String[] s2=new String[l-1];

for(int s4=0;s4<=i-1;s4++){
s2[s4]=q[s4];

}
for(int s4=i;s4<l-1;s4++){
s2[s4]=q[s4+1];

}

String[] aa=new String[a.length+1];
for(int t=0;t<a.length;t++){
aa[t]=a[t];
}
aa[a.length]=q[i];
add2(s2,aa);

}
}
}



static void adds(String file,String file2){
try(
BufferedReader br=new BufferedReader(new FileReader(file));
BufferedWriter bw=new BufferedWriter(new FileWriter(file2,true));
){
String data=null;
while((data=br.readLine())!=null){
bw.write(data);
bw.newLine();
}
}catch(Exception e){}
}




static void adds2(String file2,String sen1){
try(
BufferedWriter bw=new BufferedWriter(new FileWriter(file2,true));
){
bw.newLine();
bw.newLine();
bw.write(sen1);
bw.newLine();
}catch(Exception e){}

}


}
    • good
    • 0

どう「うまくいかない」のか、具体的に書いてください。


エラーが出るなら、そのメッセージをちゃんと書いてください。
for文をどう使おうとしたのかを書いてください。



http://docs.oracle.com/javase/jp/7/api/java/io/F …

> この抽象パス名がディレクトリを示さない場合、このメソッドは null を返します。

に該当してfls[] = null になっているのと

> 結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。

に該当して、期待通りの順番になっていない、というのと

それ以外のなにか(例えば、for文自体をまったく理解できていない)なのと
では、まったく対処方法が違います。
    • good
    • 0

//拡張for文を使います



import java.io.File;
import java.io.*;
import java.nio.file.*;
class AL{

public static void main(String[] args){

File fl=new File("C:\\new\\files\\");

File fls[]=fl.listFiles();

for(File file :fls){//拡張for文

try(
BufferedReader br=new BufferedReader(new FileReader(file));

BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\new\\files\\AL.txt",true));//,trueを入れると上書きではなく書き足しになる

){

String data=null;

while((data=br.readLine())!=null){

bw.write(data);
bw.newLine();

}


}catch(Exception e){}


}

}

}

/*これでD:\\new\\files\\AL.txtに連結された内容が入ると思います*/
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!