集合框架

1 使用commons-io API输出一个目录中所有扩展名为.jar的文件

使用commons-io API输出当前目录及其子目录下,所有扩展名为.jar的文件。

参考答案

实现此案例需要按照如下步骤进行。

步骤一:构建测试方法

首先,创建CommonsFile类,并在类中新建测试方法testListFiles,代码如下所示:

 
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Collection;
  4. import org.apache.commons.io.FileUtils;
  5. import org.junit.Test;
  6. public class CommonsFile {
  7.     /**
  8.      *使用commons-io API输出一个目录中所有扩展名为.txt的文件
  9.      */
  10.     @Test
  11.     public void testListFiles() throws IOException{
  12.         
  13.     }
  14. }

步骤二:获取当前目录下的扩展名为.jar的文件

首先,使用File类构建表示当前目录的file对象;然后,使用File类的listFiles方法获取当前目录下的扩展名为.jar的文件;最后,遍历listFiles方法返回的数组查看当前目录下的内容,代码如下所示:

 
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Collection;
  4. import org.apache.commons.io.FileUtils;
  5. import org.junit.Test;
  6. public class CommonsFile {
  7.     /**
  8.      *使用commons-io API输出一个目录中所有扩展名为.txt的文件
  9.      */
  10.     @Test
  11.     public void testListFiles() throws IOException{
  12.         File file = new File(".");
  13.         Collection<File> files=FileUtils.listFiles(file, new String[]{"jar"}, true);
  14.         for (File f : files) {
  15.             System.out.println(f);
  16.         }
  17.     }
  18. }

此处使用了listFiles方法,该方法有三个参数,第一个参数表示要搜索的目录;第二参数表示扩展名的数组,例如: {"java","xml"},如果这个参数为null,那么将不进行过滤,返回的所有文件;第三个参数表示是否进行递归读取,如果为true,那么所有的子目录将被搜索。

本案例的完整代码如下所示:

2 简述RAF的两种创建模式

参考答案

RandomAccessFile在对文件进行随机访问操作时有两个模式,分别为只读模式(只读取文件数据),和读写模式(对文件数据进行读写)。

3 简述RandomAccessFile类的read方法和write方法使用int类型存储byte数据的方式和原因

参考答案

1)RandomAccessFile提供了一个可以从文件中读取字节的方法:

  1. int read()

该方法会从文件中读取一个byte(8位) 填充到int的低八位, 高24位为0, 返回值范围正数: 0~255, 如果返回-1表示读取到了文件末尾! 每次读取后自动移动文件指针, 准备下次读取。

2)RandomAccessFile提供了一个可以向文件中写出字节的方法:

 
  1. void write(int d)

该方法会根据当前指针所在位置处写入一个字节,是将参数int的”低8位”写出。

3)使用int类型存储byte数据,这是因为,RandomAccessFile类的read方法,能读到的数据有257个数值,其中,0到255表示数据,-1表示读取到了文件末尾。而write方法与read方法是一对方法,因此write方法也采用了int类型。

4 实现文件的复制功能

使用RandomAccessFile类的read(byte[])方法和write(byte[])方法实现文件复制。

参考答案

实现此案例需要按照如下步骤进行。

步骤一:新建TestRandomAccessFileCopy类,添加测试方法testCopyFile方法

首先新建类TestRandomAccessFileCopy,然后在该类中添加测试方法testCopyFile,代码如下所示:

 
  1. import org.junit.Test;
  2. /**
  3. * 测试文件复制
  4. */
  5. public class TestRandomAccessFileCopy {
  6.     
  7.     /**
  8.      * 测试使用字节数组形式复制文件
  9.      */
  10.     @Test
  11.     public void testCopyFile()throws Exception{
  12.     }
  13. }

步骤二:实现文件复制

首先,分别创建只读模式的RandomAccessFile类的对象和读写模式的RandomAccessFile类的对象;然后,使用循环。在循环中,使用RandomAccessFile类的read(byte[])方法从文件raf.dat中读取数据;使用RandomAccessFile类的write(byte[])方法将读取到的数据写入raf_copy.dat文件中,直到read方法返回-1,则退出循环;最后,将RandomAccessFile类的对象关闭,以释放资源,代码如下所示:

 
  1. import java.io.RandomAccessFile;
  2. import org.junit.Test;
  3. /**
  4. * 测试文件复制
  5. */
  6. public class TestRandomAccessFileCopy{
  7.     
  8.     /**
  9.      * 测试使用字节数组形式复制文件
  10.      */
  11.     @Test
  12.     public void testCopyFile()throws Exception{
  13.         RandomAccessFile rafRead = new RandomAccessFile("raf.dat", "r");
  14.         RandomAccessFile rafWrite = new RandomAccessFile("raf_copy.dat", "rw");
  15.         
  16.         int len = -1;
  17.         byte[] buf = new byte[1024];
  18.         while((len = rafRead.read(buf)) != -1){
  19.             rafWrite.write(buf,0,len);
  20.         }
  21.         System.out.println("复制完毕");
  22.         rafRead.close();
  23.         rafWrite.close();
  24.     }
  25. }

运行testCopyFile方法,在当前工程下生成了文件raf_copy.dat,该文件的内容与文件raf.dat的内容相同。

本案例的完整代码如下所示:

 
  1. import java.io.RandomAccessFile;
  2. import org.junit.Test;
  3. /**
  4. * 测试文件复制
  5. */
  6. public class TestRandomAccessFileCopy {
  7.     
  8.     /**
  9.      * 测试使用字节数组形式复制文件
  10.      */
  11.     @Test
  12.     public void testCopyFile()throws Exception{
  13.         RandomAccessFile rafRead = new RandomAccessFile("raf.dat", "r");
  14.         RandomAccessFile rafWrite = new RandomAccessFile("raf_copy.dat", "rw");
  15.         
  16.         int len = -1;
  17.         byte[] buf = new byte[1024];
  18.         while((len = rafRead.read(buf)) != -1){
  19.             rafWrite.write(buf,0,len);
  20.         }
  21.         System.out.println("复制完毕");
  22.         rafRead.close();
  23.         rafWrite.close();
  24.     }
  25. }

5 文件信息如下所示,下面代码的输出结果是?

请看raf.dat文件的内容如下:

 
  1. Welcome,NEWYORK

以上字符都为英文字符,请看下列代码的输出结果是:()。

 
  1.         RandomAccessFile raf = new RandomAccessFile("raf.dat", "r");
  2.         raf.skipBytes(8);
  3.         byte[] buf = new byte[7];
  4.         raf.read(buf);
  5.         System.out.println(new String(buf));
  6.         raf.close();

参考答案

上述代码的输出结果为:NEWYORK。

在上述代码中,将文件指针使用 RandomAccessFile类的skipBytes方法跳过了8个字节。跳过了8个字节后,再读取raf.dat文件剩余的内容,该内容为NEWYORK。

posted @ 2018-01-22 20:18  清风已来  阅读(246)  评论(0编辑  收藏  举报