学习内容:
1.1复习Java基础
(Java语言程序设计 附书内代码 提取码: fv6k)
- io流
- 集合框架
1.2寻找相应视频学习(SSM+Maven+IDEA开发)
学习效果:
2.1复习Java基础
- io流
关于io流的一些具体的类及其方法可以自己查看api(在没有大量练习或者实践就去强行记忆方法实在是下策),今天主要去了解它的一些思想。
文件可分为文本(.txt)和二进制(.bat)
文本IO建立在二进制IO(效率高,可移植)的基础上,是一层抽象。
例如:
文本的199存储为0x31 0x39 0x39(把199当成“199”,逐字编码)
二进制的199存储为0xC7
输入流:将外部数据输入到程序
输出流:将程序数据输入到外部
统一码:由两个字节组成,java使用统一码。
ASCII:只有8位(一个字节),是统一码的子集。
UTF-8:有1、2、3个字节(更高效)
writeBytes(String s)方法只将字符串s的每个字符统一码的低字节的输出,所以适用于ASCII码(因为ASCII码只有0-127,正好一个字节)
示例代码:【注意:下面使用的是 try-with-resources 语句,在这个例子中,数据流会在 try 执行完毕后自动被关闭,前提是,这些可关闭的资源必须实现 java.lang.AutoCloseable 接口。】
import java.io.*;
public class TestDataStream {
public static void main(String[] args) throws IOException {
try ( // Create an output stream for file temp.dat
DataOutputStream output =
new DataOutputStream(new FileOutputStream("temp.dat"));
) {
// Write student test scores to the file
output.writeUTF("John");
output.writeDouble(85.5);
output.writeUTF("Jim");
output.writeDouble(185.5);
output.writeUTF("George");
output.writeDouble(105.25);
}
try ( // Create an input stream for file temp.dat
DataInputStream input =
new DataInputStream(new FileInputStream("temp.dat"));
) {
// Read student test scores from the file
System.out.println(input.readUTF() + " " + input.readDouble());
System.out.println(input.readUTF() + " " + input.readDouble());
System.out.println(input.readUTF() + " " + input.readDouble());
}
}
}
二进制IO类
- 要try-catch(或者抛出异常)
复制文件的核心代码:
try (
// Create an input stream
BufferedInputStream input =
new BufferedInputStream(new FileInputStream(sourceFile));
// Create an output stream
BufferedOutputStream output =
new BufferedOutputStream(new FileOutputStream(targetFile));
) {
// Continuously read a byte from input and write it to output
int r, numberOfBytesCopied = 0;
while ((r = input.read()) != -1) {
output.write((byte)r);
numberOfBytesCopied++;
}
// Display the file size
System.out.println(numberOfBytesCopied + " bytes copied");
}
对象IO类
除了可以输入输出字符,还可以输出对象
例子:
输出字符及对象
import java.io.*;
public class TestObjectOutputStream {
public static void main(String[] args) throws IOException {
try ( // Create an output stream for file object.dat
ObjectOutputStream output =
new ObjectOutputStream(new FileOutputStream("object.dat"));
) {
// Write a string, double value, and object to the file
output.writeUTF("John");
output.writeDouble(85.5);
output.writeObject(new java.util.Date());
}
}
}
输入字符及对象:
import java.io.*;
public class TestObjectInputStream {
public static void main(String[] args)
throws ClassNotFoundException, IOException {
try ( // Create an input stream for file object.dat
ObjectInputStream input =
new ObjectInputStream(new FileInputStream("object.dat"));
) {
// Read a string, double value, and object from the file
String name = input.readUTF();
double score = input.readDouble();
java.util.Date date = (java.util.Date)(input.readObject());
System.out.println(name + " " + score + " " + date);
}
}
}
【注意:只有可序列化的类才可被写入输出流,可序列化对象的类必须实现java.io.Serializable接口】
Serializable接口
当存储一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对
象实例变量的值以及该对象引用的任何其他对象的闭包,但是不存储对象静态变量的值
如果一个对象是 Serializable 的实例,但它包含了非序列化的实例数据域,那么可以序
列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关
键字 transient, 告诉 Java 虚拟机将对象写入对象流时忽略这些数据域。
例如:
public class C implements java.io.Serializable {
private int vl;
private static double v2;
private transient A v3 = new A();
}
class A { }// A is not serializable
第一次写入一个对象时,就会为它创建一个序列号。
关键术语
binary I/O (二进制输人 / 输出)
deserialization (反序列化)
file pointer (文件指针)
random-access file (随机访问文件)
sequential-access file (顺序访问文件)
serialization (序列化)
stream (流)
text I/O (文本输入 / 输出)