这算不上什么难题,记得很简单就解决了。可是今天又要用时,找不到原来的代码了,于是又重新搜索调试。索性贴在这里备忘,有人需要也可参考。
public class getfile {
static HashMap<String, String> filelist=new HashMap<String, String>();
static int k=0;
public static void find(String path)
{
try
{
File file=new File(path);
File[] files = file.listFiles();
//如果文件数组为null则返回
if (files == null)
return;
for (int i = 0; i < files.length; i++)
{
if (files[i].isDirectory())
{
k++; //以一个子目录为一个类别
//判断是不是文件夹,如果是文件夹则继续向下查找文件
find(files[i].getAbsolutePath());
}
else
{
//记录文件路径
String filePath = files[i].getAbsolutePath();
File training = new File("d:/traininglist.txt"); //建立文件对象
if(!training.exists()) //如果不存在就建立
training.createNewFile();
Writer out = new FileWriter(training,true); //flag为真代表从文件末尾追加
out.write(filePath+"\r\n"); //将文件绝对路径写入 并换行
out.write(k+"\r\n"); //写入类别标号 eg 1.2.3.....
out.close();
}
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args)
{
String path="c:/trainingset/";
find(path);
}
}
为了模式分类做训练集,所以都在"c:/trainingset/"中,不同类别在不同子目录中,所以用k自加作类别label。
刚刚在使用中又发现了个问题,在这里补充。用java写入时我试过多次,需要同时"\r\n"才能换行继续写入。这时文件写到最末尾时,光标其实在最尾行的下一行。在使用C++的
while(!addlist.eof())
{
string path;
string flag;
int label=0;
getline(addlist,path);
getline(addlist,flag);
label=atoi(flag.c_str());
}
循环读入时会发现多运行一次,读入的是空行。这时结合上一篇的说道的IplImage *进行图片处理时,因为指针指向为空,所以永远是报错退出。