package com.itheima;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/** * 第七题:已知文件a.txt文件中的内容为“bcdeadferwplkou”, * 请编写程序读取该文件内容,并按照自然顺序排序后输出到b.txt文件中。 * 即b.txt中的文件内容应为“abcd…………..”这样的顺序。 * *//**
* 思路:
1.创建一个List集合
* 2.将原文件中的字母添加到集合中
* 3.使用Collections工具类的sort方法 对List集合进行排序
* 4.将集合中的元素写入目标文件中
*
*/
/**
* Test7类
* 实现题目需求
* sortAndCopyFile()方法:将原文件中的内容排序后复制到目标文件中
* write2File()方法:将排序后的List集合中的元素写入目标文件中
* getList()方法:将原文件中的字母添加到集合中并对集合排序后返回集合对象。
* getOutputStream():获取指定目标文件的输出流
*/
public class Test7 {
/**
* 将原文件中的内容排序后复制到目标文件中
* @param srcFilePath 原文件路径
* @param destFilePath 目标文件路径
*/
public static void sortAndCopyFile(String srcFilePath,String destFilePath) {
//获取对原文件内容排序后的List集合
List<Character> list = getList(srcFilePath);
//获取指定目标文件的输出流
OutputStream ops = getOutputStream(destFilePath);
//将集合中的元素写入目标文件中
write2File(list,ops);
}
/**
* 将原文件中的字母添加到集合中并对集合排序后返回集合对象。
* 实现步骤一,二,三
* @param srcFilePath 原文件路径
* @return 返回已排序的List集合
*/
private static List<Character> getList(String srcFilePath) {
FileInputStream fis =null;
BufferedReader br = null;
/*步骤一:创建一个List集合*/
List<Character> list = new ArrayList<Character>();;
try {
fis = new FileInputStream(srcFilePath);
br = new BufferedReader(new InputStreamReader(fis));
int b = -1;
while((b=br.read())!=-1) {
char ch = (char)b;
/*步骤二:将文件中的字母添加到集合中*/
list.add(ch);
}
} catch (FileNotFoundException e) {
new RuntimeException("文件没有找到!");
} catch (IOException e) {
new RuntimeException("文件读取失败!");
}finally {
try {
if(br!=null)
br.close();
} catch (IOException e) {
new RuntimeException("读取流关闭失败!");
}
}
/*步骤三:使用Collections工具类的sort方法 对List集合进行排序*/
Collections.sort(list);
return list;
}
/**
* 获取指定目标文件的输出流
* @param destFilePath 目标文件路径
* @return 返回指定目标文件的输出流
*/
private static OutputStream getOutputStream(String destFilePath) {
//创建目标文件对象
File file = new File(destFilePath);
//如果目标文件不存在,程序终止
if(!file.exists())
throw new RuntimeException("文件不存在");
OutputStream output= null;
try {
//获取指定目标文件的输出流
output = new FileOutputStream(file);
} catch (FileNotFoundException e) {
new RuntimeException("文件没有找到!");
}
return output;
}
/**
* 将集合中的元素写入目标文件中
* 实现步骤四
* @param list 对文件内容进行排序的集合
* @param ops 指定目标文件的输出流
*/
private static void write2File(List<Character> list,OutputStream ops) {
/*为了提高效率使用缓冲写入流*/
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ops));
try {
//遍历List集合,也可使用迭代器,将List集合中的元素写入目标文件中
for(char ch : list) {
System.out.println(ch);
/*第四步:将集合中的元素写入缓冲写入流中,通过缓冲流的刷新写入到文件中*/
bw.write(ch);
}
} catch (IOException e) {
new RuntimeException("写入文件失败!");
}finally {
/*关闭流资源并刷新缓冲写入流,需要异常处理*/
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
new RuntimeException("写入流关闭失败!");
}
}
}
/**
* 主函数进行功能测试
* 指定已知文件路径srcFilePath和目标文件路径destFilePath
* 调用sortAndCopyFile方法将已知文件内容按需求复制到目标文件中
*/
public static void main(String[] args) {
//定义已知文件路径
String srcFilePath = "src\\com\\itheima\\resources\\a.txt";
//定义目标文件路径
String destFilePath = "src\\com\\itheima\\resources\\b.txt";
//功能测试,已知文件内容按需求复制到目标文件中
sortAndCopyFile(srcFilePath,destFilePath);
}
}
以上代码是我做的一个考试题,但是我总感觉我有什么地方用的比较麻烦,哪位高手帮我看看,能不能让代码更优化,高效。。小弟感激不尽!
|