Java必须了解的“递归”与“IO流”!!!
>>>First:
递归!
1. 定义: 在函数自身内部,调用函数本身的方式,称为递归。
2. 注意: 递归包括递进去、归出来两步。
首先,依次执行【函数调自身语句】上半部分的代码,直到最里层;{ 递进去 }
然后,再从最里层开始,依次执行【函数调自身语句】下半部分的代码。{ 归出来 }
3. 下面用示意图来分析一下:
!!!递归必须通过合适的语句,及时的跳出,否则容易造成死循环。
4. 用一个例子帮助你理解递归的用法:
用递归实现一个数的阶乘
首先,定义一个jiecheng类:
方法一:
方法二:
其次,在main方法中输出:
运行验证:以5的阶乘为例输出结果
以上便是关于递归的基础知识,So easy,看到这想必就已经学会了!再来看一下今天下一个主角:
>>>Second:
IO流
1、I/O流分类:
根据流的方向:输入流和输出流
根据读取文字的大小:字节流和字符流
(字节流按字节读取,读取中文时容易乱码;字符流按照字符读取,通常用于读取中文)
根据读取的方式:节点流和缓存流
2、读取文件内容:(3种方法 ↓↓↓)
FileInputStream fis = new FileInputStream("F:/test.txt");
StringBuffer sb = new StringBuffer();
① 按照字节,一个一个字节读取文件
② 将byte数组直接声明为输入流的长度,一次性读出所有文字
③ 一次性读取1024个字节
3、写入新文件:
// FileOutputStream fos = new FileOutputStream("F:/out.txt",true);
如果第二个参数省略,或传入false,则表示每次写入时将原文件清空,从文件头部开始写入;
如果第二个参数传入true,则表示不清空原文件,在文件末尾处添加新内容。
FileOutputStream fos = new FileOutputStream("F:/out.txt");
首先,读取文件内容(见上),然后写入:↓↓↓
4、捕获异常
(有关异常的内容还有很多,在这就先不详解了)
读写文件时,易出现异常,故,需要在读写过程中进行异常处理,例如捕获异常
try{
FileInputStream fis = new FileInputStream("F:/test.txt");
FileOutputStream fos = new FileOutputStream("F:/out.txt");
StringBuffer sb = new StringBuffer();
// 读取文件
int n = -1;
while((n=fis.read()) != -1){
sb.append((char)n);
}
System.out.println(sb);
sb.reverse();
fos.write(sb.toString().getBytes());
System.out.println(sb);
} catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
5、BufferedInputStream / BufferedOutputStream
① 作用:在基本流的基础上进行包装,读取或者写入文件时,将通过缓存进行。
即,先将内容写入到缓存区,缓存区满以后,再进行读取或者写入操作。
可以大大减少文件的操作次数,提高写入效率。
② 缓存流的使用
在基本流的基础之上,进行包装:
new BufferedInputStream(new FileInputStream("F:/test.txt"));
这种写法。我们称之为IO链,IO关闭时,只需要关闭最外层流,内层流将自动关闭。
③ BufferedOutputStream在关闭前,通常调用bos.flush();
表示关闭前将缓存进行刷新,将缓存区剩余未满的内容写入文件。
但是,一般.close()方法,自带刷新功能。
④ 代码示例:
6、DateInputStream / DateOutputStream
采用二进制对文件进行读写操作。
与基本流相比,可以直接读写java中的基本数据类型。
另外,如果操作的文件是一个二进制文件,需要使用DataOutputStream替代FileOutputStream。
同样,Date系列的流,也有read和write方法,操作与基本相同。
注意:只用DataOutputStream写入文件为二进制文件,只能使用DataInputStream进行读取。
String name = "zhangsan";
int age = 12;
double height = 178.5;
String ads = "山东烟台";
DataOutputStream dos = null;
DataInputStream dis = null;
try {
dos = new DataOutputStream(new FileOutputStream("F:\\zhangsan.txt"));
dos.writeUTF(name);
dos.writeInt(age);
dos.writeDouble(height);
dos.writeUTF(ads);
dis = new DataInputStream(new FileInputStream("F:\\zhangsan.txt"));
String uname = dis.readUTF();
int uage = dis.readInt();
double uheight = dis.readDouble();
String uads = dis.readUTF();
System.out.println(uname+"---"+uage+"---"+uheight+"---"+uads);
} catch(FileNotFoundException e){
e.printStackTrace();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
} finally{
try {
dis.close();
dos.flush();
dos.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
7、ObjectOutputStream / ObjectInputStream
直接继承自:java.io.OutputStream 抽象类
① 与基本流相同,可以使用read、write方法进行读写。
② 与DateInputStream相同,可以对Java基本数据类型进行直接读写:readInt() writeDouble()
③ 可以只用readObject()和writeObject() 直接对对象进行操作。
【对象的序列化和反序列】
① 对象的序列化:将程序中的对象,持久化的保存在文件中的过程;ObjectOutputStream
② 对象的反序列化:将文件中保存的对象,重新读取到程序中的过程。ObjectInputStream
如果,要将对象进行序列化操作,那么实体类必须实现可序化接口。
class Person implements Serializable{}
③ 注意:当一个实体类,实现可序化接口后,可以添加一个序列化版本号ID。
(实现序列化接口以后,根据警告提示,选择:Add default serial version ID。)
添加以后,可以用ID表示序列化和反序列化时操作的对象,是同一个对象。
会自动生成一个静态属性:
private static final long serialVersionUID = 1L;
如果不添加版本ID,给序列化一个对象后,如果实体类对象有增删,再进行反序列化时,会造成错误。
因为系统认为这已经不是一个类。
+get、set方法,并重写toString方法。
Java必须了解的“递归”与“IO流”!!!的更多相关文章
- JAVA第09次实验(IO流)
JAVA第09次实验(IO流) 0.字节流与二进制文件 我的代码 import java.io.DataInputStream; import java.io.DataOutputStream; im ...
- Java的递归、IO流
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.递归 [递归] 1. 在函数自身内部,调用函数本身的方式,称为递归. ...
- 详谈JAVA中的file类与IO流
File类 位置于java.io包构造方法:File(String parent, String child)new file("d:\\","a.txt") ...
- java基础知识——网络编程、IO流
IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Writ ...
- 零基础学习java------day16-----文件,递归,IO流(字节流读写数据)
1.File 1.1 构造方法(只是创建已经存在文件的对象,并不能创建没有的文件) (1)public File(String pathname) (2)public File(String pare ...
- java基础(十九)IO流(二)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- java基础(十八)IO流(一)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- java学习第21天(IO流的使用)
IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分 ...
- java写文件读写操作(IO流,字节流)
package copyfile; import java.io.*; public class copy { public static void main(String[] args) throw ...
随机推荐
- Java源码之HashMap
一.HashMap和Hashtable的区别 (1)HashMapl的键值(key)和值(value)可以为null,而Hashtable不可以 (2)Hashtable是线程安全类,而HashMap ...
- Oracle之SQL优化专题01-查看SQL执行计划的方法
在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...
- 使用git将文件上传到Coding
1,首先在Coding上新建项目. 2,填写项目的相关内容. 3,建立项目后复制下面鼠标所选内容. 4,在自己的电脑中建立文件夹. 5,进入该文件夹后,点击鼠标右键,然后再点Git Clone. 6 ...
- iOS开发-添加圆角效果高效实现
圆角(RounderCorner)是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受.但很多人并不清楚如何设置圆角的正确方式和原理.设置圆角会带来一定的性能损耗,如何提高性能是另一个需要重点 ...
- *.db-journal 是什么(android sqlite )数据库删除缓存
sqlite的官方文档,发现该文件是sqlite的一个临时的日志文件,主要用于sqlite数据库的事务回滚操作了.在事务开始时产生,在事务操作完毕时自动删除,当程序发生崩溃或一些意外情况让程序非法结束 ...
- Flask 扩展 缓存
如果同一个请求会被多次调用,每次调用都会消耗很多资源,并且每次返回的内容都相同,就该使用缓存了 自定义缓存装饰器 在使用Flask-Cache扩展实现缓存功能之前,我们先来自己写个视图缓存装饰器,方便 ...
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- vue 的模板编译—ast(抽象语法树) 详解与实现
首先AST是什么? 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言 ...
- js 时间戳 vue 时间戳的转换 ?
在没有用vue做项目之前 也遇到过戳转换的问题 直接函数 调用 方法 这个也可以写成vue的 把function去掉 formatDate后面加冒号 就可以了 当然这个不是原创 但是是谁的我忘记了 ...
- Linux环境下发布.net core
一.安装Linux环境 1. 安装VM虚拟机和操作系统 VM虚拟工具安装的过程详见:http://blog.csdn.net/stpeace/article/details/78598333.直接按照 ...