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

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

参考答案

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

步骤一:构建测试方法

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

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class CommonsFile {
	/**
	 *使用commons-io API输出一个目录中所有扩展名为.txt的文件
	 */
	@Test
	public void testListFiles() throws IOException{
		
	}
}

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

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

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class CommonsFile {
	/**
	 *使用commons-io API输出一个目录中所有扩展名为.txt的文件
	 */
	@Test
	public void testListFiles() throws IOException{
#cold_bold		File file = new File(".");
#cold_bold		Collection<File> files=FileUtils.listFiles(file, new String[]{"jar"}, true);
#cold_bold		for (File f : files) {
#cold_bold			System.out.println(f);
#cold_bold		}
	}
}

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

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

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class CommonsFile {
	/**
	 *使用commons-io API输出一个目录中所有扩展名为.txt的文件
	 */
	@Test
	public void testListFiles() throws IOException{
		File file = new File(".");
		Collection<File> files=FileUtils.listFiles(file, new String[]{"jar"}, true);
		for (File f : files) {
			System.out.println(f);
		}
	}
}

2 简述RAF的两种创建模式

参考答案

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

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

参考答案

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

int read() 

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

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

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,代码如下所示:

import org.junit.Test;

/**
 * 测试文件复制
 */
public class TestRandomAccessFileCopy {
	
	/**
	 * 测试使用字节数组形式复制文件
	 */
	@Test
	public void testCopyFile()throws Exception{
	}
}

步骤二:实现文件复制

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

import java.io.RandomAccessFile;

import org.junit.Test;

/**
 * 测试文件复制
 */
public class TestRandomAccessFileCopy{
	
	/**
	 * 测试使用字节数组形式复制文件
	 */
	@Test
	public void testCopyFile()throws Exception{
#cold_bold		RandomAccessFile rafRead = new RandomAccessFile("raf.dat", "r");
#cold_bold		RandomAccessFile rafWrite = new RandomAccessFile("raf_copy.dat", "rw");
#cold_bold		
#cold_bold		int len = -1;
#cold_bold		byte[] buf = new byte[1024];
#cold_bold		while((len = rafRead.read(buf)) != -1){
#cold_bold			rafWrite.write(buf,0,len);
#cold_bold		}
#cold_bold		System.out.println("复制完毕");
#cold_bold		rafRead.close();
#cold_bold		rafWrite.close();
	}
}

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

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

import java.io.RandomAccessFile;
import org.junit.Test;

/**
 * 测试文件复制
 */
public class TestRandomAccessFileCopy {
	
	/**
	 * 测试使用字节数组形式复制文件
	 */
	@Test
	public void testCopyFile()throws Exception{
		RandomAccessFile rafRead = new RandomAccessFile("raf.dat", "r");
		RandomAccessFile rafWrite = new RandomAccessFile("raf_copy.dat", "rw");
		
		int len = -1;
		byte[] buf = new byte[1024];
		while((len = rafRead.read(buf)) != -1){
			rafWrite.write(buf,0,len);
		}
		System.out.println("复制完毕");
		rafRead.close();
		rafWrite.close();
	}
}

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

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

Welcome,NEWYORK

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

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

参考答案

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

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