参考文章 https://yq.aliyun.com/articles/32287
http://www.cnblogs.com/lich/archive/2011/12/10/2283445.html
http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html 很全面的最总结
一、FileNameFilter的策略模式
根据条件筛选目录列表
1.首先File即可以代表文件,也可以代表文件夹。
2.这里的FilenameFilter采用了一个策略模式(它本身是一个接口),只有一个accept方法,创建它的目的只是要把accept方法传递给File.list方法。提供一个匹配的条件
File path=new File(".");
String[] list=path.list(new FilenameFileter(){
private Pattern pattern=Pattern.compile(匹配条件);
public boolean accept(File dir,String name){
return pattern.matcher(name).matches();
}
});
在Java中 list(FilenameFilter filter)方法的实现,该方法会调用filter的accpet方法,如果根据你的条件accept方法匹配到了文件,既accept方法返回true,就将该文件放入到集合中。
public String[] list(FilenameFilter filter) {
String[] filenames = list();
if (filter == null || filenames == null) {
return filenames;
}
List<String> result = new ArrayList<String>(filenames.length);
for (String filename : filenames) {
if (filter.accept(this, filename)) {
result.add(filename);
}
}
return result.toArray(new String[result.size()]);
}
f.getAbsolutePath()
f.canRead();
f.lastModified();//最后修改的日期
f.getPath();
f.renameTo(File file)//移动文件或修改文件名称
IO流
类 | 功能 |
---|---|
ByteArray | 允许将内存的缓冲区当做InputStream使用 |
StringBuffer | 将String转换成InputStream |
File | 从文本中读取信息 |
Sequence | 将连个或者多个inputstream转换成单一的inputstream |
Piped | 实现管道化的数据 |
1.JAVA中的IO流分为输入流和输出流。与所有输入相关的类全部继承自InputStream,输出相关的全部继承自OutputStream。这两个类是面向字节的。
2.在Java1.1后新加入了Writer和Reader类,是一种针对Unicode字符的输入输出流。每个Stream方法都有对应的字符流方法。并且,字符流方法提供了响应的适配器可以将字节流方法转换成字符流。
3.同样Java提供了流的适配器类来改变流的行为。所有适配器(流的包装类)的基类FilterOutputStream。
InputStream 类
类 | 功能 |
---|---|
ByteArray | 允许将内存的缓冲区当做InputStream使用 |
StringBuffer | 将String转换成InputStream |
File | 从文本中读取信息 |
Sequence | 将连个或者多个inputstream转换成单一的inputstream |
Piped | 实现管道化的数据 |
1.使用FileWriter向文件中写内容
FileWriter writer = new FileWriter( fileName );
writer.write( "Hello!\n");
writer.write( "This is my first text file,\n" );
writer.write( "You can see how this is done.\n" );
writer.write("输入一行中文也可以\n");
writer.close();
2.BufferedWriter类
写大量数据的时候推荐使用BufferedWirter类
String fileName = "C:/newHello.txt" ;
BufferedWriter out = new BufferedWriter( new FileWriter( fileName ) );
out.write( "Hello!" );
out.newLine() ;
out.write( "This is another text file using BufferedWriter," );
out.newLine();
out.write( "So I can use a common way to start a newline" );
out.close();
3.使用BufferedReader和FileReader缓冲读取一个文件
1.BufferedReader具有readLine方法,可以一行一行的读取数据。如果没有读取到数据返回null
注意:使用readLine会丢弃换行符。所以手动加入换行符
BufferedReader in=new BufferedReader(new FileReader(filename));
String s;
StringBuilder builder=new StringBuilder();
while((s=in.readLine()!=null)){
builder.append(s+"\n");
}
DataInputStream格式化的读取数据
它是一个面向字节的输入流,可以以字节的形式读取任何数据,比如文件。
方法:
readByte
readChar
....
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("file.txt")));
while(in.available()!=0){
in.readByte()
}
DataOutputStream输出任意形式的数据
具有写各种基本数据类型的方法
将数据写到另一个输出流
它在所有的计算机平台上使用同样的数据格式,只要两台计算机上都有java,那么它是跨平台的。当我们使用DataIn/outputStream 输入输出信息时,最可靠的做法就是使用writeUTF。UTF-8是一种多字节可是,编码长度根据实际使用的字符集会有所变化。
例:将三个int型数字255/0/-1写入数据文件data1.dat
DataOutputStream out = new DataOutputStream( new FileOutputStream(fileName));
out.writeInt(value0);
新IO学习
新IO是在JDK1.4以后引入的,其目的在于提高读写的速度。它的思路更接近于操作系统执行的IO方式。使用缓冲+通道的方式。如果保存数据:将数据放到缓冲器中,通过缓冲器将数据放到管道中。如果取出数据:则管道将数据交给缓冲器,通过缓冲器拿到数据。
1.唯一与管道交互的缓冲器是---ByteBuffer类,存储字节的缓冲器。
2.管道类----Channels,负责发送和读取数据。
例:
1.像管道中写数据时,数据要用ByteBuffer.wrap()包装起来。
2.在完成后要记得close
3.对于读取数据时,要使用静态的allocate()方法来分配ByteBuffer的空间。如果为了达到更高的速度可以使用allocateDirect()分配更大的内存。
//jdk对老的FileInputStream,FileOutputStream,RandomAccessFile类做了兼容
FileChannel fc=new FileOutputStream("data.txt").getChannel();
//使用缓冲类,将数据先用缓冲类包装,再传递给管道fc对象。
fc.write(ByteBuffer.wrap("hh".getBytes()));
fc.close();
fc=new RandomAccessFile("data.txt").getChanel();
fc.position(fc.size());//移动到流的最后一个位置,从该位置开始写入数据
fc.write(ByteBuffer.wrap("tt".getBytes()));
fc.clear();//如果使缓冲器执行更进一步的read操作。
fc.close();
//读取数据
fc=new FileInputStream("data.txt").getChanel();//拿到读取文件的管道
ByteBuffer buff=ByteBuffer.allocate(1024);//分配空间
fc.read(buff);//将数据读取到buff中
buff.clipe();//通知buff,准备接收数据
while(buff.hasRemaing()){
syso(buff.get());
}