文件处理

1.获取给定文件的文件名 获取给定文件的文件名,如程序3-22所示。该函数比较简单,就是通过文件分隔符,返回给定路径的最后一个分隔符之后的字符串,如果查找不到文件分隔符,则表明当前的参数s就是文件名称,直接返回即可。比如在Windows系统下的一个文件存储,路径可能是“C://temp//image_log.txt”,程序最后返回的结果将是“image_log.txt”。

在Windows下的文件分隔符为“/”,而Linux下则为“/”,注意区分。

程序3-22  获取文件名

public static String extractFileName(String s)

  {

    int pos = s.lastIndexOf(File.separatorChar);

    if (pos != -1) return s.substring(pos+1); else return s;

  }

2.文件到文件流的操作 本模块的示例程序3-23实现了从文件读取到文件流及输入输出文件流之间的转换两部分。首先是loadFile函数,它把文件filename读入输入文件流,然后转换到输出文件流,这里使用ByteArrayOutputStream字节数组输出流。loadFile函数中使用convertStream函数,就是输入文件流和输出文件流之间的转换。循环读取,然后依次写入。

程序3-23  读文件

public static String loadFile(String filename)

{

  try {

    FileInputStream in = new FileInputStream(new File(filename));

    ByteArrayOutputStream os = new ByteArrayOutputStream();

    convertStream(in, os);

    return os.toString();

  }

  catch (Exception ex) {}

  return "";

}

//输入、输出文件流的转换

public static void convertStream(InputStream is, OutputStream os) throws NullPointerException, IOException

{

  if (is == null || os == null) throw new NullPointerException();

  byte[] buf = new byte[1024];

  int cnt;

  while ((cnt = is.read(buf)) != -1) os.write(buf, 0, cnt);

  is.close();

  os.close();

}

3.文件的复制 复制文件模块如程序3-24所示。文件复制的实现机制如下,首先建立两个文件流。一个是使用起始文件路径建立的输入文件流,一个是使用目标文件路径建立的输出文件流,然后循环从输入文件流读取,依次把内容写入输出文件流,这样就完成了文件的复制功能。

程序3-24  文件复制

/**

 * 文件复制功能

 *

 * @param from    起始文件路径

 * @param to                  目标文件路径

 * @return size     文件复制过程中操作的字节数

 * @throws IOException

 */

public static long copyFile(File from, File to) throws IOException {

         if (from == null || to == null || !from.isFile()) return -1;

        

         FileInputStream fis = new FileInputStream( from );

         FileOutputStream fos = new FileOutputStream( to );

         byte [] buff = new byte[1024];

         int read = 0;

         long size = 0;

         while ( (read = fis.read(buff)) > 0 ) {

                  fos.write(buff, 0, read);

                  size += read;

         }

         fos.close();

         fis.close();

         return size;

}

4.按照特定编码从文本文件读/写字符串 使用给定的编码encode从文件中读文件到字符串及使用给定的编码encode把字符串写入文件的模块,如程序3-25所示。函数readFromFile把文件读取到FileInputStream文件流中,然后显示结果的时候使用给定的编码encode返回。函数writeToFile是readFromFile的逆向过程,它的作用是向文件中写入字符串内容,写入前需要先把字符串text使用给定的编码转换一下,这样才能正确地写入到文件中去。

程序3-25  读/写文件

/**

*从文本文件读取文件内容为字符串,按照encode编码返回结果

*

* @param filename          要读取的文件

* @param encode           编码

* @return string readed

*/

public static String readFromFile(String filename, String encode) {

         try {

                  FileInputStream fis = new FileInputStream(filename);

                  byte[] buf = new byte[fis.available()];

                  fis.read(buf);

                  fis.close();

                  return new String(buf, encode);

         }

         catch (Exception ex) {

                  ex.printStackTrace();

         }

         return "";

}

/**

* 按照encode向文本文件写入字符串

*

* @param text      需要写入的字符串

* @param filename          待写入的文件

* @param encode  编码

*/

public static void writeToFile(String text, String filename, String encode) {

         try {

                  byte[] buf = text.getBytes(encode);

                  FileOutputStream fos = new FileOutputStream(filename);

                  fos.write(buf);

                  fos.close();

         } catch (Exception e) {

                  e.printStackTrace();

         }

}

3.4.2  文件目录处理模块 1.返回文件所在的目录 返回文件所在目录的模块,如程序3-26所示。该函数比较简单,就是通过文件分隔符,返回给定路径的最后一个分隔符之前的字符串即可。

程序3-26  返回文件所在目录

  public static String extractFilePath(String s)

  {

    int pos = s.lastIndexOf(File.separatorChar);

    if (pos != -1) return s.substring(0, pos+1); else return "";

  }

2.把文件从一个目录移动到另外一个目录 在不同目录之间移动文件的模块,如程序3-27所示。文件移动操作的实现比较简单,如果文件from和文件to在同一目录下,只需要使用File类的renameTo函数即可,就是把源文件重命名成目标文件即可。当文件不在同一个目录下的时候,只需要使用文件复制功能,把源文件夹复制到目标文件夹即可。

程序3-27  文件移动

/**

 * 在不同路径之间移动文件

 *

 * @param from    源地址

 * @param to       目标地址

 * @return         返回已经写入的字节数

 * @throws IOException

 */

public static long moveFile(File from, File to) throws IOException {

         if (from == null || to == null || !from.isFile()) return -1;

        

         long size = 0;

         if (from.getParent().equals(to.getParent())) {

                  from.renameTo(to);

                  FileInputStream fis = new FileInputStream( to );

                  size = fis.available();

                  fis.close();

         } else {

                  size = copyFile(from, to);

                  from.delete();

         }

         return size;

}

3.使用给定的路径生成文件路径 使用给定的路径生成文件路径的模块代码,如程序3-28所示。基本原理是,使用File类的mkdir函数创建路径,代码递归调用createDirectory函数,使用绝对路径创建给定参数的文件路径。

程序3-28  生成文件路径

/**

* 使用给定的目录字符串创建文件目录,类似"/dd/aa/bb"

*

* @param path 要创建的路径,需要使用绝对路径

*/

public static void createDirectory( String fullpath ) {

                  File dir = new File(fullpath);

                  if(!dir.exists())

                  {

                            createDirectory( dir.getParentFile().getAbsolutePath() );

                            dir.mkdir();

                  }

}

4.删除文件目录 删除文件目录的模块代码,如程序3-29所示。该程序也是一个递归调用的过程,因为在目录的下面还可能包含其他的目录和文件,所以程序使用了一个for循环,依次删除子目录和文件。File类的delete方法只能删除该路径下的文件或者空目录,所以当判断子目录为文件目录时,需要递归调用deleteDirectory(File dir)函数方法,即下面程序代码中的deleteDirectory( children[i] );语句,最后遍历删除完该目录下的所有文件后,使用dir.delete()方法删除该空目录,完成文件目录删除的功能

程序3-29  删除文件目录

/**

* 递归删除特定的文件目录

*

* @param dir 需要删除的目录

*/

public static void deleteDirectory(File dir) {

                  if (dir == null || !dir.isDirectory()) return;

                 

                  File[] children = dir.listFiles();

                  if (children != null) {

                            for (int i=0; i<children.length; i++) {

                                     if ( children[i].isFile() ) {

                                              children[i].delete();

                                     } else if ( children[i].isDirectory() ) {

                                              deleteDirectory( children[i] );

                                     }

                            }

                  }

                  dir.delete();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值