关于 java 文件查找的问题! 我想写一个程序,用户输入一个文件名。让这个java 程序把在MY COMPUTER里所有的和这个文件名匹配的文件都放到一个txt文件里。文件的每一行都是一个完整的路径!我现在是这用 exec("dir /s" + 文件名)。 格式dir得到的格式,和我需要的差距太大了。 请大家指点一下! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 File.getAbsolutPath获取文件的绝对路径...厄..我应该没拼错吧..呵呵 这个需求不是这么简单就可以搞定的.首先需要遍历所有盘符下的所有文件,而且你的匹配是什么匹配? 只是相等或是*.等通配符? 找到文件件后保存文件的.getPath()方法就可保存完整路径.你实现的应该是一个文件查找的程序. 不是很简单. import java.io.*;import java.util.*;public class Find{ static Vector<String> files = new Vector<String>(); private static boolean compareFileName(String name1,String name2) { if (name1.equalsIgnoreCase(name2)) { return true; } return false; } private static void findFile(File root,String fileName) { File[] childFiles = root.listFiles(); if (childFiles == null) { return; } for (int j = 0; j < childFiles.length; j++) { if (!childFiles[j].canRead()) { continue; } if (childFiles[j].isFile()) { if (compareFileName(childFiles[j].getName(),fileName)) { files.add(childFiles[j].getPath()); } } else { findFile(childFiles[j],fileName); } } } public static void findFile(String fileName) throws Exception { File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) { findFile(roots[i],fileName); } writeFile(); } private static void writeFile() throws Exception { FileWriter writer = new FileWriter("result.txt"); for (String name : files) { writer.write(name + "\n"); } writer.close(); } public static void main(String[] args) throws Exception { findFile(args[0]); } } 再把compareFileName方法改进下,就可实现各种匹配 闲的没事,再来个完整点的.public class CompareUtil{ public static boolean compareFileName(String name1,String name2) { // file.txt *i*.* if (name1.equalsIgnoreCase(name2)) { return true; } return false; }}import java.util.Vector;import java.io.File;public class Finder extends Thread{ Vector<String> result = new Vector<String>(); boolean running = true; File file; String fileName; public Finder(File f,String name) { file = f; fileName = name; System.out.println("Thread : " + getName() + " is Finding " + f.getPath()); } public void handleFile(File file,String fileName) { if (CompareUtil.compareFileName(file.getName(),fileName)) { result.add(file.getPath()); } } private void findFile(File file,String fileName) { if (!file.canRead()) { return; } if (file.isFile()) { handleFile(file,fileName); return; } //System.out.println("Folder : " + file.getPath() + " ... "); File[] childFiles = file.listFiles(); if (childFiles == null) { return; } for (int j = 0; j < childFiles.length; j++) { findFile(childFiles[j],fileName); } } public boolean isRunning() { return running; } public Vector<String> getResult() { return result; } public void run() { findFile(file,fileName); running = false; System.out.println("Thread : " + getName() + " Over. "); }}import java.io.*;import java.util.*;public class Find{ static String resultFileName = "result.txt"; static Vector<String> files = new Vector<String>(); static Vector<Finder> finders = new Vector<Finder>(); public static void handleFile(File file,String fileName) { if (CompareUtil.compareFileName(file.getName(),fileName)) { files.add(file.getPath()); } } public static void findFile(String path,String fileName) throws Exception { if (path == null) { File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) { File[] rootFiles = roots[i].listFiles(); if (rootFiles == null) { continue; } for (int j = 0; j < rootFiles.length; j++) { if (rootFiles[j].isFile()) { handleFile(rootFiles[j],fileName); } else { File[] childFiles = rootFiles[j].listFiles(); if (childFiles != null) { for (int x = 0; x < childFiles.length; x++) { if (childFiles[x].isFile()) { handleFile(childFiles[x],fileName); } else { Finder finder = new Finder(childFiles[x],fileName); finders.add(finder); finder.start(); } } } } } } } else { File folder = new File(path); if (folder.isFile()) { handleFile(folder,fileName); } else { File [] allFiles = folder.listFiles(); for (int i = 0; i < allFiles.length; i++) { Finder finder = new Finder(allFiles[i],fileName); finders.add(finder); finder.start(); } } } while (true) { boolean allOver = true; for (Finder finder : finders) { if (finder.isRunning()) { allOver = false; break; } } if (allOver) { for (Finder finder : finders) { files.addAll(finder.getResult()); } break; } else { Thread.sleep(100); } } System.out.println("\n"); if (files.size() > 0) { System.out.println("Find File : "); FileWriter writer = new FileWriter(resultFileName); for (String name : files) { System.out.println(name); writer.write(name + "\n"); } writer.close(); } else { System.out.println("File with name [" + fileName + "] Not Found. "); } } public static void main(String[] args) throws Exception { String path = null; String name = null; if (args.length > 1) { path = args[0]; name = args[1]; } else if (args.length == 1) { name = args[0]; } else if (args.length == 0) { System.out.println("usage : java Find [path] filename"); return; } findFile(path,name); } } 查下API,File 可以取出文件的完整路径的。然后用递归,遍历MY COMPUTER 这是要匹配整个系统的文件是个遍历文件夹的问题用递归方法if是文件夹,递归else是文件,进行比较 pauliuyou, 倒是更欣赏你第一个代码,简单明了,风格不错,第二个方法太长,应该重构:) 我是一个JAVA初学者,以后多来向你们学习 我是一个JAVA初学者,以后多来向你们学习 代码认真研究中,因为的多线程,需要时间去消化。我还天真的以为 java运行 dir /s 文件名,得到文件目录文件,然后处理那个文件目录哪!谢谢 这哪是个简单的查找文件问题呀。简直就是java高级考试题了。 多线程, recursion 都用上了。研究了好一阵子才知道大概是怎么用的了! 觉得写这个程序的人一定是一等一的高人!十分感谢。要是我这么也写不出来这样好的程序来! 有两个地方还是没理解,请大家指教:哪个 continue;结束以后,程序接着从那里开始?还有就是 for (String name : files) { System.out.println(name); writer.write(name + "\n"); }(String name : files) 这个条件是什么意思?? 也发一个简单点的public class MyComp { public static void findFileFromDir(File dir, String fileName, OutputStream txt) { if (!dir.isDirectory()) { return; } File[] files = dir.listFiles(); if (files == null || files.length == 0) { return; } for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { findFileFromDir(files[i], fileName, txt); } else if (files[i].isFile()) { String path = files[i].getAbsolutePath(); if (path.endsWith(fileName)) { try { txt.write(path.getBytes()); txt.flush(); } catch (IOException e) { e.printStackTrace(); } } } } } public static void main(String[] args) throws IOException { String fileName = "\\" + args[0]; OutputStream out = new BufferedOutputStream(new FileOutputStream( args[1])); File[] dev = File.listRoots(); for (int i = 0; i < dev.length; i++) { findFileFromDir(dev[i], fileName, out); } }} 上面例子中应该加写地址的时候应该……txt.write((path+"\n").getBytes());…… jdk1.5的新特性表示 便利files中的每一个原素...每个元素的名字都为name 而String 是每个元素的类型 import java.io.File;public class MainFile{ public static void main(String args[]) { String fname="read.txt";//要查找的文件名 File[] file=File.listRoots(); System.out.println("begin..."); for(File f:file) { System.out.println("Search "+f.getAbsolutePath()); search(f,fname); } System.out.println("end..."); } public static void search(File f,String fname) { if(f.isFile()) { if(fileNameEquals(f.getName(),fname)) { System.out.println(f.getAbsolutePath()); } return; } if(f.isDirectory()) { File [] dfile=f.listFiles(); for(File df:dfile) { if(df.isFile()) search(df,fname); } for(File df:dfile) { if(df.isDirectory()) search(df,fname); } } } public static boolean fileNameEquals(String fname,String sname) { if(fname.equals(sname)) return true; return false; }} 修改下...f.lisetFiles()之后..忘记判断下返回是否为null了... 很多请求只打开一个数据库连接行吗? 问一个java访问修饰符的问题 如何将应用程序application和小程序applet放到一个JAVA程序中去? java存储视频文件 java.awt.*和java.awt.event.*这种类型的包又没有包含关系? 有没有将类转化为类图的工具? 如何实现简繁转换,即知道一个简体字,怎样得到它相应的繁体字? 怎么改JCreator默认字体为“新宋体”??? 关于java应用程序如何应用在各种无java编译器的平台上的问题? 运算符<<的问题 java 中 开发一个音乐播放器 怎么实现歌词显示同步 ProgressMonitor进度条的问题
首先需要遍历所有盘符下的所有文件,而且你的匹配是什么匹配? 只是相等或是*.等通配符?
找到文件件后保存文件的.getPath()方法就可保存完整路径.你实现的应该是一个文件查找的程序. 不是很简单.
import java.io.*;
import java.util.*;
public class Find
{
static Vector<String> files = new Vector<String>();
private static boolean compareFileName(String name1,String name2)
{
if (name1.equalsIgnoreCase(name2))
{
return true;
}
return false;
}
private static void findFile(File root,String fileName)
{
File[] childFiles = root.listFiles();
if (childFiles == null)
{
return;
}
for (int j = 0; j < childFiles.length; j++)
{
if (!childFiles[j].canRead())
{
continue;
}
if (childFiles[j].isFile())
{
if (compareFileName(childFiles[j].getName(),fileName))
{
files.add(childFiles[j].getPath());
}
}
else
{
findFile(childFiles[j],fileName);
}
}
}
public static void findFile(String fileName) throws Exception
{
File[] roots = File.listRoots();
for (int i = 0; i < roots.length; i++)
{
findFile(roots[i],fileName);
}
writeFile();
}
private static void writeFile() throws Exception
{
FileWriter writer = new FileWriter("result.txt");
for (String name : files)
{
writer.write(name + "\n");
}
writer.close();
}
public static void main(String[] args) throws Exception
{
findFile(args[0]);
}
}
{
public static boolean compareFileName(String name1,String name2)
{
// file.txt *i*.*
if (name1.equalsIgnoreCase(name2))
{
return true;
}
return false;
}
}import java.util.Vector;
import java.io.File;public class Finder extends Thread
{
Vector<String> result = new Vector<String>();
boolean running = true;
File file;
String fileName;
public Finder(File f,String name)
{
file = f;
fileName = name;
System.out.println("Thread : " + getName() + " is Finding " + f.getPath());
}
public void handleFile(File file,String fileName)
{
if (CompareUtil.compareFileName(file.getName(),fileName))
{
result.add(file.getPath());
}
}
private void findFile(File file,String fileName)
{
if (!file.canRead())
{
return;
}
if (file.isFile())
{
handleFile(file,fileName);
return;
}
//System.out.println("Folder : " + file.getPath() + " ... ");
File[] childFiles = file.listFiles();
if (childFiles == null)
{
return;
}
for (int j = 0; j < childFiles.length; j++)
{
findFile(childFiles[j],fileName);
}
}
public boolean isRunning()
{
return running;
}
public Vector<String> getResult()
{
return result;
}
public void run()
{
findFile(file,fileName);
running = false;
System.out.println("Thread : " + getName() + " Over. ");
}
}
import java.io.*;
import java.util.*;
public class Find
{
static String resultFileName = "result.txt";
static Vector<String> files = new Vector<String>();
static Vector<Finder> finders = new Vector<Finder>();
public static void handleFile(File file,String fileName)
{
if (CompareUtil.compareFileName(file.getName(),fileName))
{
files.add(file.getPath());
}
}
public static void findFile(String path,String fileName) throws Exception
{
if (path == null)
{
File[] roots = File.listRoots();
for (int i = 0; i < roots.length; i++)
{
File[] rootFiles = roots[i].listFiles();
if (rootFiles == null)
{
continue;
}
for (int j = 0; j < rootFiles.length; j++)
{
if (rootFiles[j].isFile())
{
handleFile(rootFiles[j],fileName);
}
else
{
File[] childFiles = rootFiles[j].listFiles();
if (childFiles != null)
{
for (int x = 0; x < childFiles.length; x++)
{
if (childFiles[x].isFile())
{
handleFile(childFiles[x],fileName);
}
else
{
Finder finder = new Finder(childFiles[x],fileName);
finders.add(finder);
finder.start();
}
}
}
}
}
}
}
else
{
File folder = new File(path);
if (folder.isFile())
{
handleFile(folder,fileName);
}
else
{
File [] allFiles = folder.listFiles();
for (int i = 0; i < allFiles.length; i++)
{
Finder finder = new Finder(allFiles[i],fileName);
finders.add(finder);
finder.start();
}
}
}
while (true)
{
boolean allOver = true;
for (Finder finder : finders)
{
if (finder.isRunning())
{
allOver = false;
break;
}
}
if (allOver)
{
for (Finder finder : finders)
{
files.addAll(finder.getResult());
}
break;
}
else
{
Thread.sleep(100);
}
}
System.out.println("\n");
if (files.size() > 0)
{
System.out.println("Find File : ");
FileWriter writer = new FileWriter(resultFileName);
for (String name : files)
{
System.out.println(name);
writer.write(name + "\n");
}
writer.close();
}
else
{
System.out.println("File with name [" + fileName + "] Not Found. ");
}
}
public static void main(String[] args) throws Exception
{
String path = null;
String name = null;
if (args.length > 1)
{
path = args[0];
name = args[1];
}
else if (args.length == 1)
{
name = args[0];
}
else if (args.length == 0)
{
System.out.println("usage : java Find [path] filename");
return;
}
findFile(path,name);
}
}
查下API,File 可以取出文件的完整路径的。然后用递归,遍历MY COMPUTER
是个遍历文件夹的问题
用递归方法
if是文件夹,递归
else是文件,进行比较
还有就是
for (String name : files)
{
System.out.println(name);
writer.write(name + "\n");
}
(String name : files) 这个条件是什么意思??
public class MyComp { public static void findFileFromDir(File dir, String fileName,
OutputStream txt) {
if (!dir.isDirectory()) {
return;
}
File[] files = dir.listFiles();
if (files == null || files.length == 0) {
return;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
findFileFromDir(files[i], fileName, txt);
} else if (files[i].isFile()) {
String path = files[i].getAbsolutePath();
if (path.endsWith(fileName)) {
try {
txt.write(path.getBytes());
txt.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} } public static void main(String[] args) throws IOException {
String fileName = "\\" + args[0];
OutputStream out = new BufferedOutputStream(new FileOutputStream(
args[1])); File[] dev = File.listRoots();
for (int i = 0; i < dev.length; i++) {
findFileFromDir(dev[i], fileName, out);
}
}}
……
txt.write((path+"\n").getBytes());
……
import java.io.File;public class MainFile
{
public static void main(String args[])
{
String fname="read.txt";//要查找的文件名
File[] file=File.listRoots();
System.out.println("begin...");
for(File f:file)
{
System.out.println("Search "+f.getAbsolutePath());
search(f,fname);
}
System.out.println("end...");
}
public static void search(File f,String fname)
{
if(f.isFile())
{
if(fileNameEquals(f.getName(),fname))
{
System.out.println(f.getAbsolutePath());
}
return;
}
if(f.isDirectory())
{
File [] dfile=f.listFiles();
for(File df:dfile)
{
if(df.isFile())
search(df,fname);
}
for(File df:dfile)
{
if(df.isDirectory())
search(df,fname);
}
}
}
public static boolean fileNameEquals(String fname,String sname)
{
if(fname.equals(sname))
return true;
return false;
}
}
之后..忘记判断下返回是否为null了...