重温经典-JAVA(7)

File 类

java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件和文件夹进行操作。File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。

与系统有关的默认名称分隔符 static char separatorChar和static String separator

与系统有关的路径分隔符static char pathSeparatorChar 和static String pathSeparator

绝对路径:一个完整的路径。相对路径:简化的路径,相对于当前项目的根目录。

常用方法,getAbsolutePath(),getPath(),getName(),exists(),isDirectory(),isFile(),createNewFile(),delete(),mkdirs()其他方法,见官方API

递归

方法自己调用自己。分为直接递归和间接递归。使用递归必须明确1,递归的结束条件。2,递归的目的。使用前提,调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。

过滤器

File类中有两个和ListFiles重载的方法,方法的参数传递的是过滤器,用来过滤文件。过滤器为实现FileFilter接口的实现类对象。

字节流,字符流

字节流:InputStream、OutputStream。字符流:Reader和Writer

OutputStream 字节输出流,此抽象类是输出字节流的所有类的超类,共性方法有close(),flush(),write(),write(byte[] b),write(byte[] b,int off,int len)

FileOutputStream(File file/String name) 创建一个向指定File对象表示的文件中/指定名称的文件中写入数据的文件输出流。

写入数据原理(内存——>硬盘)

java程序——》JVM——》OS——》OS调用写数据的方法——》把数据写入到文件中。

追加写/续写使用两个参数的构造方法

FileOutputStream(String name/File file,boolean append)

写换行符号:windows:\r\n,linux:/n,mac/r

InputStram:字节输入流,此抽象类是表示字节输入流的所有类的超类,共性方法read(),read(byte[] b),close()

构造方法:FileInputStream(String name/File file)

read()方法中,读取文件的末尾返回-1

字符流 

当使用字节流读取文本文件时,存在一个问题。若遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。JAVA提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

使用字节流读取中文文件,一个中文,GBK:占用两个字节。UTF-8占用3个字节

Reader,字符输入流的最顶层的父类,共性方法,read(),read(char[] chars),close()

FileReader 文件字符输入流,把硬盘文件总的数据以字符的方式读取到内存中。

FileReader(String fileName/File file)

Writer 字符输出流的超类,共性方法:write(),write(char[]chars),write(char[]chars ,int off,int len),write(String str),write(String str,int off,int len),flush(),close()

FileWriter(File file/String fileName)根据给定的File对象/给定的文件名构造一个FileWriter 对象

flush方法和close方法区别:

flush:刷新缓冲区,流对象可以继续使用。close:先刷新缓冲区,然后通知系统释放资源。流对象不可以在被使用了。

续写,追加写

FileWriter(File file/String fileName,boolean append)

写换行符号:windows:\r\n,linux:/n,mac/r

JDK7新特性

在try后面可以增加一个(),在括号中可以定义流对象,那么这个流对象的作用域就在try中有效。try中的代码执行完毕,会自动把流对象施放,不用写finally

JDK9新特性

ry前面可以定义流对象,在try后面的()中可以直接引入流对象的名称(变量名),y中的代码执行完毕,会自动把流对象施放,不用写finally

属性集

java.util.Properties extends Hashtable<k,v> implements Map<k,v>,Properties类表示了一个持久的属性集,Properties可保存在流中或从流中加载。Properties集合是一个唯一和IO流相结合的集合。方法有store()把集合中的临时数据,持久化写入到硬盘中存储,load()把硬盘中保存的文件(键值对),读取到集合中

缓冲流

缓冲流,也叫高效流,时对4个基本流的增强,所以也是四个流。

字节缓冲流,BufferedInputStream,BufferedOutputStream

字符缓冲流,BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

缓冲流的共性方法和基本流的共性方法差不多。其中字符缓冲流BufferedWriter(Writer out字符输出流),有个特有的成员方法,void newLine()写入一个行分隔符。

转换流

字符编码表:一套自然语言的字符与二进制数之间的对应规则,编码表:生活中文字和计算机中二进制的对应规则。

重温经典-JAVA(7)

OutputStreamWriter :是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。继承父类Writer,因此继承父类的共性方法。

OutputStreamWriter (OutputStream out)创建使用默认字符编码的OutputStreamWriter 

OutputStreamWriter (OutputStream out,String charsetName)创建使用指定字符集编码的OutputStreamWriter

InputStreamReader( InputStream in)创建使用默认字符编码的InputStreamReader

InputStreamReader( InputStream in,String charsetName)创建使用指定字符集编码的InputStreamReader

序列化

JAVA提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节学列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的属性等信息,都可以用来在内存中创建对象。

 

重温经典-JAVA(7)

 

ObjectOutputStream(OutputStream out),方法void writeObject(Object obj)。ObjectInputStream(InputStream in),方法Object readObject()

序列化对象的定义类,必须实现java.io.Serializable接口以启用序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

static关键字:静态关键字。静态优先于非静态加载到内存中(静态优先于对象进入到内存中)被static修饰的成员变量不能被序列化,序列化的都是对象。

transient关键字:瞬态关键字,被此关键字修饰的成员变量,不能被序列化

若没有给类的定义添加一个***,serialVersionUID的字段(该字段必须是静态/最终的long型字段),则 当class文件在序列化对象之后发生了修改,那么反序列化操作也会失败。

打印流

print,println,static void setOut(PrintStream out)可以改变输出语句的目的地。

网络编程

软件架构:B\S架构,C\S架构。该两种架构各有优势,但是无论哪种架构,都离不开网络的支持。

网络编程,就是在一定的写一下,实现两台计算机的通信的程序。

TCP\IP协议

重温经典-JAVA(7)

 

UDP用户数据包协议消耗资源小,通信效率高,通常用于音频,视频和普通数据传输,会部分丢失。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。

TCP传输控制协议,安全,但效率没有UDP高。TCP协议是面向连接的通信协议,即传输数据之前在发送端和接收端建立逻辑连接,然后在传输数据。

本机IP地址:127.0.0.1,localhost

端口号:是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号。1024之前的端口号不能使用,已经被系统分配给已知的网络软件。网络软件的端口号不能重复。

我们使用IP地址加端口号,就可以保证数据准确无误地发送到对方计算机的指定软件。

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端与服务端。

两端通信时步骤:

1、服务端程序,需要事先启动,等待客户端的连接。2客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端

具体如下图

重温经典-JAVA(7)

TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器回写的数据。

java.net.Socket:此类是实现客户端套接字。套接字是两台机器间通信的端点。

Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。成员方法,getOutputStream(),getInputStream(),close()

客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的流对象。当我们创建客户端对象Socket的时候,就会去请求服务器,和服务器经过三次握手建立连接通路。服务器若没有启动,抛出异常;已经启动,可进行交互。

TCP通信的服务器端:接受客户端的请求,读取客户端发送的数据,给客户端回写数据表示服务器的类。

java.net.ServerSocket:此类实现服务器套接字。构造方法,ServerSocket(int port),成员方法,Socket accept()侦听并接受到此套接字的连接。

在TCP通信的文件上传中,注意:

(客户端和服务器)在与各自的本地硬盘进行读写操作时,需要使用自己创建的字节流对象(本地流)。

和护短和服务器之间进行读写操作,必须使用Socket中提供的字节流对象(网络流)。

服务器一般为持续侦听状态,可添加多线程,提高侦听处理效率。在上传文件的时候给出socket。shutdownOutput()标记。

在B/S架构TCP通信中,服务器端返回读取文本信息的第一行,用BufferReader读取行信息,用InputStreamReader把字节流转换为字符流。在读取行信息之前,须写入html三行固定代码。"HTTP/1.1 200 OK\r\n","Content-Type:text/html\r\n",“\r\n”

浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片。