Java语言
文章平均质量分 72
wardoluo
这个作者很懒,什么都没留下…
展开
-
C/S结构文件上传案例
文件上传分析图解。1.客户端:输入流,从硬盘读取文件数据到程序中;2.客户端:输出流,写出文件数据到服务器端;3.服务端:输入流,读取文件数据到服务端程序;4.服务端:输出流,写出文件数据到服务器硬盘中。注意:客户端和服务器端和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)客户端和服务器之间读写,必须使用Socket中提供的字节流对象(网络流)文件上传的原理,就是文件的复制。public class TCPCFileClient { public sta原创 2021-03-17 15:22:33 · 259 阅读 · 0 评论 -
TCP通信程序
1.概述TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格分为客户端(Client)与服务端(Server)。两端通信时步骤:1.服务端程序,需要事先启动,等待客户端的连接。2.客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。在Java中,提供了两个类用于实现TCP通信程序:1.客户端:java.net.Socket类表示。创建Socket对象,向服务器发出连接请求,服务端响应请求,两者建立连接开始通信。2.服务端:java.net.Ser..原创 2021-03-17 15:00:30 · 229 阅读 · 0 评论 -
软件结构/网络通信协议/IP地址/端口号
软件结构(1)C/S结构:全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。(2)B/S结构原创 2021-03-17 10:45:21 · 430 阅读 · 2 评论 -
打印流
java.io.PrintStream继承了字节流,因此有父类的共性成员方法,同时为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。特点:1.只负责数据的输出,不负责数据的读取;2.与其他输出流不同,PrintStream 永远不会抛出 IOException;3.与有特有的方法,print和println方法,可以输出任意类型值,区别于是否换行。构造方法:(红色为常用)构造方法摘要 PrintStream(Filefile)创建具有指定文...原创 2021-03-11 11:25:24 · 114 阅读 · 0 评论 -
序列化与反序列化和transient瞬态关键字
1.概述Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。序列化:对象转换为字节 ObjectOutputStream反序列化:字节重构为对象 ObjectInputStream2.ObjectOutp原创 2021-03-10 17:32:04 · 284 阅读 · 0 评论 -
转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
1.字符编码和字符集字符编码:计算机中储存的信息都是用二进制表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。编码:字符-->字节;解码:字节-->字符字符编码就是一套自然语言的字符与二进制数之间的对应规则。原创 2021-03-10 16:30:05 · 1078 阅读 · 0 评论 -
缓冲流
昨天学习了基本的一些六,作为IO流的入门,今天学习一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来,相当于是对基本流对象的一种增强。概述缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。缓冲流,也叫高效流,是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferInpu原创 2021-03-10 14:26:31 · 144 阅读 · 0 评论 -
属性集合Properties
概述java.util.Properties继承于Hashtable,来表示一个持久的属性集。Properties可以保存在流中或从流中加载。它使用键值结构存储数据,每个键及其对应值都是一个字符串(双列集合)。该类也被许多java类使用,比如获取系统属性时,System.getProperties方法就是返回一个Properties对象。Hashtable是最早期的双列集合,但由于其单线程操作被Hashmap替代了,然而其子类Properties仍活跃着,因为是唯一和IO流相结合的集合。Proper原创 2021-03-10 11:35:41 · 211 阅读 · 0 评论 -
IO异常的处理
JDK7前的IO流异常处理无法使用throws声明抛出异常交给方法调用者直到给到JVM去处理,只能try-catch-finally代码块捕捉异常,处理异常。public static void main(String[] args) { //提高变量fw的作用域,让finally可以使用 //变量在定义的时候,可以没有值,但是使用的时候必须有值 //fw = new FileWriter("E:\\g.txt",true); 执行失败,fw没有值,...原创 2021-03-09 14:08:56 · 743 阅读 · 0 评论 -
字符流(字符输入流和字符输出流)
概述当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。字符输入流Readerjava.io.Reader抽象类是标识用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。磁盘-->内存public void close():关闭此流并释放与此流相关联的任何系统资源。public in原创 2021-03-09 13:52:42 · 6616 阅读 · 0 评论 -
字节输入流
java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中,它定义了字节输入流的基本共性功能方法。磁盘-->内存public void close():关闭输入流并释放与此流相关联的任何系统资源。public abstract int read():从输入流读取数据的下一个字节。public int read(byte[] b):从输入流中读取一些字节数,并将它们存储到字节数组b中。FileInputStream类文件字节输入流,把硬盘原创 2021-03-08 17:26:49 · 915 阅读 · 0 评论 -
IO流概述+字节输出流
1.IO概述类似于从u盘将文件拷贝到电脑硬盘里,把这种数据传输,看作是一种数据流动,按照流动的方向,以内存为基准,分为输入input和输出out,即流向内存是输入流,流出内存是输出流。Java中I/O操作主要是指使用java.io包下的内容,进行输入输出操作。输入也叫做读取数据,输出也叫做写出数据。2.IO分类知识点回忆:①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算原创 2021-03-08 14:50:36 · 242 阅读 · 0 评论 -
FileFilter过滤器
如打印多级目录下所有以.java结尾的文件,常规递归做法:/*练习:递归打印多级目录需求:遍历D:\\a文件及,及a文件夹下的子文件夹只要.java结尾的文件 */public class Demo13FileFilter { public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /*原创 2021-03-03 15:45:09 · 210 阅读 · 1 评论 -
递归(斐波那契数列、类加、累乘、打印多级目录)
概述:递归:指在当前方法内调用自己的这种现象。递归的分类:递归分为两种,直接递归和间接递归。直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。注意事项:1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。3.构造方法,禁止递归。递归的使用前提:当调用方法的时候,方法的主体不变,每次调用你发给发的参数不同,可以使用递归。pub原创 2021-03-03 15:06:23 · 213 阅读 · 0 评论 -
File类
概述:java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。构造方法:public File(String pathname)原创 2021-03-03 14:14:02 · 153 阅读 · 0 评论 -
Lambda表达式
函数式编程思想概述在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”。而函数式思想则尽量忽略面向对象的复杂语法--强调做什么,而不是以什么形式做。面向对象的思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情。函数式编程思想:只要能获取到结果,谁去做的,怎么做的,都不重要,重视的是结果,不重视过程。冗余的Runnable代码传统写法:当需要启动一个线程去完成任务时,通常会通过java原创 2021-03-02 17:27:13 · 68 阅读 · 0 评论 -
线程池
我们使用线程的时候就去创建一个线程,这样实现起来非常方便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。线程池概念线程池:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程.原创 2021-03-02 14:36:25 · 69 阅读 · 0 评论 -
Object类中wait带参方法和notifyAll方法
查看Object类的API文档可以看到,除了无参方法wait之外,类中还有重载的有参wait方法:以及一个 notifyAll方法:进入到Timed_Waiting(计时等待)状态有两种方式:1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态。2.使用wait(long m)方法,wait方法如果在毫秒结束之后,还没有被notify,就会自动醒来,进入到Runnable或BLocked状态。(区别:直接wait无参,是进入wa.原创 2021-03-02 11:34:35 · 222 阅读 · 0 评论 -
线程状态
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,在API中java.Thread.State这个枚举中给出了六种线程状态:这里先列出各个线程状态的条件,下面将会对每种状态进行详细解析线程状态 导致状态发生条件 NEW(新建) 线程刚被创建,但是并未启动,还没调用start方法。 Runnable(可运行) 线程可以在Java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。 Blocked(原创 2021-03-02 11:10:57 · 120 阅读 · 0 评论 -
线程安全
1.线程安全如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。代码实现:public class RunnableImpl implements Runnable{ // 定义一个多个线程共享的票源 private int ticket = 100; // 设置线程任务:卖票 @Override public void run() {原创 2021-02-28 19:44:03 · 90 阅读 · 0 评论 -
Thread和Runnable的区别和匿名内部类方式实现线程的创建
Thread和Runnable的区别:如果一个类继承Thread,则不适合资源共享。但如果实现了Runnable接口的话,则很容易实现资源共享。总结:实现Runnable接口比继承Thread类所具有的优势:1.适合多个相同的程序代码的线程去共享一个资源。2.可以避免Java中的单继承的局限性。(一个子类只能继承一个父类,类继承了Thread类就不能继承其它的类。而实现了Runable接口,还可以继承其他的类,实现其他的接口。)3.增加程序的健壮性,实现解耦操作,代码可以被多个线程共原创 2021-02-28 16:58:56 · 340 阅读 · 0 评论 -
创建多线程的第二种方式--实现Runable接口
翻阅API以后得知创建线程的方式总共有两种,一种使继承Thread类方式,一种是实现Runable接口方式,现在学习第二种方式。采用java.lang.Runable也是非常常见的一种,同样只需要重写run方法即可。步骤如下:1.定义Runable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。2.创建Runable实现类的实例对象,并以此实例作为Thread的target来创建Thread对象(Thread的一个构造方法,参数是Runable实现类对象原创 2021-02-28 16:14:23 · 429 阅读 · 1 评论 -
Thread类的构造方法及常用方法
API中java.lang.Thread类定义了有关线程的一些方法,具体如下:构造方法:public Thread():分配一个新的线程对象。public Thread(String name):分配一个指定名字的新的线程对象。public Thread(Runable target):分配一个带有制定目标新的线程对象。public Thread(Runable target,String name):分配一个带有指定目标新的线程对象并指定名字。常用方法:1.public Str原创 2021-02-28 16:04:28 · 1859 阅读 · 0 评论 -
线程类以及创建多线程的第一种方式---继承Thread类
先来看一个例子理解主线程和单线程:/*主线程:执行主(main)方法的线程单线程程序:Java程序中只有一个线程程序从main方法开始,从上到下依次执行 */public class Demo11MainThread { public static void main(String[] args) { Person p1 = new Person("易烊千玺",18); Person p2 = new Person("王俊凯",19);原创 2021-02-28 15:00:46 · 322 阅读 · 0 评论 -
进程与线程
前文在讲集合的时候,介绍集合只要是不安全的就是多线程的,多线程意味着速度快。1.计算机的核心是cpu,负责所有的计算任务;计算机的管理者是操作系统,负责任务的调度、资源的分配核管理(统领整个计算机硬件)。2.应用程序是具有某种功能的程序,程序是运行在操作系统之上的。一.并发与并行并发:指两个或多个事件在同一时间段内发生。并行:指两个或多个事件在同一时刻发生(同时发生)。使用cpu执行任务,譬如是一块单核cpu,左图并发:cpu在一个时间段里先执行任务1,再执行任务2,接着执行任务1,原创 2021-02-27 21:33:02 · 545 阅读 · 0 评论 -
自定义异常
自定义异常类:当Java提供的异常类,不够使用时,需要自己定义一些异常类。格式:public class XXXException extends Exception 或者 RuntimeException{添加一个空参数的构造方法添加一个带异常信息的构造方法}注意事项:1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类2.自定义异常类,必须继承 Exception (编译异常)或者 RuntimeException(运行异常)--异常指程序执行期非正常执行导原创 2021-02-26 00:58:24 · 9707 阅读 · 0 评论 -
异常的注意事项
一.多个异常使用捕获又该如何处理呢?1.多个异常分别处理// 1.多个异常分别处理try { int[] arr = {1, 2, 3}; System.out.println(arr[3]); // 数组索引异常}catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace();}System.out.println("后续代码1");try{ List<Integer> list =原创 2021-02-26 00:34:21 · 87 阅读 · 0 评论 -
Throwable查看获取的异常信息方法以及finally代码块
一.Throwable类中定义了一些查看获取的异常信息方法:public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因public String toString():获取异常的类型和异常描述信息(不用)public void printStackTrace():打印异常的跟踪栈信息并输出到控制台(JVM打印异常信息,默认调用此方法,打印的异常信息是最全面的)包含了异常的类型、原因、出现位置,在开发和调试阶段,都得使用printStack原创 2021-02-25 23:59:58 · 2535 阅读 · 0 评论 -
异常处理(throw、throws、try-catch)
Java异常处理的五个关键字try、catch、finally、throw、throws1.抛出异常throw在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接收到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?1.创建一个异常对象,封装一些原创 2021-02-25 23:25:30 · 1465 阅读 · 0 评论 -
异常
异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。Java处理异常的方式是中断处理。比如空指针异常,如果这个程序在执行过程中出现了空指针,那么就会创建一个空指针异常的对象,并把这个异常对象交给虚拟机来处理,虚拟机就会中断程序,在控制台打印出空指针异常的相关信息。异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行。异常体系:异常机制其原创 2021-02-25 21:20:48 · 75 阅读 · 0 评论 -
HashTable集合
HashTable是Map另一个实现类,此类实现了一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。即不允许存储null对象(其他集合是允许的)。JDK1.0版本就存在的,是最早期的双列集合。线程安全,是同步的(单线程,速度慢)。HashTable:底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢。HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快。HashMap集合(以及之前学的所有集合):可以存储null值/键。Ha原创 2021-02-24 22:37:37 · 176 阅读 · 0 评论 -
使用HashMap存储自定义类型键值(包括LinkedHashMap部分讲解)
注意:保证key的唯一因为已有类型如字符串都已重写了hashCode方法和equals方法,当使用这些已有类型作为key的类型的时候,不用再重写了。1.使用自定义类型作为值:private static void show01() { // 首先创建HashMap集合 HashMap<String,Person> map = new HashMap<>(); // 往集合中添加元素 map.put("北京",new Person("张三原创 2021-02-24 20:38:44 · 800 阅读 · 0 评论 -
Map集合
Map集合是双列集合。概述:现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证与个人等,这种一一对应的关系,就叫映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如:Map集合与Collection集合的比较:1.Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储;Map原创 2021-02-23 22:21:14 · 184 阅读 · 0 评论 -
工具类Collections
java.util.Collections是集合工具类,用来对集合进行操作。部分方法如下:public static <T> boolean addAll(Collection<T> c,T... elements):往集合中添加一些元素ArrayList<String> arr = new ArrayList<>();// 多次添加,麻烦arr.add("aaa");arr.add("bbb");arr.add("ccc");arr.a原创 2021-02-23 21:39:47 · 95 阅读 · 1 评论 -
可变参数
在JDK1.5之后,如果我们定义一个方法需要接收多个参数,并且多个参数类型一致,我们可以对其简化称如下格式:修饰符 返回值类型 方法名(参数类型... 形参名){ }其实这个书写完全等价于:修饰符 返回值类型 方法名(参数类型[] 形参名){ }只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。JDK1.5以后。出现了简化操作。...用在参数上,称之为可变参数。同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将...原创 2021-02-23 20:24:59 · 121 阅读 · 0 评论 -
Set集合(LinkedHashSet集合)
我们指导HashSet保证元素唯一,棵史元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。API文档中写道:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不受在set中重新插入的元原创 2021-02-23 19:50:02 · 138 阅读 · 1 评论 -
Set集合(HashSet集合)
Set集合:一个不包含重复元素的collection。更确切地讲,set不办函满足e1.equals(e2)的元素对e1和e2,并且包含一个null元素。正如其名称所暗示的,此接口模仿了数学上的set抽象。java.util.Set接口 extends Collection接口特点:1.不允许存储重复元素2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历。一.HashSet此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是原创 2021-02-23 19:34:16 · 246 阅读 · 0 评论 -
List集合(包含LinkedList集合和Vector集合)
前文学习过Collection接口的使用,接下来学习Collection接口的子类,java.util.List和java.util.Map集合。java.util.List接口继承extends自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。Lis原创 2021-02-23 15:06:30 · 277 阅读 · 0 评论 -
泛型
在前面学习集合时,集合中可以存放任意对象的,只要把对象存储集合后,那么这时它们都会被提升成Object类型。当我们取出每一个对象,并且进行相应的操作,这是必须采用类型转换。泛型:是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型。即:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型泛型也可以看成时一个变量,用来接收数据类型E e:Element 元素T t:Type 类型ArrayList集合在定义的时候,不知道集合中都会存储什么类型的数据,所以原创 2021-02-21 22:08:00 · 141 阅读 · 0 评论 -
增强for循环
增强for循环(也称for each循环)是JDK 1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实就是Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。格式:for(元素的数据类型 变量 : Collection集合or数组){ // 写操作代码 }举例:// 集合Collection<String> collection = new ArrayList<>();coll.原创 2021-02-21 19:56:09 · 693 阅读 · 1 评论