1. IO概述
IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。
例如:键盘的输入,再比如显示器就是输出设备,输出图像。
对于java来说输入输出问题,java将它抽象成流对象来解决。
2. 流的分类
IO流在java中从输入输出角度分类:输入流、输出流
IO流在java中从数据的角度来分类:
**字符流:**文本,我们能读的懂的都可以认为是字符流。比如:文章,java文件等等
**字节流:**二进制的数据,这种数据一般用文本打开我们读不懂。比如,图片文件,mp3文件,等等。
3. 字符流
字符流的类的命名的规则:
如果是输出流就以Writer结尾
如果是输入流就以Reader结尾
4. 案例
使用字符流向一个文件输入helloworld。
步骤:
-
创建文件
-
创建输出流对象
-
把流指向指定的文件
-
释放资源
java
public class IOTest {
public static void main(String[] args) {
//创建一个文件
File file = new File("test.txt");
Writer writer = null;
try {
//IO流是需要关闭的,如果不这样设计就会不能关闭资源
writer = new FileWriter(file);
writer.write("HelloWorld");
} catch (IOException e) {
e.printStackTrace();
}finally {
//判断writer不是空防止空指针异常
if(writer != null) {
try {
//关闭流
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
文件的追加
java
public class IOTest4 {
public static void main(String[] args) {
Writer writer = null;
try {
//IO流是需要关闭的,如果不这样设计就会不能关闭资源
//writer = new FileWriter("test1.txt", true);
writer = new FileWriter(new File("test1.txt"), true);
writer.write("liangliang");
} catch (IOException e) {
e.printStackTrace();
}finally {
//判断writer不是空防止空指针异常
if(writer != null) {
try {
//在关闭前会做flush的事情
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
换行:
输出换行
把文本写入文件中\n代表换行
问题是不同的环境下换行的方式也不一样
Windows: \r\n
Linux:\n
Mac:\r
java
public class IOTest5 {
public static void main(String[] args) {
//创建一个文件
File file = new File("test.txt");
Writer writer = null;
try
//IO流是需要关闭的,如果不这样设计就会不能关闭资源
writer = new FileWriter(file);
for (int i = 0; i < 100; i++) {
writer.write("HelloWorld\r\n");
//每次写入10个helloworld的时候做一次flush
if(i % 10 == 0){
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//判断writer不是空防止空指针异常
if(writer != null) {
try {
//在关闭前会做flush的事情
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Writer的五种写入的方法
java
public class IOTest6 {
public static void main(String[] args) {
//创建一个文件
File file = new File("test.txt");
Writer writer = null;
try {
writer = new FileWriter(file);
//定义一个数组
char[] c = {'a','b','p','b','p'};
/*writer.write(c);
//把数组中的一部分写入文件
writer.write(c, 2, 2);
writer.write(97);
*/
writer.write("helloworld", 2, 2);
} catch (IOException e) {
e.printStackTrace();
}finally {
if(writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5. 字符流转向字节流的桥梁
Ascii中GBK码表
UTF-8码表
java
public class ConverterDemo {
public static void main(String[] args) {
//创建字符流转换字节流的桥梁的对象
OutputStreamWriter ow = null;
try {
//ow = new OutputStreamWriter(new FileOutputStream("b.txt"));
//字符流通向字节流的桥梁可以指定存储的编码
ow = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");
ow.write("中");
ow.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(ow != null){
ow.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6. Properties
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
1.继承于Hashtable,是线程安全的键值对存储结构
-
Properties 可保存在流中或从流中加载
-
只能保存字符串的键值对。
实战应用
java
public class PropTest6 {
public static void main(String[] args) {
//创建一个Properties对象
Properties prop = new Properties();
InputStream in = null;
try {
//in = new FileReader("src/names.properties"); in=PropTest6.class.getClassLoader().getResourceAsStream("names.properties");
//从字节流中来加载数据到属性对象中
prop.load(in);
System.out.println(prop);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
7. 序列化流
序列化流:
对象输出流:ObjectOutputStream 将 Java 对象写入 OutputStream。
对象输入流:ObjectInputStream 对以前使用 ObjectOutputStream 写入的对象进行反序列化。
序列化的对象需要实现序列化接口,实现public class Person implements Serializable {}
如果要是对多个对象来做序列化,一定要放在集合中。
8. 字符编码
存储:在计算机中存储字符都是存储的字符所对应的数值以二进制的形式表示。
展示:去相关的编码表中去查找该值(存储的值)所对应的字符。
GBK :用于存储中文的码表
UTF-8: 最大的一张码表包含了所有的字符标准
注意:用什么编码,就要用什么解码