java基础第十五篇之IO流和递归算法
FileInputStream:输入流
intavailable():一次读取所有的字节数
read():将文件上的字节读取到内存的数组中
FileOutputStream:输出流
write(byte[]b):将字节数组中的字节数据写到文件上
缓冲区会在内存中创建一个8192容量的字节数组,内存的运算效率比硬盘要高的多所有只要降低到硬盘的读写次数就会提高效率.
定义小数组的标准格式:进行读写字节数据,要比缓冲流快一点点,因为定义小数组是操作一个的是一个数组,而缓冲流操作的是两个数组.
publicclassDemo3_ArrayCopy{
publicstaticvoidmain(String[]args)throwsIOException{
//method();
//method2();
FileInputStreamfis=newFileInputStream("韩雪-想起.mp3");
FileOutputStreamfos=newFileOutputStream("Copy.mp3");
byte[]arr=newbyte[1024*8];
intlen;
while((len=fis.read(arr))!=-1){
fos.write(arr,0,len);
}
fis.close();
fis.close();
}
close方法:具备刷新的功能,在关闭流之前,就会先刷新一次缓冲区,将缓冲区的字节全都刷新到文件上.
*flush:具备刷新的功能,刷完之后还可以继续写.
*字节流读取中文的问题:字节流在读中文的时候有可能会读到半个中文,造成乱码.
*字节流写中文的问题:字节流直接操作字节,所有写出中文比较将字符串转换成字节数组
*写出回车换行write("\r\n".getBytes());
//这是1.6版本以及以前的标准处理异常代码
privatestaticvoidmethod()throwsFileNotFoundException,IOException{
//为什么要加null?这里是局部变量,所有必须要赋值.
FileInputStreamfis=null;
FileOutputStreamfos=null;
try{
fis=newFileInputStream("xxx.txt");
fos=newFileOutputStream("yyy.txt");
intb;
while((b=fis.read())!=-1){
fos.write(b);
}
}finally{
//tryfinally的嵌套目的是能关一个就尽量关一个
try{
if(fis!=null){
fis.close();
}
}finally{
if(fos!=null){
fos.close();
}
}
}
}
}
///这些抽象类具备自动关闭功能,只要实现了AutoCloseable就具备了,自动关闭释放流的功能
//这是jdk1.7版本的标准异常处理代码
原理:在try()中创建的流对象必须实现了AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后就会自动调用流对象的close方法将流关闭释放.
try(
//这些抽象类具备自动关闭功能,只要实现了AutoCloseable就具备了,自动关闭释放流的功能
FileInputStreamfis=newFileInputStream("xxx.txt");
FileOutputStreamfos=newFileOutputStream("yyy.txt");
MyClosemc=newMyClose();
){
intb;
while((b=fis.read())!=-1){
fos.write(b);
}
/*FileInputStreamfis=newFileInputStream("xxx.txt");
FileOutputStreamfos=newFileOutputStream("yyy.txt");*/
}
/*fis.close();
fos.close();*/
}
/*
*图片加密
*将写出的字节异或上一个数,这个数就是密钥,解密的时候再次异或就可以了.
*/
publicclassTest1{
publicstaticvoidmain(String[]args)throwsIOException{
BufferedInputStreambis=newBufferedInputStream(newFileInputStream("2017619-星期一-141543.jpg"));
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("Copy.jpg"));
intb;
while((b=bis.read())!=-1){
//运算符^异或两次就是他本身,所有这里异或一次,进行加密
bos.write(b^123);
}
bis.close();
bos.close();
}
//解密
/*BufferedInputStreambis=newBufferedInputStream(newFileInputStream("Copy.jpg"));
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("Copy2.jpg"));
intb;
while((b=bis.read())!=-1){
//运算符^异或两次就是他本身,所有这里异或一次,进行加密
bos.write(b^123);
}
bis.close();
bos.close();
*
*
*/
}
*在控制台录入文件的路径,将文件拷贝到当前项目下
*
*分析:
*
*1.创建键盘录入对象,定义方法对键盘录入的路径进行判断,如果是文件就返回
*2.在主方法中接收该文件
*3.读和写该文件
*
*
*/
publicclassTest2{
publicstaticvoidmain(String[]args)throwsIOException{
//获取文件
Filefile=getFile();
BufferedInputStreambis=newBufferedInputStream(newFileInputStream(file));
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(file.getName()));
intb;
while((b=bis.read())!=-1){
bos.write(b);
}
bis.close();
bos.close();
}
/*
*定义一个方法获取键盘录入的文件路径,并封装成File对象返回
*1.返回值类型File
*2.参数列表无
*
*/
publicstaticFilegetFile(){
Scannersc=newScanner(System.in);
//接收键盘录入路径
//Stringline=sc.nextLine();
System.out.println("请输入一个文件的路径");
while(true){
Stringline=sc.nextLine();
//封装成File对象,并对其进行判断
Filefile=newFile(line);
if(!file.exists()){
System.out.println("您录入的文件路径不存在,请重新录入:");
}elseif(file.isDirectory()){
System.out.println("请录入的是文件夹路径,请重新录入");
}else{
returnfile;
}
}
}
}
/*
*键盘录入的数据拷贝到当前项目下的text.txt文件中,键盘录入数据当遇到quit时就退出
*
*分析:
*1.创建键盘录入对象
*2.创建输出流对象,关联text.txt文件
*3.定义无限循环
*4.遇到quit退出循环
*5.如果不quit,就将内容写出
*6.关闭流
*
*/
publicclassTest3{
publicstaticvoidmain(String[]args)throwsIOException{
//1.创建键盘录入对象
Scannersc=newScanner(System.in);
//2.创建输出流对象,关联text.txt文件
FileOutputStreamfos=newFileOutputStream("text.txt");
System.out.println("请输入数据");
//3.定义无限循环
while(true){
Stringlin=sc.nextLine();
//4.遇到quit退出循环
if("quit".equals(lin)){
break;
}
//5.如果不quit,就将内容写出
//字符串写出鼻血转换成字节数组
fos.write(lin.getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
}
}
*/
/*
*从键盘录入一个文件夹路径,统计该文件夹大小
*
*从键盘录入一个文件夹路径
*1.一个无限循环
*2.定义一个无限循环
*3.将奖品录入的结果存储并封装成File对象
*4.对File对象判断
*5.将文件夹路径对象返回
*
*统计该文件夹大小
*1.定义一个求和变量
*2.获取该文件夹下所有的文件和文件夹ListFiles();
*3.遍历数组
*4.判断是文件就计算大小并累加
*5.判断是文件夹,递归调用
*
*/
publicclassTest1{
publicstaticvoidmain(String[]args){
/*Filedir=getDir();
System.out.println(getFileLength(dir));*/
//直接获取文件的大小是0
Filedir=newFile("F:\\day06");
System.out.println(dir.length());
}
/*
*从键盘录入接收一个文件夹路径
*1.返回值类型File
*2.参数列表无
*
*/
publicstaticFilegetDir(){
//1.创建键盘录入对象
Scannersc=newScanner(System.in);
System.out.println("请输入一个文件夹路径:");
//2.循环
while(true){
//将键盘录入的结果存储并封装成File对象
Stringline=sc.nextLine();
Filedir=newFile(line);
//对File对象判断
if(!dir.exists()){
System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
}elseif(dir.isFile()){
System.out.println("您录入的是文件路径,请输入一个文件夹路径:");
}else{
//将文件夹路径对象返回
returndir;
}
}
}
/*
*统计该文件夹大小
*1.返回值类型long
*2.参数列表File
*
*/
publicstaticlonggetFileLength(Filedir){
//1.定义一个求和变量
longlen=0;
//2.获取该文件夹下所有的文件和文件夹ListFiles();
File[]subFiles=dir.listFiles();
//3.遍历数组
for(FilesubFile:subFiles){
//4.判断是文件就计算大小并累加
if(subFile.isFile()){
len=len+subFile.length();
//5.判断是文件夹,递归调用
}else{
len=len+getFileLength(subFile);
}
}
returnlen;
}
}
*/
/*
/*从键盘接收一个文件夹路径,删除该文件夹
*
*删除该文件夹
*分析:
*1.获取该文件夹下的所有的文件和文件夹
*2.遍历数组
*3.判断是文件直接删除
*4.如果是文件夹,递归调用
*5.循环结束后,把空文件夹删掉
*
*/
publicclassTest2{
publicstaticvoidmain(String[]args){
//获取文件夹路径
Filedir=Test1.getDir();
deleteFile(dir);
}
/*
*删除该文件夹
*1.返回值类型void
*2.参数列表:Filedir
*
*/
publicstaticvoiddeleteFile(Filedir){
//1.获取该文件夹下的所有的文件和文件夹
File[]subFiles=dir.listFiles();
//2.遍历数组
for(FilesubFile:subFiles){
//3.判断是文件直接删除
if(subFile.exists()){
subFile.delete();
//4.如果是文件夹,递归调用
}else{
deleteFile(subFile);
}
}
//5.循环结束后,把空文件夹删掉
dir.delete();
}
}
/*
*从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
*
*分析:
*1.在目标文件夹中创建原文件夹
*2.获取原文件夹中所有的文件和文件夹,存储在File数组中
*3.遍历数组
*4.如果是文件就用io流读写
*5.如果是文件夹就递归调用
*
*/
publicclassTest3{
publicstaticvoidmain(String[]args)throwsIOException{
Filesrc=Test1.getDir();
Filedest=Test1.getDir();
if(src.equals(dest)){
System.out.println("目标文件夹是原文件夹的子文件夹");
}else{
copy(src,dest);
}
}
/*把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
*1.返回值类型void
*2.参数列表:Filesrc,Filedest
*
*/
publicstaticvoidcopy(Filesrc,Filedest)throwsIOException{
//1.在目标文件夹中创建原文件夹
FilenewDir=newFile(dest,src.getName());
newDir.mkdir();
//2.获取原文件夹中所有的文件和文件夹,存储在File数组中
File[]subFiles=src.listFiles();
//3.遍历数组
for(FilesubFile:subFiles){
if(subFile.isFile()){
BufferedInputStreambis=newBufferedInputStream(newFileInputStream(subFile));
BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(newFile(newDir,subFile.getName())));
intb;
while((b=bis.read())!=-1){
bos.write(b);
}
bos.close();
bis.close();
}else{
copy(subFile,newDir);
}
}
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56952.shtml