20.01  递归概述和注意事项

递归:方法定义中调用方法本身的现象

递归注意事项:

1.要有出口,否则就是死递归

2.次数不能太多,否则就内存溢出

3.构造方法不能递归使用

20.02  递归求阶乘的代码实现及内存图解

例:

 public class Practice
{
public static void main(String[] args)
{
System.out.println(jieCheng(5));
}
public static int jieCheng(int i)
{
if(i == 1)
return 1;
else
return i * jieCheng(i - 1);
}
}

 

20.03  不死神兔问题案例

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?

第1个月:1    第2个月:1    第3个月:2   

第4个月:3    第5个月:5    第6个月:8

...

由此可见兔子对象的数据是:1,1,2,3,5,8...

规则:A:从第三项开始,每一项是前两项之和

     B:而且说明前两项是已知的

 public class Practice
{
public static void main(String[] args)
{
//方式1:数组实现
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for(int i = 2 ; i < arr.length; i++)
{
arr[i] = arr[i - 2] + arr[i - 1];
}
System.out.println(arr[19]);
System.out.println("------");
//方式2:变量的变化实现
int a = 1;
int b = 1;
for (int i = 0; i < 18; i++)
{
int temp = a;
a = b;
b = temp + b;
}
System.out.println(b);
System.out.println("------");
//方式3
System.out.println(sum(20));
}
//方式3:递归实现
public static int sum(int i)
{
if(i == 1 || i == 2)
return 1;
else
return sum(i - 1) + sum(i - 2);
}
}

20.04  递归输出指定目录下所有的java文件的绝对路径案例

 public class Practice
{
public static void main(String[] args)
{
File f = new File("E:\\javaSE");
getAllJavaFilePaths(f);
}
public static void getAllJavaFilePaths(File srcFolder)
{
// 获取该目录下所有的文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles(); // 遍历该File数组,得到每一个File对象
for (File file : fileArray)
{
// 判断该File对象是否是文件夹
if (file.isDirectory())
{
//如果是目录继续进入
getAllJavaFilePaths(file);
}
else
{
// 继续判断是否以.java结尾
if (file.getName().endsWith(".java"))
{
// 就输出该文件的绝对路径
System.out.println(file.getAbsolutePath());
}
}
}
}
}

20.05  递归删除带内容的目录案例

 public class Practice
{
public static void main(String[] args)
{
File f = new File("D:\\demo");
deleteFolder(f);
}
private static void deleteFolder(File srcFolder)
{
// 获取该目录下的所有文件或者文件夹的File数组
File[] fileArray = srcFolder.listFiles();
if (fileArray != null)
{
// 遍历该File数组,得到每一个File对象
for (File file : fileArray)
{
// 判断该File对象是否是文件夹
if (file.isDirectory())
{
deleteFolder(file);
}
else
{
file.delete();
System.out.println("删除文件:"+file.getName());
}
}
//删除文件夹
srcFolder.delete();
System.out.println("删除文件夹:"+srcFolder.getName());
}
}
}

20.06  IO流概述及分类

IO流用来处理设备之间的数据传输

Java对数据的操作是通过流的方式

Java用于操作流的对象都在IO包中

20.07  IO流基类概述

按照数据流向:输入流[读入数据]、输出流[写出数据]

按照数据类型:

字节流字节输入流[InputStream]、字节输出流[OutputStream]

字符流字符输入流[Reader]、字符输出流[Writer]

注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀

 

InputStream:此抽象类是表示字节输入流的所有类的超类。

OutputStream:此抽象类是表示输出字节流的所有类的超类。

Reader:用于读取字符流的抽象类。

Writer:写入字符流的抽象类。

20.08  FileOutputStream的构造方法

FileOutputStream的构造方法

public FileOutputStream(File file)throws FileNotFoundException

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

public FileOutputStream(String name)throws FileNotFoundException

创建一个向具有指定名称的文件中写入数据的输出文件流。

20.09  FileOutputStream写出数据

例:

 FileOutputStream fos = new FileOutputStream("D:\\a.txt");
fos.write("hello,IO".getBytes());
//释放资源,关闭此文件输出流并释放与此流有关的所有系统资源。
fos.close();

创建字节输出流对象了做了3件事情:

A:调用系统功能去创建文件

B:创建fos对象

C:把fos对象指向这个文件

字节输出流操作步骤:

A:创建字节输出流对象

B:写数据

C:释放资源

为什么一定要close()

A:让流对象变成垃圾,这样就可以被垃圾回收器回收了

B:通知系统去释放跟该文件相关的资源

20.10  FileOutputStream的三个write()方法

FileOutputStream 的方法:

1.public void write(int b)throws IOException

将指定字节写入此文件输出流。实现 OutputStream 的 write 方法。

2.public void write(byte[] b)throws IOException

将 b.length 个字节从指定 byte 数组写入此文件输出流中。

3.public void write(byte[] b,int off,int len)throws IOException

将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
FileOutputStream fos = new FileOutputStream("D:\\a.txt");
//写一个字节
fos.write(97);
byte[] bys = {97,98,99,100,101};
//写一个字节数组
fos.write(bys);
//写一个字节数组的一部分,从1开始写3个
fos.write(bys,1,3);
//释放资源
fos.close();
}
}

文件a.txt中的内容:aabcdebcd

20.11  FileOutputStream写出数据实现换行和追加写入

public FileOutputStream(String name,boolean append)throws FileNotFoundException

创建一个向具有指定 name 的文件中写入数据的输出文件流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
//true表示每次将内容写到文件的末尾
FileOutputStream fos = new FileOutputStream("D:\\a.txt",true);
for (int i = 0; i < 10; i++)
{
fos.write(("hello"+i).getBytes());
//写入换行符,不同系统下的换行符是不一样的,Windows下为\r\n
fos.write("\r\n".getBytes());
}
//释放资源
fos.close();
}
}

20.12  FileOutputStream写出数据异常处理

 public class Practice
{
public static void main(String[] args)
{
FileOutputStream fos = null;
try
{
fos = new FileOutputStream("D:\\a.txt");
fos.write("hello".getBytes());
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
//fos不是null才close()
if(fos != null)
{
//保证close一定会执行
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

20.13  FileInputStream读取数据

FileInputStream的构造方法

1.public FileInputStream(File file)throws FileNotFoundException

通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。

2.public FileInputStream(String name)throws FileNotFoundException

通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

 

FileInputStream的成员方法

1.public int read()throws IOException

从此输入流中读取一个数据字节。

2.public int read(byte[] b)throws IOException

从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
FileInputStream fis = new FileInputStream("D:\\a.txt");
// //读一个字节,没有数据返回-1
// int by = fis.read();
// System.out.println((char)by);
//循环读取
int ch = 0;
while((ch = fis.read()) != -1)
{
//此处如果读中文会出现乱码,因为一个汉字占用两个字节
System.out.print((char)ch);
}
fis.close();
}
}

20.14  字节流复制文本文件案例(一次读一个字节)

数据源:从哪里来  a.txt--读取数据--FileInputStream 

目的地:到哪里去  b.txt--写数据--FileOutputStream

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
// 封装数据源
FileInputStream fis = new FileInputStream("d:\\a.txt");
// 封装目的地
FileOutputStream fos = new FileOutputStream("d:\\b.txt"); int by = 0;
while ((by = fis.read()) != -1)
{
fos.write(by);
} // 释放资源
fos.close();
fis.close();
}
}

20.15  计算机是如何识别把两个字节拼接为中文

例:

 String s = "你好中国";
byte[] bys = s.getBytes();
System.out.println(Arrays.toString(bys));

运行结果:

[-60, -29, -70, -61, -42, -48, -71, -6]

上例中在GBK编码下将"你好中国"转为字节数组发现数组中的元素都是负数

在计算机中中文的存储分两个字节:

第一个字节肯定是负数。

第二个字节常见的是负数,可能有正数。但是没影响。

20.16  字节流复制图片案例

 public class Practice
{
public static void main(String[] args) throws IOException
{
FileInputStream fis = new FileInputStream("C:\\06.jpg");
FileOutputStream fos = new FileOutputStream("D:\\006.jpg"); int by = 0;
while((by = fis.read()) != -1)
{
fos.write(by);
} fis.close();
fos.close();
}
}

20.17  FileInputStream读取数据一次一个字节数组

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
FileInputStream fis = new FileInputStream("D:\\a.txt"); //数组的长度一般是1024或者1024的整数倍
byte[] bys = new byte[1024];
int len = 0;//定义一个变量用于接收读取的字节个数
while((len = fis.read(bys)) != -1)
{
//将数组的一部分转成字符串,因为数组不一定每次都是读满的
//读多少数据就转多少数据
//不需要换行符
System.out.print(new String(bys, 0, len)); }
//释放资源
fis.close();
}
}

20.18  字节流复制文本文件案例(一次读一个字节数组)

 public class Practice
{
public static void main(String[] args) throws IOException
{
//原数据
FileInputStream fis = new FileInputStream("D:\\a.txt");
//目的数据
FileOutputStream fos = new FileOutputStream("D:\\c.txt");
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1)
{
fos.write(bys, 0, len);
}
//释放资源
fis.close();
fos.close();
}
}

20.19  字节流复制视频案例

 public class Practice
{
public static void main(String[] args) throws IOException
{
//原数据
FileInputStream fis = new FileInputStream("C:\\test.flv");
//目的数据
FileOutputStream fos = new FileOutputStream("D:\\aaa.flv");
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1)
{
fos.write(bys, 0, len);
}
//释放资源
fis.close();
fos.close();
}
}

20.20  BufferedOutputStream写出数据

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式),所以提供了字节缓冲区流

字节缓冲输出流:BufferedOutputStream

字节缓冲输入流:BufferedInputStream

 

BufferedOutputStream构造方法:

1.public BufferedOutputStream(OutputStream out)

创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

2.public BufferedOutputStream(OutputStream out,int size)

创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
FileOutputStream fos = new FileOutputStream("D:\\a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//写数据
bos.write("hello".getBytes());
//关闭资源
bos.close();
}
}

20.21  BufferedInputStream读取数据

例:

 public class Practice
{
public static void main(String[] args) throws IOException
{
BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream("D:\\a.txt"));
//方式1:读一个字节
int by = 0;
while((by = bis1.read()) != -1)
{
System.out.print((char)by);
}
System.out.println("------");
//方式2:读一个字节数组
BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream("D:\\a.txt"));
byte[] bys = new byte[1024];
int len = 0;
while((len = bis2.read(bys)) != -1)
{
System.out.println(new String(bys, 0, len));
} bis1.close();
bis2.close();
}
}

20.22  字节流四种方式复制MP4并测试效率

基本字节流一次读写一个字节        //耗时:103891毫秒

基本字节流一次读写一个字节数组   //耗时:1110毫秒

高效字节流一次读写一个字节        //耗时:1547毫秒

高效字节流一次读写一个字节数组   //耗时:953毫秒

 public class Practice
{
public static void main(String[] args) throws IOException
{
long time1 = System.currentTimeMillis();
// method1("C:\\test.flv","D:\\test1.flv");
// method2("C:\\test.flv","D:\\test2.flv");
// method3("C:\\test.flv","D:\\test3.flv");
method4("C:\\test.flv","D:\\test4.flv");
long time2 = System.currentTimeMillis();
System.out.println("耗时:"+(time2 - time1)+"毫秒");
}
//基本字节流一次读写一个字节
//耗时:103891毫秒
public static void method1(String src,String dest) throws IOException
{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest); int by = 0;
while((by = fis.read()) != -1)
{
fos.write(by);
} fis.close();
fos.close();
}
//基本字节流一次读写一个字节数组
//耗时:1110毫秒
public static void method2(String src,String dest) throws IOException
{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest); byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1)
{
fos.write(bys,0,len);
} fis.close();
fos.close();
}
//高效字节流一次读写一个字节
//耗时:1547毫秒
public static void method3(String src,String dest) throws IOException
{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest)); int by = 0;
while ((by = bis.read()) != -1)
{
bos.write(by);
} bos.close();
bis.close();
}
//高效字节流一次读写一个字节数组
//耗时:953毫秒
public static void method4(String src,String dest) throws IOException
{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest)); byte[] bys = new byte[1024];
int len = 0;
while ((len = bis.read(bys)) != -1)
{
bos.write(bys, 0, len);
} bos.close();
bis.close();
}
}

JavaSE学习总结第20天_IO流2的更多相关文章

  1. JavaSE学习总结第21天_IO流3

      21.01  转换流出现的原因及格式 由于字节流操作中文不是特别方便,所以,java就提供了转换流. 字符流 = 字节流 + 编码表 21.02  编码表概述和常见编码表 编码表:计算机只能识别二 ...

  2. JavaSE学习总结第19天_IO流1

      19.01  集合的特点和数据结构总结 HashSet.HashMap.Hashtable判断元素唯一性的方式: 通过对象的hashCode和equals方法来完成元素唯一性 如果对象的hashC ...

  3. JavaSE学习总结第22天_IO流4

    -  22.01  数据输入输出流的概述和讲解 操作基本数据类型 public class DataInputStreamextends FilterInputStream implements Da ...

  4. javaSE学习笔记(15) ---缓冲流、转换流、序列化流

    javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...

  5. 毕向东_Java基础视频教程第20天_IO流(15~17)

    第20天-15-IO流(打印输出流) 打印输出流:PrintWriter与PrintStream 两者的区别:Since JDK 1.4 it's possible to specify the ch ...

  6. 毕向东_Java基础视频教程第20天_IO流(11~14)

    第20天-11-IO流(Properties简述) .properties是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名.它们也可以存储用于国际化和本地化的字符串,这种文 ...

  7. 毕向东_Java基础视频教程第20天_IO流(7~10)

    第20天-07-IO流(递归) package bxd; import java.io.File; public class FileDemo3 { // 非递归打印 public static vo ...

  8. 毕向东_Java基础视频教程第20天_IO流(5~6)

    第20天-05-IO流(文件列表一) static File[] listRoots() List the available filesystem roots. String[] list() Re ...

  9. 毕向东_Java基础视频教程第20天_IO流(1~4)

    第20天-01-IO流(File概述) File类: 用来将文件或者文件夹封装成对象, 方便进行操作. File对象可以作为参数, 传递给流对象的构造函数. 流对象不能操作文件夹; 流对象不能操作文件 ...

随机推荐

  1. PADS Layout怎样放置间距一样的同一种元件

    少数元件的话,栅格设置是最好的,即将栅格设置成你要放置元件的间距,然后逐个移动元件放置.如果元件几十上百个,这样做就累死人了,此时就得设置阵列.按顺序选择你要放置的元件-右键-create arry, ...

  2. [置顶] SpecDD(混合的敏捷方法模型)主要过程概述

    敏捷已成为当今使用最广泛的开发方法.有趣的是,敏捷方法的流行性并不是因为它取代了其他开发方法,相反它与这些方法进行了更好地融合.现实世界众多敏捷项目的成功,也证明了敏捷将走向杂化的未来. SpecDD ...

  3. 怎样用U盘安装Ubuntu系统/ubuntu系统怎么安装

    Linux一直以来都是比较小众的系统,特别是在国内,用户相对Windows来说,更是少,甚至给人一种高端,复杂的印象,不过这些年来,使用 linux的人越来越多了,基本用的都是程序猿,而Ubuntu作 ...

  4. Linux下smi/mdio总线驱动

    Linux下smi/mdio总线驱动 韩大卫@吉林师范大学 MII(媒体独立接口), 是IEEE802.3定义的以太网行业标准接口, smi是mii中的标准管理接口, 有两跟管脚, mdio 和mdc ...

  5. ios蓝牙开发(一)蓝牙相关基础知识

    蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0 ...

  6. TreeSet两种比较

    TreeSet底层数据结构是二叉树 判断对象是否一致是通过是对象自身有比较的方法,即使类实现Comparable接口,重写compareTo方法,自己定义比较规则, 若是不想用元素本身的比较方法,又不 ...

  7. Lucence.Net学习+盘古分词

    创建索引库          //读取文件,存储到索引库           public string CreateDatebase()         {         //获取索引库的路径   ...

  8. JS 获取浏览器窗口大小clientWidth、offsetWidth、scrollWidth

    常用: JS 获取浏览器窗口大小   // 获取窗口宽度 if (windows.innerWidth) winWidth = windows.innerWidth; else if ((docume ...

  9. 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)

    五.数据运算与数据运算符 1.算术运算符 算术运算符 运算符 描述 示例 + 加法 >>> 14 - 5 9 - 减法 >>> 14 - 5 9  *  乘法 &g ...

  10. 全新安装mysql最新版本

    写在前面: 下面写的东西只是最近安装的一个说明,是在系统中没存在mysql的情况下安装的,后期会根据官方文档写一个详细有价值的文档 安装原理:利用mysql官方的mysql_apt-repositor ...