【JavaWeb学习总结】论入后端初体验

不知不觉已经入了后端一个星期了,这一周同样也在很努力的学习,然而课程的难度并没有我想象中的那么的简单,这次的内容比较多并且难度也不再是刚开始来到未来小组所学的基础的东西了。

稍微先对这次学习的东西进行一个总结:

  1. 异常处理
    a)异常和错误的区别;
    b)异常的抛出和处理。
  2. IO
    a)字节流(输入字节流、输出字节流);
    b)字符流(输入字符流、输出字符流);
    c)File类(文件处理等等);
    d)打印流,对象流(序列化)。

此次学习的东西还是比较多的,那么就先一个一个来总结叭。

异常处理:

其实异常处理并不是我们想象中的那么难,只不过要注意,异常和错误是不一样的。

Error(错误)表示系统级的错误和程序不必处理的异常,一般是指与虚拟机相关的问题,是java运行环境中的内部错误或者硬件问题。

异常则表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。

异常中如果在try…catch语句中出现了问题,那么程序将会跳出并且不再执行下面的语句。
当然也有finally语句,代表就算try…catch语句出现了异常,但是里面的语句还是得必须执行的。
当一个方法将自己的异常抛出时,他将会把这个异常抛给调用者。比如一个方法被main方法调用了,那么main方法就是他的调用者,这个时候main方法需要去将这个异常进行处理,如果main方法也将这个方法抛出了,那么虚拟机JVM就会过来对这个异常进行处理,这个时候虚拟机不会再抛异常了,因为他已经是最顶级了,于是他就只能自行处理
注意:推荐使用try…catch语句进行处理,因为如果一直往外抛异常的话,到最后会造成程序停下来的状况发生。所以不要一见到异常就往外抛

IO流对象

那么这个东西就非常的有意思了。
IO流这一块学的东西还是蛮多的,接下来就来一个大总结叭。

(1)File类

这个类是IO流的一个基础,按理来说应该是这个东西排在书本的前面的,但是不知道为什么,这个东西排在了后面(可能是排版没拍好……)

public class Demo{
	public static void main(String[] args){
		File file = new File("C:\\1.txt");
	}
}

这个东西就是用来对文件进行一个创建还有删除的作用,
常用的方法都在这里了 :

  • boolean mkdir():用来创建一个文件夹

  • boolean mkdirs():用来创建一个或多个文件夹

  • boolean createNewFile():创建文件

  • boolean exists():判断文件是否存在

  • boolean delete():删除文件

  • boolean isDirectory():判断一个文件是不是文件夹

  • boolean isFile():判断一个文件是不是文件

  • String[] list():返回对应目录中的文件名或者文件夹名

  • File[] listFiles():返回包含文件路径文件名的File类型数组

    这些方法还算是比较实用的,对文件的管理起到了很大的帮助。

(2)IO流对象

这次学习的大多数内容都在这里体现出来了。

常见的分为下面几种:

  • 字节输入/输出流

  • 字符输入/输出流

  • 转换流

  • 缓冲流

  • 打印流

  • 序列化于反序列化

    这样一看确实是有点多,但是还是必须得学习,接下来再一个一个的介绍一下注意事项叭。

    字节输入/输出流:

作用:从java程序中写出文件
每次操作只能输出1个字节
并且可以写任意文件。

方法:
Write();
Write(byte[] b)写入一个字节数组
write(byte[] b , int,int)写入字节数组,int开始索引,后面的int 为写几个

字符输入/输出流

FileInputStream读取文件
构造方法为这个对象绑定一个数据源
然后调用read方法去读取文件中的数据
注意:read()每执行一次,都会读取下一个字节
返回值返回的是读取的那个字节,读取文件结尾的时候将会返回-1
注意:当用FileWriter对象去调用write()方法的时候,一定要走刷新:flush()不然想输入的内容不会出现在文本中
并且字符输入输出流是针对文本文件进行的操作,非文本文件是操作不了的。

转换流

构造方法:OutputStreamWriter(OutputStream String charseName)
这个东西可以操作编码表,用指定的编码表去进行一个写入文件,但是注意,里面的参数是输出流对象
如果是InputStreamReader的话里面的参数就是输入流对象了
通常用的编码表有那么两种:GBK UTF-8
这个流的最主要的特点就是可以对编码表进行一个指定引用

缓冲流

缓冲流的主要作用就是:对原有的输入流或者是输出流进行一个效率的提升。
BufferedOutputStream
构造器里面的参数必须是相应的流对象
传谁,谁的效率就会被提高
BufferedInputStream用法同上

字符流缓冲区

也属于是缓冲区的一种,只不过这次是BufferedReader/BufferedWriter,其他用法都是和上面一样的。

打印流

PrintStream:就接受File类型,字符文件名,字符输出流
PrintWriter:jieshouFile类型,字符文件名,字节输出流,字符输出流

PS:字符数组是可以被打印流打印出来的。

打印流是可以开启自刷新的
但是要满足两个因素:
1>输出的目的必须为流对象,也就是说他的参数里面的参数必须是流对象,不能够是File类型对象
2>必须调用Println() printf() format()三个中的一个

当这两者都可以满足的时候才可以开启它的自刷新。

序列化与反序列化

咱们平常写在程序里的东西都只是占用的临时内存,那么如果我们想要将我们写的数据得以长久的保存的话,就得用到序列化这一知识点了。
ObjectOutputStream(OutputStream in传递任意的字节输出流,
想要写一个序列化的文件,得先创建一个类,比如一个Person类
设置person类的姓名年龄的GET和SET方法,然后生成有参构造器和重写toString方法
而且要实现一个接口:Serializable
这个接口是一个标记接口,没有任何的方法,就只是单纯的做个标记,但是如果想实现序列化就必须让Person类去继承这个接口

PS:静态的对象并不能被序列化
transient关键字是用来组织成员变量进行序列化的

接下来说一个比较普遍的问题:解决序列号冲突问题
因为java有机制,当我们编译的时候会生成一个class文件,这个class文件生成的同时会生成一个序列号,这个序列号是系统给你自动生成的,然后你要去读取一个数据,读取数据的时候,读取方法会将自身的序列号与原来Class文件生成的序列号进行一个比对,如果序列号相同则读取成功,若序列号不相同则读取失败。
那么序列号什么时候会变呢?就是你在改动源码的时候,比如Person类中的一个age属性刚开始设置的是private修饰的,但是后来改成了public,这个时候,class文件就会生成新的序列号了,然而这个时候的序列号比对已经不成功了,所以咱们为了解决这个问题,就可以自己给它定义一个序列号,一直都用一个序列号,这样就不会出现序列号比对失败的现象发生了。
此时用到的代码为:
static final long ServialVersionUID = 14L;
这段代码加在Person类中。这样可以解决序列号冲突问题。

好吧,今天的总结就到此为止了,12.11号就要考核了,希望自己可以凭借自己的知识在考核中拿到一个好成绩,加油,Fighting!!!

你可能感兴趣的:(周学习总结,学习总结)