移动平台开发第五周学习总结

第16章 输入/输出

输入/输出(I/O)是计算机程序最常执行的操作之一。I/O操作的例子包括:
1、创建和删除文件。
2、从一个文件或网络套接字读取内容,或向其写入内容。
3、把对象序列化(或保存)到持久存储中,并且获取保存的对象。

java.nio.file包中的FileSystem抽象类和FileSystems类

FileSystem抽象类的对象表示一个文件系统,FileSystems类中有静态方法getDefault()方法返回当前的文件系统。
FileSystem抽象类的其他方法:

java.nio.file.Path接口表示一个路径,其值可以是一个目录、文件和一个符号链接。

实现一个Path接口的实例,可以用FileSystem抽象类中的getPath()方法。
例如Path path = FileSystems.getDefault( ).getPath("/home/user/images");
java.nio.file.Paths类提供了对路径操作的相关方法,get( ), getNameCount( ), getName( ), getFileName( ), getParent( ), getRoot( )等。

java.nio.file.Files类,提供处理文件和目录的静态方法(不用创建Files实例),读取写入内容,创建流对象。

createFile, createDirectory, delete, deleteIfExists等方法,其参数都为Path类型。
newDirectoryStream方法来获取目录中的文件、子目录和符号链接,返回一个DirectoryStream实例,用于遍历。
copy方法:Files.copy(source, target, StandardCopyOption.ATOMIC_MOVE/COPY_ATTRIBUTES/REPLACE_EXISTING)
相似的有move方法。
针对二进制文件和文本文件分别有读取内容的方法和写入内容的方法。
读取:readAllBytes, readAllLines
写入:write方法,有两个重载形式。

输入输出流

“池”可能是一个文件、一个网络套接字或者是内存。使用流可以,可以用一种一致的方法在不同的池之间传输数据。只需构建正确的流就行了。
流通过java.io包中的4个抽象类来表示:
Reader,Writer,InputStream,OutputStream。
java.nio.file.Files类里new...Stream方法可以构造链接到一个文件的流。

OutputStreamWriter是字符流与字节流之间的桥梁???

PrintWriter是OutputStreamWirter的一个替代,通过构造方法传入编码信息,从而选择编码。通过这个类对流进行很好的写。
下图成功使用PrintWriter写入自己姓名和学号:

Reader中有InputStreamReader和BufferedReader。

PrintStream记录日志

PrintStream类是OutputStream的一个间接的子类。System.out的类型是java.io.PrintStream, 使用setOut方法来代替默认的PrintStream。

随机访问文件

使用java.nio.channels.SeekableByteChannel接口,通过Files类的newByteChannel类来构造。
SeekableByteChannel类使用一个内部指针,它指向要读取或写入的下一个字节,可以通过调用position方法来获取指针的位置。
读取和写入采用wirte和read方法,参数是ByteBuffer类型.

编程实现的结果与书上的结果不一致,我觉得我的更具合理性。

将对象持久化到一个永久性存储中,以便以后能够保持并获取对象的状态。Java通过对象序列化来支持这个。
使用ObjectOutputStream类来对对象或基本类型进行序列化。
要序列化的对象,必须实现java.io.Serializable接口,此接口没有方法,标记接口。
序列化运行时,将每个序列化类和一个版本号关联起来,声明一个final的long类型的serialVersionUID字段。

第十九章 线程

每个java程序都至少有一个线程,调用main方法时,就创建了线程。
Swing应用程序有一个处理事件的线程,还有主线程。

创建一个线程

扩展java.lang.Thread类。覆盖run方法并且在其中写入你想要让线程执行的代码。一旦有一个Thread对象,调用其start方法来启动该线程。当线程启动后,执行其run方法,一旦run方法返回或者抛出一个异常,线程会死掉并且会被垃圾收集。
线程状态封装在java.lang.Thread.State枚举类型中。

编程实现双线程swing程序,和基于优先级的swing计数器程序。

虽然setPriority设置了优先级,但计数速度一样快,难道是我电脑cpu太强大了???

swing包 和 awt包

javax(属于扩展包)
java.awt: Abstract Window ToolKit(抽象窗口工具包),需要 调用本地系统方法实现功能。属重量级控件。 javax.swing: 在AWT的基础上,建立的一套图形界面系统,其中 提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

使用了嵌套类,并且类的实现放在了constructGUI方法中,在main方法中又创建了一个线程。

同步

线程干扰:一个事件有两个非原子性的操作在不同的线程中进行,操作的却是相同的数据。
每个Java对象都有一个内在的锁,监控锁。锁的功能:1、互斥。2、可见性。

关键代码段:对共享资源进行访问的代码段(一般是方法);使用synchronized来修饰实现的。

块同步:当多个线程访问一个共享对象的时候,使用synchronized构建一个线程安全类,为该类添加内在锁。

可见性。不知为什么访问变量的所有线程却看不见变量的变化,使用volatile关键字可以使所有线程不用通过访问函数来看见它,但这不能解决线程互斥问题。

线程协调

通过wati()和notif()方法来完成操作系统课中的同步互斥问题。
通过Timer类解决代码的重复工作,可设定间隔时间。

第二十章 并发工具

java.util.concurrent包及其子包添加了并发工具。java.util.concurrent.atomic包提供了可以执行原子性操作的类。

使用java.util.concurrent.Executor或者其子接口来实现Runnable任务,ExecutorService接口是其扩展,添加了终止方法和执行Callable方法。

编程实现,但这程序没看懂,其中的actionPerformed方法是如何调用的???

Callable和Future。最常用的并发工具。

第22章 网络

java带有java.net包,使得网络编程更为容易。

URL指定了一个互联网资源,它通常相对于服务器的根目录来进行解析。因此总以一个“/”开头。

java.net.URL类,用于解析服务器资源。

java.net.URLConnection类,用于读写服务器内容。

java.net.Socket类,套接字类,实现双方发送和接受数据流。

java.net.ServerSocket类,服务器套接字类,服务器监听套接字。

HttpServer类,表示一个Web服务器。

Request类,表示一个HTTP请求,两个公有的方法,parse和getUri。

Response类,表示一个HTTP响应。

小结

这书看一遍不够,特别是Java后几章内容,这本书讲的也不清楚,需要其他教材仔细研读。

posted @ 2019-03-31 22:19  20189210牟健  阅读(233)  评论(0编辑  收藏  举报