JAVA IO的学习

参考文章  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 result = new ArrayList(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是一种多字节可是,编码长度根据实际使用的字符集会有所变化。

JAVA IO的学习_第1张图片

JAVA IO的学习_第2张图片

例:将三个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());
}

你可能感兴趣的:(JAVA IO的学习)