`

apache的FileUtils

 
阅读更多
			List<String> lines = FileUtils.readLines(new File(filePath), "GBK");
			
			for (int i=1; i<lines.size();i++) {
				String temp[] = lines.get(i).split(",");
                        }

 apache下 开源了许多实用的工具类,一般都是在commons包下。

开源的在线文档:http://commons.apache.org/

commons.jar 包下载 :http://commons.apache.org/io/download_io.cgi

这里讲到了:  IOUtils 和 FileUtils 。 中文文档奇缺,有知道的童鞋可以吱一声。

1.IOUtils 简要说明

该类为input/output操作提供了通用静态方法。

包括功能:

•closeQuietly——这些关闭一个流的方法将忽略nulls和例外的情况。

•toXxx /read-这些方法从一个流读取数据。

• write这些方法将数据写到一个流里。

copy——这些方法用于从一个流的所有的数据复制到另一个流。

•contentEquals——这些方法用于比较两个流的内容。

 

byte-to-char方法集和char-to-byte方法集都包括一个转换步骤。给出的两种方法集合在每种情况下,一种是使用平台默认的编码方式,另一个允许你指定一个编码。

鼓励你总是指定一个编码因为依靠平台违约会带来意想不到的结果,例如从开发阶段移动到产品部署。

 

这个类里面所有的方法在读一个流的时候内部是被缓冲的。这意味着我们外部使用的时候就不需要BufferedInputStream或BufferedReader。在测试中默认缓存4 K已被证明是有效。

无论在何处,在这个类里的方法在这堂课里不要冲洗或关闭流。这是为了避免犯不可移植的假设那小溪的来源和进一步使用。因此调用者还需要负责使用后手动关闭流。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 使用IOUtils来重写原来的读取写入流的操作,代码简洁,没了烦人的try  以前连基本的操作都要在两个流之间倒来倒去 还要考虑怎么转换,现在一切都是浮云了。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

这边是API的简单介绍:

1.closeQuietly 包括对各种类型输入输出流的关闭。 无条件的关闭流。

[java] view plain copy
 
  1. byte[] data = "Hello, World".getBytes();   
  2.   
  3. OutputStream out = null;  
  4.   
  5.  try {   
  6.   
  7.     out = new FileOutputStream("foo.txt");   
  8.   
  9.     out.write(data);   
  10.   
  11.     //out.close();//close errors are handled  我们通常的用法,是不太好的。  
  12.   
  13.     }   
  14.   
  15. catch (IOException e) {   
  16.   
  17. // error handling   
  18.   
  19. finally  
  20.   
  21.  {  
  22.   
  23.   IOUtils.closeQuietly(out); 以后就直接在finally里关闭流。也不需要判断条件。  
  24.   
  25.  }  


2. toByteArray 从各类输入流中读取数据并转换为字节数组。

toByteArray(参数) 里的参数包括:Reader,InputStream,String,这里String 已经过时,等同于String.getBytes();

toByteArray

public static byte[] toByteArray(InputStream input,
                                 long size)
                          throws IOException

以字节数组的形式来获取inputStream流里的内容,如果在流的大小已知的情况下,可以用此方法来代替默认的toByteArray(InputStream input)方法。

注:该方法会检查size是否可以安全地转换为int,在其正式读到字节数组前。

 

①读操作

IOUtils类提供的读操作方法有两大类:第一类是readLines方法。第二类是toXxx方法。

 ※ readLines方法

List readLines(InputStream input)
List readLines(InputStream input, String encoding)
readLines(Reader input)


我们知道在字节流中是没有“行”的概念的,但是为什么这里的readLines方法可以接收InputStream呢?看看源代码就知道了

public static List readLines(InputStream input, String encoding) throws IOException {
        
if (encoding == null{
            
return readLines(input);
        }
 else {
            InputStreamReader reader = new InputStreamReader(input, encoding);

            
return readLines(reader);
        }

    }


public static List readLines(Reader input) throws IOException {
        BufferedReader reader 
= new BufferedReader(input);
        List list 
= new ArrayList();
        String line 
= reader.readLine();
        
while (line != null{
            list.add(line);
            line 
= reader.readLine();
        }

        
return list;
    }


原来在底层,IOUtils使用了InputStreamReader对input stream进行了包装,到了readLines(Reader)方法内,又再加了一个缓冲。如果我们是直接调用readLines(Reader)方法,为了确保编码正确,需要手工创建一个InputStreamReader并指明encoding,否则将采用默认的encoding。

 ※ toXxx方法

IOUtils支持把inputStream中的数据转换成byte[],char[],String对象。而且input stream可以是字节流,字符流。同时可以指定encoding。这些方法实质上是“输出”的过程:即从输入流中读入数据,然后转换为byte[],char[],String,输出到内存中。看看下面的一个源代码:

    public static char[] toCharArray(InputStream is, String encoding)
            
throws IOException {
        CharArrayWriter output 
= new CharArrayWriter();
        copy(is, output, encoding);
        
return output.toCharArray();
    }


    
public static void copy(InputStream input, Writer output, String encoding)
            
throws IOException {
        
if (encoding == null{
            copy(input, output);
        }
 else {
          InputStreamReader in = new InputStreamReader(input, encoding);

            copy(in, output);
        }

    }


    
public static int copy(Reader input, Writer output) throws IOException {
        
long count = copyLarge(input, output);
        
if (count > Integer.MAX_VALUE) {
            
return -1;
        }

        
return (int) count;
    }


    
public static long copyLarge(Reader input, Writer output) throws IOException {
        
char[] buffer = new char[DEFAULT_BUFFER_SIZE];
        
long count = 0;
        
int n = 0;
        
while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);

            count 
+= n;
        }

        
return count;
    }



我们可以看到这个过程是没有进行flush的操作的,也就是说使用者必须负责在调用结束后进行缓存清空和输入、输入流关闭。对于input stream是文件的情况,在FileUtils的文件读方法的最后都会调用IOUtils.closeQuietly(in);方法来确保输入流正确关闭。

②写操作

和读操作一样,IOUtils一样提供了大量的写方法,这些方法可以将byte[],char[],StringBuffer,String,Collection中的数据以字节流,字符流的形式写入到目的源。

 ※ writeLines方法

public static void writeLines(Collection lines, String lineEnding,
            OutputStream output, String encoding) 
throws IOException {
        
if (encoding == null{
            writeLines(lines, lineEnding, output);
        }
 else {
            
if (lines == null{
                
return;
            }

            
if (lineEnding == null{
                lineEnding 
= LINE_SEPARATOR;
            }

            
for (Iterator it = lines.iterator(); it.hasNext(); ) {
                Object line 
= it.next();
                
if (line != null{
                    output.write(line.toString().getBytes(encoding));
                }

                output.write(lineEnding.getBytes(encoding));
            }

        }

    }


public static void writeLines(Collection lines, String lineEnding,
            Writer writer) 
throws IOException {
        
if (lines == null{
            
return;
        }

        
if (lineEnding == null{
            lineEnding 
= LINE_SEPARATOR;
        }

        
for (Iterator it = lines.iterator(); it.hasNext(); ) {
            Object line 
= it.next();
            
if (line != null{
                writer.write(line.toString());
            }

            writer.write(lineEnding);
        }

    }


如果我们查看FileUtils,会发现它对所有的文件读写(包括writeLines,writeStringToFile),都是调用字节流+encoding的方式来进行的。因为所有基于字符流的方式最终都需要转换为基于字节流的方式。

③流拷贝

我们在从文件等数据源读入数据时,习惯性地以字节读入,到了内存又转换成String对象,最后修改性地以字符写回文件。IOUtils提供了一系列方便的方法来进行这中间的转换。

copy(InputStream input, Writer output, String encoding),这个方法使用指定的encoding,从字节流中读入字节,然后按照encoding解码,通过字符流写回目的源。

copy(Reader input, OutputStream output, String encoding),这个方法从字符流中读取字符,使用指定的encoding编码,通过字节流写回目的源,然后立即清空缓冲。

上面这两个方法底层都调用了一个名为copyLarge的方法,他们分别在通过一个byte[]或者char[]数组对要写回的内容进行缓冲。一次性地从源端读入4K数据然后通过输出流写回。

    public static long copyLarge(InputStream input, OutputStream output)
            
throws IOException {
        
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        
long count = 0;
        
int n = 0;
        
while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 
0, n);
            count 
+= n;
        }

        
return count;
    }


    
public static long copyLarge(Reader input, Writer output) throws IOException {
        
char[] buffer = new char[DEFAULT_BUFFER_SIZE];
        
long count = 0;
        
int n = 0;
        
while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 
0, n);
            count 
+= n;
        }

        
return count;
    }

 

分享到:
评论

相关推荐

    org.apache.commons.io.FileUtils

    Apache Commons IO库中的`org.apache.commons.io.FileUtils`类是一个非常实用的工具类,它提供了大量方便、高效的方法,用于处理文件系统操作。这个类在Java开发中被广泛使用,尤其是在处理大量的文件读写和管理任务...

    【Java基础】-- FileUtils工具类常用方法(csdn)————程序.pdf

    在Java开发中,进行文件操作是必不可少的一部分,Apache Commons IO库提供了一个非常方便的工具类FileUtils,它对Java基础的IO操作进行了封装,使得文件处理更加简洁易用。在本文中,我们将详细介绍FileUtils工具类...

    org.apache.commons.jar包官方免费版(附下载地址)

    解决Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils 类似错误,需要导入jar包,下载地址是http://commons.apache.org/proper/commons-io/download_io.cgi

    FileUtils java web 文件上传下载工具

    首先,`FileUtils`并不是Java标准库的一部分,而是Apache Commons IO库提供的一个实用类。Apache Commons IO是Java中处理输入/输出流的利器,提供了许多便捷的文件操作方法,如读写文件、复制文件、比较文件等。要...

    org.apache.commons jar

    例如,FileUtils 提供了文件的创建、复制、移动和删除等操作,IOUtils 可以用于读取和写入流,或者将流转换为字符串。 3. **Apache Commons Collections**: 这个模块扩展了 Java 的集合框架,提供了额外的数据结构...

    apache.commons全套jar包下载

    它提供了一系列方便实用的类和方法,比如FileUtils用于文件操作,IOUtils用于流的读写和复制,以及EndianUtils用于处理字节序问题。 2. Apache Commons CLI: 命令行接口(CLI)工具包简化了命令行参数解析。它可以...

    Apache commons-io-2.5.jar

    Apache Commons IO 是一个Java库,专门用于处理输入/输出(I/O)操作。这个库提供了大量的实用工具类,使得在处理文件、流、过滤器、读写操作时更加方便。"commons-io-2.5.jar"是Apache Commons IO库的一个版本,...

    apache-commons所有jar包

    2. **Commons IO**: 专注于文件输入输出相关的操作,提供了一些方便的类和方法,如 FileUtils、IOUtils、FileFilter 等。 3. **Commons Collections**: 为 Java 集合框架提供了扩展,包括各种集合操作、转换和工厂...

    org.apache.commons 全部包

    例如,`FileUtils` 提供了大量用于操作文件的静态方法,如拷贝、删除和比较文件;`IOUtils` 则包含了一些与流操作相关的方法,如读取流到字符串或写入字符串到流。 3. **Commons Collections**:这是一个用于增强 ...

    org.apache.commons.io.jar

    《Apache Commons IO库详解》 Apache Commons IO是Java开发中常用的一个开源库,其核心组件是`org.apache.commons.io.jar`文件。这个库提供了一系列高度实用的I/O操作类,大大简化了对输入/输出流的处理,为开发者...

    org.apache.commons

    例如,`FileUtils` 类提供了方便的文件操作方法,如复制、删除、移动等;`IOUtils` 类则提供了读写流的方法,可以方便地读取和写入流中的数据。 2. **Lang**: Apache Commons Lang 提供了对 Java 内置类的扩展,...

    FileUtils.rar

    在`FileUtils`这个类中,这些功能通常会被封装成方法,比如`compressFolderTo7z()`和`uncompress7z()`, 以及对应的.zip版本的方法。这些方法应该处理所有必要的错误和异常,以确保文件操作的正确性和安全性。 总的...

    Apache Commons工具集

    例如,`FileUtils` 类提供了方便的文件操作方法,如复制、移动、删除文件;`IOUtils` 可以用于读写流并关闭资源。 2. **Lang**: Commons Lang 提供了对Java语言功能的增强,包括字符串操作、数组处理、日期时间格式...

    apache工具类

    - **FileUtils**: 文件操作,如读写文件、删除、移动和复制。 - **StringUtils**: 提供了更高级的字符串操作,如替换、分割、比较等。 这些工具类大大简化了开发工作,提高了代码的可读性和可维护性。通过正确使用...

    Apache common io转码工具类入门教程

    Apache Commons IO是Apache软件基金会开发的一个Java库,它提供了大量的实用工具类,简化了I/O操作,包括文件、流、过滤器、读写操作、转码等。在本教程中,我们将深入探讨如何使用Apache Commons IO进行转码,特别...

    java的Apache组件学习Demo

    例如,你可以使用`FileUtils`进行文件和目录的操作,使用`IOUtils`进行流的读写和关闭,或者使用`LineIterator`遍历文件的每一行。 接着,Apache Commons Lang是用于补充Java语言功能的库,包括字符串处理、日期和...

    apache commons 开源工具列举

    例如,FileUtils类提供了文件和目录的操作,如复制、移动、删除等,而IOUtils则有读取和写入流的便捷方法。 3. **Apache Commons Collections**: 这个模块扩展了Java集合框架,提供了新的集合实现、迭代器、比较器...

    Apache Commons书籍

    例如,FileUtils用于文件操作,IOUtils用于流操作,LineIterator用于逐行读取文件。 2. **Apache Commons Lang**:提供了一些增强的Java语言功能,比如字符串操作、数组处理、日期和时间处理、反射工具等。例如,...

    org.apache.commons.io 包

    1. **文件操作**: `FileUtils` 类提供了大量的静态方法,用于执行文件和目录的操作,如复制、移动、删除、创建、检查文件或目录是否存在等。例如,`copyFile()` 和 `copyDirectory()` 方法可以方便地在不同位置之间...

Global site tag (gtag.js) - Google Analytics