第十二部分:文件列表方法示例
1、文件列表使用的是File类的关键方法:
a、static File[] listRoots():列出可用的文件系统根。
b、File[] listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
c、String[] list():返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
2、list()使用代码示例:
public class HelloDemo {
public static void main(String[] args) throws Exception {
File f = new File("E:\\Test");
String[] names = f.list();
for(String name : names)
{
System.out.println(name);
}
}
}
输出结果:
1 - 副本 (5).txt
1 - 副本.txt
1.txt
新建文件夹
新建文件夹 - 副本
新建文件夹 - 副本 (2)
public class HelloDemo {
public static void main(String[] args) throws Exception {
File[] files = File.listRoots();
for(File f:files)
{
System.out.println(f);
}
}
}
输出结果:
C:\
D:\
E:\
F:\
G:\
public class HelloDemo {
public static void main(String[] args) throws Exception {
File dir = new File("E:\\Test");
File[] files = dir.listFiles();
for(File f : files)
{
System.out.println(f.getName()+":"+f.length());
}
}
}
输出结果:
1 - 副本 (5).txt:0
1 - 副本.txt:0
1.txt:0
新建文件夹:4096
新建文件夹 - 副本:0
新建文件夹 - 副本 (2):0
5、仅限式txt格式的文件方法示例:
在list()方法中传入FilenameFilter对象参数,并覆写accept方法。
import java.io.File;
import java.io.FilenameFilter;
public class HelloDemo {
public static void main(String[] args) throws Exception {
File dir = new File("E:\\Test");
String[] arr1 = dir.list(new FilenameFilter() {
public boolean accept(File dir,String name)//覆写accpet方法。注意参数
{
return name.endsWith(".txt");//返回指定的文件名
}
});
for(String s : arr1)
{
System.out.println(s);
}
}
}
输出结果:
1 - 副本 (5).txt
1 - 副本.txt
1.txt
public class HelloDemo {
public static void main(String[] args) throws Exception {
File dir = new File("E:\\Test");
showDir(dir);
}
public static void showDir(File dir)
{
System.out.println(dir);
File[] files = dir.listFiles();
for(int x = 0; x<files.length; x++)
{
if(files[x].isDirectory())
showDir(files[x]);
else
System.out.println(files[x]);//也可以使用files[x].toString()
}
}
}
输出结果:
E:\Test
E:\Test\1 - 副本 (5).txt
E:\Test\1 - 副本.txt
E:\Test\1.txt
E:\Test\新建文件夹
E:\Test\新建文件夹\新建 Microsoft Word 文档 - 副本 (2).doc
E:\Test\新建文件夹\新建 Microsoft Word 文档 - 副本.doc
E:\Test\新建文件夹\新建 Microsoft Word 文档.doc
E:\Test\新建文件夹 - 副本
E:\Test\新建文件夹 - 副本 (2)
6、将一个指定目录下的txt文件的绝对路径,存储到一个文本文件中
思路:
a、 对指定的目录进行递归
b、 获取递归过程中所有的java文件的路径
c、 将这些路径存储到集合中
d、 将集合中的数据写入到一个文件中
public class HelloDemo {
public static void main(String[] args) throws Exception {
File dir = new File("E:\\Test");
List<File> list = new ArrayList<File>();//list存储File对象
fileToList(dir, list);
System.out.println(list.size());
File file = new File(dir, "javalist.txt");//这个方法可以在dir目录下创建一个"javalist.txt"示例
writeToFile(list, file.toString());
}
// fileToList可以遍历这个目录下所有的文件和文件夹及其子文件夹下所有文件,然后添加到List容器内
public static void fileToList(File dir, List<File> list) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory())
fileToList(file, list);
else {
if (file.getName().endsWith(".txt"))
list.add(file);
}
}
}
//该方法可以将list里的元素写入文本中
private static void writeToFile(List<File> list, String javaListFile) throws IOException {
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(javaListFile));
for (File f : list) {
String path = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
throw e;
} finally {
try {
if (bufw != null)
bufw.close();
} catch (IOException e) {
throw e;
}
}
}
}
第十三部分:打印流
1、打印流:提供了打印方法,可以将各种数据类型的数据原样打印。
2、打印流分为:
a、字节打印流PrintStream。
构造函数可以接收的参数类型:
file对象 File
字符串路径 String
字节输出流 OutputStream
b、字符打印流PrintWriter
构造函数可以接收的参数类型
file对象 File
字符串路径 String
字节输出流 OutputStream
字符输出流 Writer
应用:web开发中最常用,例如将信息打印到客户机中
需要注意的是:
在构造函数中如果传入参数true,则不需要flush方法,而且配合println方法使用。
如果要写入”a.txt“文件中,需要自动刷新的话传入参数true
PrintWriter(new FileWriter("a.txt"),true)
如果想要使用缓冲的话:
PrintWriter(new BufferedWriter(new FileWriter("a.txt")),true)
3、需求:从键盘录入,在控制台输出
public class HelloDemo {
public static void main(String[] args) throws Exception {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out, true);// 设置为true,则flush()方法不需要,需要配合println方法
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
out.println(line.toUpperCase());
// out.write(line.toUpperCase());不带自动换行,上面那句带换行
// out.flush();
// 如果不用flush方法,则PrintWriter(System.out,true);
}
out.close();
bufr.close();
}
}
第十四部分:合并流
class
{
public static void main(String[] args)throws IOException
{
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("d:\\1.txt"));
v.add(new FileInputStream("d:\\2.txt"));
v.add(new FileInputStream("d:\\3.txt"));
Enumeration<FileInputStream> en = v.elements();
//关键句,传入的参数是枚举器对象
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("d:\\4.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);//输出结果是1、2、3三个文本数据合并到4.txt
}
fos.close();
sis.close();
}
}
3、切割文件
class
{
public static void main(String[] args)
{
splitFile();
}
//合并
public static void merge()
{
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int x=1;x<=3;x++)
{
al.add(new FileInputStream("c:\\a\\"+x+".part"));
}
final Iterator<FileInputStream> it = al.iterator();
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElements()
{
return it.next();
}
}
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("c:\\1.bmp");
byte[] buf = new byte[1024];
int len = 0 ;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
//切割文件
public static void splitFile()throws IOException
{
//关联文件
FileInputStream fis = new FileInputStream("d:\\1.bmp");
FileOutputStream fos = null;
byte[] buf = new byte[1024*1024];
int len = 0;
int count = 1;
while((len = fis.read(buf))!=-1)
{
//多次创建流可以创建多个文件
fos = new FileOutputStream("d:\\a\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}