IO流

一、引言

  由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择。因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本能力。本章IO类的使用就从读写文件开始。

  文件(File)是最常见的数据源之一,在程序中经常需要将数据存储到文件中,例如图片文件、声音文件等数据文件,也经常需要根据需要从指定的文件中进行数据的读取。当然,在实际使用时,文件都包含一个的格式,这个格式需要程序员根据需要进行设计,读取已有的文件时也需要熟悉对应的文件格式,才能把数据从文件中正确的读取出来。

二、File类

路径

  在不同的操作系统环境下,文件路径的表示形式是不一样的,在Windows操作系统中一般的表示形式为C:\windows\system,而Unix上的表示形式为/user/my。在java中’\’是Java语言中的特殊字符,所以写文件路径时,要写成“C:\\windows\\system”或者“C:/windows/system”,使用“/”可以兼容windows和linux系统。

  路径中的“\”替换成“/”:

  File file = new File("D:/java/java.java");
  file.createNewFile();
  String path = file.getCanonicalPath();
  String path2 = path.replaceAll("\\\\", "/");
  System.out.println(path2);

File类常用方法

1)mkdir、mkdirs、createNewFile方法,返回boolean类型表示是否创建成功

  mkdir、createNewFile如果当前路径中包含的父目录不存在时,不会创建,并且抛出异常。

  mkdirs如果当前路径中包含的父目录不存在时,会自动根据需要创建。

2)exists方法

  判断当前文件或文件夹是否存在。

3)isFile、isDirectory方法

  判断当前File对象是否是文件(目录)。

4)list、listFiles方法

  list返回当前文件夹下所有的文件名和文件夹名称;listFiles返回所有文件名。注意:该名称不是绝对路径。

5)getPath()、getAbsolutePath()和getCanonicalPath()方法

  getPath()返回的是File构造方法里的路径,是什么就是什么,不增不减。

  getAbsolutePath()返回的其实是当前路径+getPath()的内容,如:F:\workspace\test\..\src\test.txt。

  getCanonicalPath()返回的就是标准的将符号完全解析的路径。

 6)getName方法

  获得当前文件或文件夹的名称。

7)getParent方法

  获得当前路径中的父路径。例如c:\test\1.t则返回c:\test。

8)length方法

  返回文件存储时占用的字节数。

9)delete方法

  删除当前文件或文件夹

  如果删除的是文件夹,则该文件夹必须为空。如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。

    /**
     * 通过递归调用删除一个文件夹及下面的所有文件
     */
    public static void deleteFile(File file) {
        if (file.isFile()) {// 表示该文件不是文件夹
            file.delete();
        } else {
            // 首先得到当前的路径
            String[] childFilePaths = file.list();
            for (String childFilePath : childFilePaths) {
                File childFile = new File(file.getAbsolutePath() + "\\" + childFilePath);
                deleteFile(childFile);
            }
            file.delete();
        }
    }

三、IO流

  • 字节流:以字节为单位。
  • 字符流:以字符为单位,一个字符=两个字节,注意编码格式要统一。 

基本方法

InputStream:

  1)int read() ; // 读取一个字节,返回值为所读的字节 

  2)int read( byte b[] );  // 读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量

  3)int read(byte b[], int off, int len) // 从第off位置开始读,读len个字符

  4)int available( );  // 返回值为流中尚未读取的字节的数量 

OutputStream:

  1)void write( int b ); // 往流中写一个字节

  2)void write( byte b[] ); // 往流中写一个字节数组

  3)void write(byte b[], int off, int len)  // 从第off位置开始写,写入len个字节

  int len = 0;
  byte[] buffer = new byte[512];
  while ((len = in.read(buffer)) != -1) { // len的目的在于防止最后一次读取的字节小于buffer长度,
    out.write(buffer, 0, len); // 否则会自动被填充0
  }

  4)flush();

  // 刷空输出流,并输出所有被缓存的字节

  // 输入流没有此方法,因为输入流的缓冲功能是先将内容一次读到缓冲区,再从缓冲区中读到程序中

  // 只有BufferedOutputStream实现了缓冲功能,OutputStream和FileInputStream的flush()方法都是空方法

Reader:

  1)int read() ;

  2)int read(char cbuf[])

  3)int read(char cbuf[], int off, int len)

writer:

  1)void write(int c)

  2)void write(char cbuf[])

  3)void write(String str, int off, int len)

  4)void flush();

  5)void write(String str)

posted @ 2016-03-06 23:21  rhythm of the rain  阅读(147)  评论(0)    收藏  举报