问答总结:
1.判断使用字节流还是字符流?
除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
2.为什么要close()
让对象变成垃圾,系统释放资源
3.字节输出流如何实现数据的换行?
fos.write("\r\n".getBytes());
4.写入数据时如果没有文件,系统会自动创建,但是读取数据没有文件,会报错。
5.如何实现数据的追加写入(将字节/字符写入文件末尾处,而不是写入文件开始处)?
FileOutputStream fos=new FileOutputStream("fos.txt",true);创建对象是加true
6.缓冲区流为什么不传递一个具体的文件或者文件路径,而是一个流对象呢?
字节缓冲区流仅仅提供缓冲区,为高效而设计的,真正的读写操作还是的靠基本的流对象实现。
7. 字符流close 和flush的区别
A:close()关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续在使用了。
B:flush()仅仅刷新缓冲区,刷新之后流对象还可以继续使用。
8.字符流复制文本文件5种方式的效率:BufferedReader一次读取一个字符数组>FIleReader一次读取一个字符数组>BufferedReader一次读取一个字符>BufferedReader的readLine()和newLIne()方法结合>FileReader一次读取一个字符
递归:程序/方法调用其本身的现象叫递归,在IO流中递归的用法比如在一个文件夹中有很多文件和文件夹,如果要找出所有的文件可以选择用循环的方法,但是代码的复杂度就会提高很多,因此递归是更好的方法。
题目:复制指定目录下(E:\\File)的指定后缀名的文件(.java)并修改名称(.jad)到其他文件夹下(E:\\MyFile)
public class CopyFolderDemo {
public static void main(String[] args) throws IOException {
//定义数据源
File srcFolder=new File("E:\\File");
//定义目的地
File destFolder=new File("E:\\MyFile");
//判断目的地文件夹是否存在,否就创建。这里用到了File类的创建文件和文件夹的功能。除此File类还包含有判断和获取功能
if(!destFolder.exists()){
destFolder.mkdir();
}
/*区别:仅仅需要名称用list,需要获取文件,使用文件File的功能用listFiles
* Public String[] list();获取指定目录下所有文件或者文件夹的名称数组
* Public File[] listFiles();获取指定目录下的所有文件或者文件夹的file文件数组
*其中如果是空的构造方法,则表示接受所有路径名。但是通过匿名内部类实现FilenameFilter接口,调用accept方法测试指定
*文件是否应该包含在某一文件列表中,这个叫做文件名过滤器
* Public String[] list(FilenameFilter filter);
* Public File[] listFiles(FilenameFilter filter);
*/
//获取数据源目录下的file文件数组
File[] fileArray=srcFolder.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
//返回所有以.java结尾的文件
return new File(dir,name).isFile()&&name.endsWith(".java");
}
});
//增强for循环遍历该数组得到每一个对象
for(File file:fileArray){
//遍历得到的是文件的绝对路径,File类的getName()方法得到文件名
String name=file.getName();
//在目的地文件夹下复制同名文件
File newFille=new File(destFolder,name);
copyFile(file,newFille);
}
//在目的地目录下改名
File[] destFileArray=destFolder.listFiles();
for(File destFile:destFileArray){
String name=destFile.getName();
String newName=name.replaceAll(".java", ".jad");
File newFile=new File(destFolder,newName);
destFolder.renameTo(newFile);//File类的重命名功能
}
}
//字节缓冲流一次读取一个字节数组复制文件
private static void copyFile(File file, File newFile) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile));
byte[] bys=new byte[1024];
int len=0;
while((len=bis.read(bys))!=-1){
//每读取1024个字节就写入,读的长度和写的长度相等
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
}
总结:IO流部分的内容都是零碎的点,总结起来感觉不知道从哪开始,还需要不断深化。