学号 20189214 《Java程序设计》第五周学习总结

教材学习内容总结

输入输出

文件系统可以包含3种类型的对象:文件、目录和符号链接。

一个文件或路径是一个java.io.File来表示的,java7之后有了java.nio.file.Path接口。

  • FileSystem类

    • getDefult返回当前的文件系统。
    • getRootDirectories。它返回一个Iterable,用于遍历根目录。
    • getPath 可以用来创建一个Path实例。
  • Path

    • getNameCount方法返回路径中的名称的数目
    • getName返回单个的名称
    • getParent
    • getRoot
    • getFileName 返回当前Path的文件名

文件操作:

  • 创建和删除文件和目录(creatFile,createDirectory)
  • 获取目录对象(DirectoryStream)
  • 复制和移动文件(copy,move)
  • 读取和写入文件
    • 二进制文件(readAllBytes,write)
    • 文本文件 (readAllLines,write)

Files类中的read和write方法只是适用于比较小的文件。比较大的文件,需要使用来代替。

  • 输入/输出流

    • Reader 从一个池中读取字符的流
    • write 向一个池中写入数据的流
    • InputStream 从一个池中读取二进制数据的流
    • OutputStream 向一个池写入二进制数据的流
  • 读二进制数据
    • read()
    • read(byte[] data)
    • read( byte[] data ,int offset , int length)
    • avaliable (该方法返回了能够读取而不会阻塞的字节数)
  • 写二进制数据(OutputStream)
    • write()
    • write(byte[] data)
    • write( byte[] data ,int offset , int length)
  • 写文本(outStreamWriter,printWriter)

    write和outputstream类似,只不过writer处理字符而不是字节。

    • write(int b )
    • write(char[] data)
    • write( char[] data ,int offset , int length)
    • write(String[] data)
    • write( String[] data ,int offset , int length)
    • printWriter(缓冲区BufferedWriter 对象)
  • 读文本(Reader,inputStreamWriter,BufferedReader)
  • printStream记录日志
  • 将System.out重定向到一个文件来记录日志。还可以使用setIn和setErr方法替代System对象中默认的in和out。
  • 随机访问文件
    • seekableByteChannel可以执行读和写操作。
    • seekableByteChannerl需要使用byteBuffer类。

ByteBuffer提供了两个put方法来写一个字节

还提供了putXXX,getXXX方法来读写缓存

对象序列化

定义

  • 把对象转换为字节序列的过程称为对象的序列化。
  • 把字节序列恢复为对象的过程称为对象的反序列化。

java API

  • java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  • java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  • 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

用途

  1. 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2. 在网络上传送对象的字节序列。

常见场景

  1. Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
  2. 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

线程与并发

首先来区分一下线程与并发:

  • 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程。使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。
  • 并行与并发:
    • 并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
    • 并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

Thread状态

  • new 线程还没有启动的状态
  • runable 线程正在执行的一种状态
  • blocked 线程等待访问对象的一个锁的一种状态
  • waiting 线程无限期等待另一个线程执行一项操作的一种状态
  • timed_waiting 线程在指定的时间内等待另一个线程执行一项操作的一种状态
  • terminated 线程已经推出的一种状态

Java中线程的创建常见有如三种基本形式:

1.继承Thread类,重写该类的run()方法。

2.实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象。

3.使用Callable和Future接口创建线程。具体是创建Callable接口的实现类,并实现clall()方法。并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。

同步

  • synchronized, wait, notify 是任何对象都具有的同步工具。
  • wait/notify必须存在于synchronized块中。并且,
  • 这三个关键字针对的是同一个监视器(某对象的监视器)。这意味着wait之后,其他线程可以进入同步块执行。

synchronized的用法

  • 单独使用:

    • 代码块:如下,在多线程环境下,synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容
    • 直接用于方法: 相当于上面代码中用lock来锁定的效果,实际获取的是Thread1类的monitor。更进一步,如果修饰的是static方法,则锁定该类所有实例。
     public class Thread1 implements Runnable {
Object lock;
public void run() {
synchronized(lock){
do something
}
}
}
    public class Thread1 implements Runnable {
public synchronized void run() {
..do something
}
}

并发

Callable

一个Callable是一个任务,它返回一个值,也可能抛出一个异常。

future模式:并发模式的一种,可以有两种形式,即无阻塞和阻塞,分别是isDone和get。其中Future对象用来存放该线程的返回值以及状态

ExecutorService e = Executors.newFixedThreadPool(3);
//submit方法有多重参数版本,及支持callable也能够支持runnable接口类型.
Future future = e.submit(new myCallable());
future.isDone() //return true,false 无阻塞
future.get() // return 返回值,阻塞直到该线程运行结束

高级多线程控制类

  1. ThreadLocal类

    • 用处:保存线程的独立变量。对一个线程类(继承自Thread)

      当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。常用于用户登录控制,如记录session信息。
    • 实现:每个Thread都持有一个TreadLocalMap类型的变量(该类是一个轻量级的Map,功能与map一样,区别是桶里放的是entry而不是entry的链表。功能还是一个map。)以本身为key,以目标为value。

      主要方法是get()和set(T a),set之后在map里维护一个threadLocal -> a,get时将a返回。ThreadLocal是一个特殊的容器。
  2. 原子类(AtomicInteger、AtomicBoolean……)
  3. Lock类 
    • lock: 在java.util.concurrent包内。共有三个实现:

      ReentrantLock

      ReentrantReadWriteLock.ReadLock

      ReentrantReadWriteLock.WriteLock

    • ReentrantLock 可重入的意义在于持有锁的线程可以继续持有,并且要释放对等的次数后才真正释放该锁。

4.容器类

- BlockingQueue阻塞队列。该类是java.util.concurrent包下的重要类,通过对Queue的学习可以得知,这个queue是单向队列,可以在队列头添加元素和在队尾删除或取出元素。类似于一个管道,特别适用于先进先出策略的一些应用场景。普通的queue接口主要实现有PriorityQueue(优先队列).

- ConcurrentHashMap高效的线程安全哈希map。请对比hashTable , concurrentHashMap, HashMap。

网络

java.net.URL

URL 解析:

  • 协议为(protocol):http
  • 主机为(host:port):www.runoob.com
  • 端口号为(port): 80 ,以上URL实例并未指定端口,因为 HTTP 协议默认的端口号为 80。
  • 文件路径为(path):/index.html
  • 请求参数(query):language=cn
  • 定位位置(fragment):j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 。

import java.net.*;
import java.io.*; public class URLDemo
{
public static void main(String [] args)
{
try
{
URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
System.out.println("URL 为:" + url.toString());
System.out.println("协议为:" + url.getProtocol());
System.out.println("验证信息:" + url.getAuthority());
System.out.println("文件名及请求参数:" + url.getFile());
System.out.println("主机名:" + url.getHost());
System.out.println("路径:" + url.getPath());
System.out.println("端口:" + url.getPort());
System.out.println("默认端口:" + url.getDefaultPort());
System.out.println("请求参数:" + url.getQuery());
System.out.println("定位位置:" + url.getRef());
}catch(IOException e)
{
e.printStackTrace();
}
}
}

编译运行结果如下:

URL 为:http://www.runoob.com/index.html?language=cn#j2se

协议为:http

验证信息:www.runoob.com

文件名及请求参数:/index.html?language=cn

主机名:www.runoob.com

路径:/index.html

端口:-1

默认端口:80

请求参数:language=cn

定位位置:j2se

URLConnections

URLConnection 方法列表如下:

  1. Object getContent() 检索URL链接内容
  2. Object getContent(Class[] classes) 检索URL链接内容
  3. String getContentEncoding() 返回头部 content-encoding 字段值
  4. int getContentLength() 返回头部 content-length字段值
  5. String getContentType() 返回头部 content-type 字段值
  6. int getLastModified() 返回头部 last-modified 字段值。
  7. long getExpiration() 返回头部 expires 字段值。
  8. long getIfModifiedSince() 返回对象的 ifModifiedSince 字段值。
  9. public void setDoInput(boolean input)

    URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。
  10. public void setDoOutput(boolean output)

    URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false。
  11. public InputStream getInputStream() throws IOException 返回URL的输入流,用于读取资源
  12. public OutputStream getOutputStream() throws IOException 返回URL的输出流, 用于写入资源。
  13. public URL getURL() 返回 URLConnection 对象连接的URL

socket

客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受连接后,服务器和客户端之间的通信就像输入输出流一样进行操作。

教材学习中遇到的问题和解决过程

  • 问题1:Lock和synchronized区别
  • 解决方案:lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)

    提供多种加锁方案,lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式,还有trylock的带超时时间版本。和Condition类的结合性能更高。

代码调试中的问题和解决过程

  • 问题1:密钥保存在本地,不可通文件读取来获得type[]
  • 问题1解决方案:私钥不保存在本地。

代码托管

https://gitee.com/shamBryce/JAVA

上周考试错题总结

Which of the following objects could contain the information “eastern standard time”?

(Choose all that apply.)

A .Instant

B .LocalDate

C .LocalDateTime

D .LocalTime

E .ZonedDateTime

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 150/200 2/2 20/20
第二周 200/400 1/3 20/40
第三周 100/500 1/4 10/50
第四周 200/700 1/5 15/65
第五周 1400/2100 1/5 20/85
  • 计划学习时间:15小时

  • 实际学习时间:20小时

参考资料

java学习(五)的更多相关文章

  1. Java学习 (五)基础篇 数据类型

    目录 数据类型 强类型语言 弱类型语言 Java数据类型分为两大类 八大字节类型(重点) Java数据类型拓展 整数拓展:进制 浮点数拓展 字符类型 布尔值拓展 数据类型 强类型语言 要求变量的使用要 ...

  2. 20145304 第五周Java学习报告

    20145304<Java程序设计>第5周学习总结 教材学习内容总结 1.使用try.catch: 如果使用了try.catch,编译时会尝试执行try区块中的程序代码,如果有错误,执行流 ...

  3. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  4. 第五周java学习总结

    学号 20175206<Java程序设计>第五周学习总结 教材学习内容总结 6.1 接口 为了克服Java单继承的缺点,Java使用了接口,一个类可以实现多个接口. 使用关键字interf ...

  5. 第五周Java学习总结(补)

    第五周java学习内容(补) 学习内容: File类方法的操作 public String getName() public boolean canRead() public boolean canW ...

  6. 201671010140. 2016-2017-2 《Java程序设计》java学习第十五周

    java学习第十五周 Java的GUI界面设计,框架以及主要部件填充,归置,布局管理,在第十一章和第十二章进行了系统的学习,在这两章的知识奠基下,可以简单的构造一个GUI用户界面,在两周的学习后,可以 ...

  7. 201671010140. 2016-2017-2 《Java程序设计》java学习第五周

    java学习第五周心得体会        本周,是Java学习第五周,随着时间推移,随着课本内容的推进,我们接触到的程序也开始变得越来越复杂,不再是二三章那些用来练手的小程序了,这一点,在我们的例题运 ...

  8. 20165210 Java第五周学习总结

    20165210 Java第五周学习总结 教材学习内容 - 第七章学习总结 内部类: 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. 内部类的类体中不可以声明类变 ...

  9. 从.Net到Java学习第五篇——Spring Boot &&Profile &&Swagger2

    从.Net到Java学习系列目录 刚学java不久,我有个疑问,为何用到的各种java开源jar包许多都是阿里巴巴的开源项目,为何几乎很少见百度和腾讯?不是说好的BAT吗? Spring Boot 的 ...

随机推荐

  1. Visual Studio中定义OVERFLOW不能用

    在Visual Studio中对OK.ERROR.OVERFLOW进行宏定义,但只有OVERFLOW不能正常使用为什么呢? #define OK 1: #define ERROR 0: #define ...

  2. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  3. pytorch 生成随机数

    在使用PyTorch做实验时经常会用到生成随机数Tensor的方法,比如: torch.rand() torch.randn() torch.normal() torch.linespace() 在很 ...

  4. MSSQL 表修复语句

    一早发现C盘爆满了,查询了下发现是mssql下面占用了几十G的log以及mdmp文件 一般发现这种文件就是代表着数据库出问题了. 检查数据库,发现某个数据库有问题,(回想起来前天做了一个操作,可能有问 ...

  5. 正则简单操作cookie、url search

    正则操作cookie.url getCookie function getCookie(key) { var cookies = window.document.cookie, reg = new R ...

  6. sublime_text3代码自动补全

    因为项目需要用sublime_text3编辑器,安装之后代码自动补全功能没有,这比较苦恼. 其实蛮简单的 英文界面:menu->Preferences->Setting-User-> ...

  7. UE4AI行为树笔记

  8. [RUNOOB]C++继承

    REF: http://www.runoob.com/cplusplus/cpp-inheritance.html 一.基类和派生类 程序: #include "stdafx.h" ...

  9. jQuery之animate中的queue

    queue.dequeue clearQueue  清空 用队列完成之前动画的操作:

  10. JAVA WEN开发环境与搭建

    一.下载安装JDK1.配置jdk开发环境JAVA_HOME 2.path 二.下载安装eclipse javaEE版本 三.安装部署tomcat3.1.安装: 直接解压到指定目录即可.(注:目录不要太 ...