1.IO回顾
字符流:是用来读写字符数据的流;
输出流:
FileWriter类
方法:
void write(char c):把字符c对应的字符写到文件中;
void write(char[] cArray):把字符数组中的数据写到文件中;
void write(char[] cArray,int index,int len):把字符数组的一部分数据写到文件中;
......
BufferedWriter类
方法:
同上;
输入流:
FileReader 类
方法:
int read():读取一个字符,返回这个字符对应的ASCII数字;
int read(char[] cArray):读多个数字的字符,把独到的字符都放在cArray数组中;
BufferedReader 类
方法:
同上;
String readLine():读一行字符串,返回的是这一行字符串的内容;
字节流
输出流:
outputstream 类:
是一个抽象父类,是所有字节输出流的父类,里面定义了所有字节输出流最基本的功能;
fileoutputstream 子类:
以字节数据写到文件中;
方法:
......
bufferedoutputstream 类
缓冲字节输出流,里面包含两部分:基本的字节输出流和缓冲区;
基本的字节输出流:是用来写数据的,是把数据写到缓冲区中;
缓冲区:当缓冲区的空间被沾满或者调用flush方法或者调用close方法,才把缓冲区的数据写到文件中;
写的效率高;
方法:
.....
输入流:
inputstream类:
是一个抽象父类,是所有字节输入功流的父类;里面定义了所有字节输入流最基本的功能;
fileinputstream 子类:
从文件中读取字节数据,读入到内存中;
方法:
int read();
int read(byte[] bArray);
bufferedinputstream 类
缓冲字节输入流,里面包含两部分:基本的字节输入流和缓冲区;
方法:
.....
2.文件中的编码
ASCII:美国标准信息交换码。(128个字符)
ISO8859-1:拉丁码表。欧洲码表,不能对中文进行编码;
GB2312:中国的简体中文编码表;
GBK:中国的中文编码表升级,融合了更多的中文文字符号。(中文默认编码表)
GB18030:罪行的中文码表,目前还没有正式使用;
Unicode:国际标准码,融合了多种文字;
所有文字都用两个字节来表示,Java语言使用的就是Unicode。
UTF-8(基于Unicode):最多用三个字节,至少使用一个字节来表示一个字符。(编码的长度是变化的)
UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容;
*在中文的操作系统保存文件时,采用的是GBK编码表
英文字符—>文件中—->1一个字节
中文字符—>文件中—->2一个字节
*记住常用的编码
ASCII ISO8859-1 GBK Unicode UTF-8
以后做项目是项目的字符编码统一使用UTF-8的编码;
3.转换流
是介于字符流与字节流之间的一种流;
可以把字节转成字符数据,也可以把字符转成字节数据;
3.1 OutputStreamWriter 类
输出流,可以按照指定的字符集编码 把字符转换成字节数据。
编码:把字符数据转换成字节数据; 字符数据->二进制数据
解码:把字节数据转换成字符数据;二进制数据->字符数据
构造方法:
1.OutputStreamWriter(OutputStream out):是用指定的字节输出流对象和默认的字符集编码,创建转换流对象;
2.OutputStreamWriter(OutputStream out,String charsetName):使用指定的字节输出流对象和指定的字符集编码创建转换流对象;
成员方法:
void write(int c):按照指定的编码把数字转成字节数据,然后存储到文件中;
void write(char[] cbuf, int off, int len):把字符数组中的一部分元素,按照指定的编码转成字节数据,然后存储到文件中;
void write(String str, int off, int len):把字符串中的一部分数据,按照指定的编码转成字节数据,然后存储到文件中;
3.2 InputStreamReader类
输入流,可以按照指定的字符集编码,把字节数据转换成字符数据;
构造方法:
1.InputStreamReader(InputStream in):按照指定的字节输入流和默认的字符集编码,创建转换流对象;
2.InputStreamReader(InputStream in, String charsetName):按照指定的字节输入流和指定的字符集编码,创建转换流对象;
成员方法:
1. int read():读取一个字符,返回这个字符对应的ASCII数字;
2. int read(char[] cbuf) :读取多个字符,将字符读入到数组中,返回的是读到的字符的个数;
解决中文乱码的方法:
保证读写数据使用的字符集编码一样;
4.序列化和返回序列化
4.1序列化
把Java对象对应的二进制数据(字节数据)存储到文件中; Java->二进制->存到文件中;
ObjectOutputStream类:
序列化用到这个类;
构造方法:
ObjectOutputStream(OutputStream out):根据字节数出流对象创建序列化流的对象;
成员方法:
void writeObject(Object obj):序列化,把Java数据转换成二进制数据写入文件中;
示例代码:
private static void method01() throws IOException {
// 1. ObjectOutputStream (OutputStream out):根据指定的字节输出流对象创建序列化流的对象;
FileOutputStream fos = new FileOutputStream("E:\\obj.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 把字符串对象序列化到文件中
oos.writeObject("中国");
oos.close();
}
4.2 反序列化
把文件中对象的二进制数据 转成Java对象;
读文件中二进制数据->Java对象;
ObjectOutputStream类:类:
构造方法:
ObjectInputStream(InputStream in):根据输入流创建反序列化流的对象;
成员方法:
Object readObject():反序列化,把文件中的二进制数据转换成Java数据;
示例代码:
public class ObjectInputStreamDemo {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("E:\\obj.txt");
// 1.创建 反序列化流的对象
ObjectInputStream ois = new ObjectInputStream(fis);
// 2.调用反序列化的方法
Object obj = ois.readObject();
System.out.println(obj);
// 3.关闭流
ois.close();
}
}
4.3瞬态关键字transient
是用来修饰变量的,被他修饰的变量不能被序列化到文件中;
5.打印流
可以把数据打印在控制台或者指定的文件中;
有两类:
1.字节打印流 PrintStream类:可以打印任何类型的数据;
2.字符打印流 PrintWriter类:只能打印文本类型的数据;
6. Commons-IO框架
框架:
别人写Java代码变成class文件,然后把class文件压缩到一个jar文件中。
commons-IO 框架是 apache 组织开发;
commons-IO 框架中有一个类FileUtils非常好用,因为里面封装了想文件中写数据,从文件中读数据,拷贝文件,拷贝目录功能方法;
我们开发时,只需要调用这个类相应的方法就可以了,不要自己手工的写那些具体的代码,可以简化工作量,提高工作效率;
在项目中引用第三方框架:
1.在自己工程的根目录下创建一个lib文件夹;
2.把第三方框架的jar包拷贝lib目录下,并jar包添加到 build path 下,右键点击lib下的jar文件->Build Path->add to build;
3.在自己的程序中使用jar中的类;
示例代码:
public class CommonsIoDemo {
public static void main(String[] args) throws IOException {
// File srcFile = new File("E:\\1.jpg");
// File destFile = new File("E:\\2.jpg");
// 1.copyFile方法:复制文件
// srcFile源文件;
// destFile目标文件;
// FileUtils.copyFile(srcFile, destFile);
// 2. copyDirectory:拷贝目录
// 源目录
File srcDir = new File("E:\\projects");
// 目标目录
File destDir = new File("E:\\test");
FileUtils.copyDirectory(srcDir, destDir);
// 3.FileUtils.writeStringToFile(file, data):把date写到file中;
// 4.FileUtils.readFileToString(file):从file中读取数据;
}
}
7.Properties 属性集合
Property 属性Properties复数
属性包含属性名和属性值,就是key 和 value;
作用:
1.可以存储多个键值对,与map集合类似;
2.可以把键值对存储到文件中;
3.可以把文件中的键值对兑取到Properties对象中;
构造方法:
Properyies():创建一个控的属性列表。
成员方法:
String getProperty(String key):根据key从Properties对象中得到value;
String getProperty(String key,String defaultValue):根据key从Properties对象中的到value,如果没有得到就返回默认值;
void load(InputStream inStream):从文件中加载键值对,把键值对存储到Properties对象中;
void store(OutputStream out, String comments):通过输出流把Properties对象中键值对写到文件中,comments是注释文件,也会写到文件中;
Object setProperty(String key, String value): 向Properties对象中添加一个键值对,与map的put方法作用一样;
示例:
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
// 创建一个空的属性列表;
Properties pros = new Properties();
System.out.println(pros);
// 1.Object setProperty(String key, String value): 向Properties对象中添加一个键值对,与map的put方法作用一样
pros.setProperty("小样吧", "咋滴");
pros.setProperty("不服是不", "是啊,咋滴");
pros.setProperty("打你信不", "不信啊,有本事你试试");
pros.setProperty("诶呦喂,这牛逼啊", "就这么牛逼,咋滴");
System.out.println(pros);
// 2. String getProperty(String key):根据key从Properties对象中得到value;
String s1 = pros.getProperty("小样吧");
System.out.println(s1);
// 3. void store(OutputStream out, String comments):通过输出流把Properties对象中键值对写到文件中,comments是注释文件,也会写到文件中;
Properties pors2=new Properties();
pors2.setProperty("made", "gan");
FileOutputStream fos=new FileOutputStream("E:\\41\\copy.txt");
pors2.store(fos, "comments");
fos.close();
}
}