1.4 FileOutputStream类(重中之重)
(1)基本概念
java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入输出流中。
(2)常用的方法
FileOutputStream(String name) - 根据参数指定的文件名来构造对象。
FileOutputStream(String name, boolean append) - 以追加的方式构造对象。
void write(int b) - 用于将参数指定的单个字节写入输出流中。
void write(byte[] b, int off, int len)
- 将数组b从下标off位置开始的len个字节的数据写入输出流中。
void write(byte[] b)
- 将整个数组b中的所有字节数据写入输出流中。
void close() - 用于关闭输出流并释放有关的资源。
1.5 FileInputStream类(重中之重)
(1)基本概念
java.io.FileInputStream类主要用于从输入流中读取图像数据之类的原始字节流。
(2)常用的方法
FileInputStream(String name) - 根据参数指定的文件名构造对象。
int read() - 用于从输入流中读取单个字节.
- 若返回-1则表示读取到文件末尾,否则返回实际读到的数据内容。
int read(byte[] b, int off, int len)
- 用于从输入流中读取len个字节放入数组b中下标从off开始的位置。
- 若返回-1则表示读取到文件末尾,否则返回实际读到的数据字节个数。
int read(byte[] b)
- 用于从输入流中读取b.length个字节放入数组b中,返回值与上述方法相同。
int available() - 用于根据输入流来获取文件的大小并返回。
void close()
1.6 DataOutputStream类(查手册会用即可)
(1)基本概念
java.io.DataOutputStream类主要用于将Java语言中基本数据类型的变量写入输出流中。
(2)常用的方法
DataOutputStream(OutputStream out) - 根据参数指定的引用来构造对象。
- 其中OutputStream类是个抽象类,因此实参需要传递子类的对象形成多态。
void writeInt(int v)
- 用于将参数指定的数值以4字节的方式写入输出流,先写入高字节
- 当写入97时,则写入方式为:0000 0000 0000 0000 0000 0000 0110 0001
高字节 => 低字节
void close()
1.7 DataInputStream类(查手册会用即可)
(1)基本概念
java.io.DataInputStream类主要用于从输入流中读取基本数据类型的数据。
(2)常用的方法
DataInputStream(InputStream in) - 根据参数指定的引用来构造对象。
- 其中InputStream类是个抽象类,因此实参需要传递子类的对象。
int readInt() - 用于读取一个整数并返回。
void close()
1.8 BufferedWriter类(重点)
(1)基本概念
java.io.BufferedWriter类用于写入单个字符、字符数组以及整个字符串到输出流中。
(2)常用的方法
BufferedWriter(Writer out) - 根据参数指定的引用构造对象。
- 其中Writer类是个抽象类,实参需要传递子类的对象。
void write(int c) - 用于写入参数指定的单个字符。
void write(char[] cbuf, int off, int len)
- 用于将字符数组cbuf中从off位置开始的len个字符写入输出流中。
void write(char[] cbuf) - 用于写入整个字符数组的内容。
void write(String str) - 用于写入参数指定的整个字符串内容。
void newLine() - 用于写入行分隔符。
void close()
1.9 BufferedReader类(重点)
(1)基本概念
java.io.BufferedReader类用于读取单个字符、字符数组以及一行字符串内容。
(2)常用的方法
BufferedReader(Reader in) - 根据参数指定的引用来构造对象。
- 其中Reader类是个抽象类,实参需要传递子类的对象。
int read() - 用于读取单个字符并返回。
int read(char[] cbuf, int off, int len)
- 用于读取len个字符放入数组cbuf中下标从off开始的位置。
int read(char[] cbuf)
- 用于读取cbuf.length个字符到参数指定的数组中。
String readLine() - 用于读取一行字符串内容。
void close()
1.10 PrintStream类(重点 通常使用该类与BufferedReader类搭配使用)
(1)基本概念
java.io.PrintStream类主要用于打印各种类型的数据内容。
(2)常用的方法
PrintStream(OutputStream out) - 根据参数指定的引用构造对象。
- 其中OutputStream类是个抽象类,因此实参需要传递子类的对象。
void print(String s) - 用于打印参数指定的字符串。
void println(String x) - 用于打印字符串并换行。
void close()
1.I/O流
1.1 ObjectOutputStream类(重点)
(1)基本概念
java.io.ObjectOutputStream类主要用于将Java语言的对象整体写入到输出流中。
只能将支持 java.io.Serializable 接口的对象写入流中。
类通过实现 java.io.Serializable 接口以启用其序列化功能。
所谓序列化就是指将一个对象的所有属性等相关信息有效地组织成一个个字节序列的过程。
所谓反序列化就是指根据一个个字节序列的信息转换为对象的过程。
(2)常用的方法
ObjectOutputStream(OutputStream out) - 根据参数指定的引用来构造对象。
- 其中OutputStream类是个抽象类,实参需要传递子类的对象。
void writeObject(Object obj)
- 用于将参数指定的对象整体写入到输出流中。
void close()
1.2 ObjectInputStream类(重点)
(1)基本概念
java.io.ObjectInputStream类主要用于从输入流中读取一个Java对象。
(2)常用的方法
ObjectInputStream(InputStream in) - 根据参数指定的引用构造对象。
- 其中InputStream类是个抽象类,实参需要传递子类的对象。
Object readObject()
- 用于从输入流中读取对象并返回,无法通过返回值判断是否读取到流的末尾。
void close()
经验分享:
在以后的开发中若需要写入多个对象到文件时,建议将所有对象先放入集合中,然后将集合看做一个对象整体写入文件中,此时读取文件数据时,只需要读取一个对象将整个集合读取出来即可。
2.线程
2.1 基本概念
程序 - 主要指存放在硬盘/磁盘上的可执行文件。
进程 - 主要指运行在内存中的程序。
目前主流的操作系统都支持多进程,可以同时执行多个任务,但进程是重量级的,新建进程对系统的资源消耗比较大,因此进程的数量是有限的。
线程是进程内部的程序流,也就是操作系统中支持多进程,但每个进程中又可以支持多线程,并且线程是轻量级的,新建线程会共享所在进程的资源,因此主流的开发都采用多线程技术
多线程的原理是采用时间片轮转法进行处理的,从而做到并发的效果,所谓并发就是指宏观并行微观串行的机制。
2.2 线程的创建(重中之重)
(1)线程创建的方式
java.lang.Thread类用于描述线程,Java虚拟机允许应用程序并发地运行多个执行线程。
创建线程的方式有2种:
a.自定义类继承Thread类并重写run()方法,然后创建该类的实例调用start()方法;
b.自定义类实现Runnable接口并重写run()方法,然后创建该类的实例作为参数去创建
Thread类的对象,最后使用Thread类对象调用start()方法。
(2)线程创建的相关方法
Thread() - 使用无参的方式构造对象。
Thread(String name) - 根据参数指定的名称来构造对象。
Thread(Runnable target) - 根据参数指定的接口引用来构造对象。
- 实参传递方式两种:传递实现类的对象 和 匿名内部类.
Thread(Runnable target, String name) - 根据参数指定的接口引用和名称构造对象。
void run() - 若创建线程对象时使用了Runnable接口,则最终调用该接口指向对象的
run()方法,否则该方法啥也不做。
void start() - 用于启动线程,Java虚拟机会自动调用该线程的run()方法。
(3)实现原理
执行main()方法的线程叫做主线程,执行run()方法的线程叫做新/子线程。
main()是程序的入口,因此由主线程来执行main()中的代码,对于start()方法之前的代码由主线程执行一次,当start()方法调用成功后,则线程的个数由1个变成2个,其中子线程直接执行run()方法代码,主线程继续执行start()方法后的代码,两个线程各自独立运行互不影响
当main()方法代码执行完毕后,则主线程结束;当run()方法代码执行完毕后,则子线程结束,两个线程的先后执行次序没有明确规定,由系统调度算法决定。
注意:
采用继承的方式创建线程相对来说比较简单,但Java语言支持单继承,若该类继承Thread类后则无法继承其它类,因此推荐使用第二种创建方式,因为此方式不仅不影响继承其它类,而且支持多实现。
2.3 线程的编号和名称(查手册会用即可)
long getId() - 用于获取线程的编号。
String getName() - 用于获取线程的名称。
void setName(String name) - 用于设置线程的名称为参数指定的内容。
static Thread currentThread() - 获取当前正在执行线程对象的引用。