`

InputStream,Reader,byte[]数据或字符串的内容拷贝到OutputStream或

阅读更多
007-07-18
妙用Commons良药<一>
关键字: Commons IO基础
妙用commons良药<一>
这一篇文章主要是讲Commons IO的一些内容.
Commons IO提供了org.apache.commons.io.CopyUtils类来将某个InputStream,Reader,byte[]数据或字符串的内容拷贝到OutputStream或Writer.

Java代码 复制代码

   1. Writer writer = new FileWriter( "test.dat" ); 
   2. InputStream inputStream =  
   3.     getClass( ).getResourceAsStream("./test.resource"); 
   4. CopyUtils.copy( inputStream, writer ); 
   5. writer.close( ); 
   6. inputStream.close( ); 

    Writer writer = new FileWriter( "test.dat" );
    InputStream inputStream =
        getClass( ).getResourceAsStream("./test.resource");
    CopyUtils.copy( inputStream, writer );
    writer.close( );
    inputStream.close( );




如果需要把信息从Reader或InputStream拷贝到字符串中,请使用IOUtils.toString()方法.
Java代码 复制代码

   1. InputStream inStream = url.openStream( ); 
   2. String contents = IOUtils.toString( inStream ); 

    InputStream inStream = url.openStream( );
    String contents = IOUtils.toString( inStream );




通过org.apache.commons.io.IOUtils,你可以很好地关闭某个InputStream,OutputStream,Reader或Writer,而不必担心null或IOException.
Java代码 复制代码

   1. try { 
   2.     File file = new File( "test.dat" ); 
   3.     reader = new FileReader( file ); 
   4.     result = CopyUtils.toString( reader ); 
   5. } catch( IOException ioe ) { 
   6.     System.out.println( "Unable to copy file test.dat to a String." ); 
   7. } finally { 
   8.     IOUtils.closeQuietly( reader ); 
   9. } 

try {
    File file = new File( "test.dat" );
    reader = new FileReader( file );
    result = CopyUtils.toString( reader );
} catch( IOException ioe ) {
    System.out.println( "Unable to copy file test.dat to a String." );
} finally {
    IOUtils.closeQuietly( reader );
}




使用FileUtils.byteCountToDisplaySize()生成一个字符串,该字符串含有有一个近似的比较好理解的文件的相对大小的值.
Java代码 复制代码

   1. File file = new File("project.xml"); 
   2. long bytes = file.length( ); 
   3. String display = FileUtils.byteCountToDisplaySize( bytes ); 

   File file = new File("project.xml");
   long bytes = file.length( );
   String display = FileUtils.byteCountToDisplaySize( bytes );




如果需要将一个文件拷贝为另一个文件,或者需要将某个文件拷贝到某一个目录中,可以使用如下的代码:
拷贝为另一个文件:
Java代码 复制代码

   1. File src = new File( "test.dat" ); 
   2. file dest = new File( "test.dat.bak" ); 
   3. FileUtils.copyFile( src, dest ); 

    File src = new File( "test.dat" );
    file dest = new File( "test.dat.bak" );
    FileUtils.copyFile( src, dest );


拷贝到某一个目录:
Java代码 复制代码

   1. File src = new File( "test.dat" ); 
   2. File dir = new File( "./temp" ); 
   3. FileUtils.copyFileToDirectory( src, dir ); 

    File src = new File( "test.dat" );
    File dir = new File( "./temp" );
    FileUtils.copyFileToDirectory( src, dir );




使用Commons IO,你也可以很方便把字符串的内容写入文件中去,具体的过程不用怎么理会:
Java代码 复制代码

   1. String string = "Blah blah blah"; 
   2. File dest = new File( "test.tmp" ); 
   3. FileUtils.writeStringToFile( dest, string); 

  String string = "Blah blah blah";
  File dest = new File( "test.tmp" );
  FileUtils.writeStringToFile( dest, string);




当然,有另外的一个功能,可以将URL的内容存入文件中去:
Java代码 复制代码

   1. URL src = new URL( "http://www.nytimes.com" ); 
   2. File dest = new File( "times.html" ); 
   3. FileUtils.copyURLToFile( src, dest ); 

    URL src = new URL( "http://www.nytimes.com" );
    File dest = new File( "times.html" );
    FileUtils.copyURLToFile( src, dest );




如果你需要删除一个目录下的所有内容(包括其目录),可以这样做:
Java代码 复制代码

   1. File dir = new File( "temp" ); 
   2. FileUtils.deleteDirectory( dir ); 

    File dir = new File( "temp" );
    FileUtils.deleteDirectory( dir );

如果只想清空目录下所有内容,并不删除该目录,可以这样写:FileUtils.cleanDirectory( dir );


很简单地,可以得到一个目录的大小:
Java代码 复制代码

   1. File dir = new File( "temp" ); 
   2. long dirSize = FileUtils.sizeOfDirectory( ); 

File dir = new File( "temp" );
long dirSize = FileUtils.sizeOfDirectory( );




如果你想得到某个目录下所有以.txt结尾的文件,可以如下这样做:
Java代码 复制代码

   1. import java.io.FilenameFilter; 
   2. import org.apache.commons.io.filefilter.SuffixFileFilter; 
   3. import org.apache.commons.lang.ArrayUtils; 
   4.  
   5. File rootDir = new File("."); 
   6. FilenameFilter fileFilter = new SuffixFileFilter(".txt"); 
   7. String[] txtFiles = rootDir.list( fileFilter ); 
   8. System.out.println( ArrayUtils.toString( txtFiles ) ); 

import java.io.FilenameFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.lang.ArrayUtils;

File rootDir = new File(".");
FilenameFilter fileFilter = new SuffixFileFilter(".txt");
String[] txtFiles = rootDir.list( fileFilter );
System.out.println( ArrayUtils.toString( txtFiles ) );




举另一个例子,怎样列出目录中以.htm和.html结尾的文件
Java代码 复制代码

   1. import org.apache.commons.io.filefilter.AndFileFilter; 
   2. import org.apache.commons.io.filefilter.DirectoryFileFilter; 
   3. import org.apache.commons.io.filefilter.IOFileFilter; 
   4. import org.apache.commons.io.filefilter.NotFileFilter; 
   5. import org.apache.commons.io.filefilter.OrFileFilter; 
   6. import org.apache.commons.io.filefilter.SuffixFileFilter; 
   7. import org.apache.commons.lang.ArrayUtils; 
   8.  
   9. IOFileFilter htmlFilter =  
  10.     new OrFileFilter( new SuffixFileFilter("htm"),new SuffixFileFilter("html") ); //复合两个SuffixFileFilter 
  11. IOFileFilter notDirectory = new NotFileFilter( DirectoryFileFilter.INSTANCE );    //拒绝选择目录 
  12. FilenameFilter fileFilter = new AndFileFilter( htmlFilter, notDirectory ); 
  13. String[] htmlFiles = rootDir.list(fileFilter); 
  14. System.out.println( ArrayUtils.toString( htmlFiles )); 

import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.OrFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.lang.ArrayUtils;

IOFileFilter htmlFilter =
    new OrFileFilter( new SuffixFileFilter("htm"),new SuffixFileFilter("html") ); //复合两个SuffixFileFilter
IOFileFilter notDirectory = new NotFileFilter( DirectoryFileFilter.INSTANCE );    //拒绝选择目录
FilenameFilter fileFilter = new AndFileFilter( htmlFilter, notDirectory );
String[] htmlFiles = rootDir.list(fileFilter);
System.out.println( ArrayUtils.toString( htmlFiles ));



注:文中代码来之<<Jakarta Commons Cookbook>>一书第十章
文章待续,会写一些关于commons的笔录下来
分享到:
评论

相关推荐

    Java IO流 总结

    基本数据类型和字符串类型需要结合InputStream和OutputStream来处理。 b) 引用类型:serializable transient 引用类型需要实现serializable接口,以便将对象序列化为字节流。 6. 字符流:只能处理纯文本 字符流...

    资深程序员的Java面试题总结汇总.docx

    15. Java的IO流分为字符流(Character Stream)和字节流(Byte Stream),分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)。 16. BIO(Blocking IO)是同步阻塞的,NIO(Non-blocking IO)是同步...

    Java大数据面试常见问题.pdf

    字节流继承于 InputStream/OutputStream,字符流继承于 Reader/Writer。 8. 如果 main 方法被声明为 private 会怎样? 答案:能正常编译,但运行的时候会提示”main 方法不是 public 的”。 9. Java 里的传引用和...

    Java IO commons-io-2.5.jar

    Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来装饰其他流,添加...

    Java 最常见的 200+ 面试题:面试必备.docx

    分为字节流(Byte Stream)和字符流(Character Stream),又分别分为输入流(InputStream/Reader)和输出流(OutputStream/Writer)。 16. **BIO、NIO、AIO的区别**: BIO是同步阻塞,NIO是同步非阻塞,AIO...

    JavaSe总结JavaSe总结

    1. **IO流**:Java中用于数据输入输出的流,分为字节流和字符流两大类,如`InputStream`、`OutputStream`、`Reader`、`Writer`等。 2. **FileInputStream/FileOutputStream**:用于读取和写入文件的字节流,适用于...

    Java开发全面通(教程,实例,资源)

    - `InputStream` 和 `OutputStream`:最基础的字节流类。 - `Reader` 和 `Writer`:最基础的字符流类。 - `FileInputStream` 和 `FileOutputStream`:用于文件的读写操作。 - `BufferedReader` 和 `...

    Java面试八股文十万字总结.docx

    - **InputStream/OutputStream**:输入输出流的基类。 - **Reader/Writer**:字符流的基类。 - **FileInputStream/FileOutputStream**:文件输入输出流。 - **BufferedReader/BufferedWriter**:带缓冲的字符流。 - ...

    面试 java 必须会的基础小程序 背过!

    - 字节流和字符流的理解,InputStream和OutputStream、Reader和Writer家族。 - 缓冲流BufferedReader和BufferedWriter的使用。 13. **线程与并发**: - Thread类的使用,实现多线程的方法。 - 线程同步机制,...

Global site tag (gtag.js) - Google Analytics