一、流 Stream
3步骤:1——明确源和类型 2——明确目的地 3——是否提高效率 (4——是否改变编码形式)1.源和类型
源:内存、键盘、硬盘
类型:纯文本类型——Reader(字符流) 非纯文本类型InputStream(字节流)
FileReader FileInputStream
2.目的地
目的地:内存、硬盘、控制台
类型:纯文本类型——Writer(字符流) 非纯文本类型OutputStream(字节流)
FileWriter FileOutputStream
3.提高效率
BufferedReader BufferedWreter
(4.改变编码形式——转换流)
InputStreamReader OutputStreamWriter
package test.java.io;
import java.io.*;
public class CopyImg {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1源:非文本文件 InputStream-->FileInputStream
//1.1 加入缓冲区 BufferedInputStream
//2目的:非文本文件 OutputStream-->FileOutputStream
//2.1 加入缓冲区 BufferedOutputStream
FileInputStream fi = null;
FileOutputStream fo = null;
BufferedInputStream bufi = null;
BufferedOutputStream bufo = null;
try {
fi = new FileInputStream("1.jpg");
fo = new FileOutputStream("2.jpg");
bufi = new BufferedInputStream(fi);
bufo = new BufferedOutputStream(fo);
int ch = 0;
byte[] arr = new byte[1024];
//循环
while((ch=bufi.read(arr, 0, 1023))!=-1){
bufo.write(arr,0,ch);
}
} catch (IOException e) {
System.out.println(e.toString());
}finally{
try {
if(bufi!=null)
bufi.close();
} catch (Exception e2) {
System.out.println(e2.toString());
}
try {
if(bufo!=null)
bufo.close();
} catch (Exception e3) {
System.out.println(e3.toString());
}
}
}
}
| 二、文件 File
1.操作方法
新建文件对象 --> 如果文件存在 --> 关联
--> 如果文件不存在--> 新建文件 --> 关联
File f = new File("url");
if(!f.exists())
f.createNewFile();
2.属性
名称 路径 绝对路径 大小
三、配置信息 Properties
1.本质
Map子类,其中的内容是以 键值对 形式存在的,表现在文件中是=两边。
2.操作
setProperty("","")方法可以设置键值对
load(InputStream)方法可以加载在文本文件中的信息
store(OutputStream , 注释)方法可以保存信息到文本文件,java中的配置文本后缀名为.properties
3.类型:xml、文本文件
四、对象流 ObjectInputStream-ObjectOutputStream
1.对象的输出流通过 .writeObject()来写入对象,当用集合方法写入多个对象时,可以将null放在集合的最后
2.当文件中存在多个对象时,.readObject()读取一个对象后,自动移至下一个对象,相当于nextObject(),可以将读来的对象与null相比,来判断是否读到了文件的结尾。
package test.java.io;
import java.io.*;
import java.util.ArrayList;
import test.java.entity.Student;
public class ObjectStreamTest {
public static void main(String[] args) throws IOException, ClassNotFoundException{
Student stu1 = new Student("zhanghaitao",20,"man");
Student stu2 = new Student("zhaoji",21,"man");
Student stu3 = new Student("zhangjiayu",23,"man");
Student stu4 = new Student("caizhanqi",22,"man");
File f = new File("student.obj");
// writeObject(stu1,f);
// Student stu3 = null;
System.out.println("----------> start <--------");
//读取文件内存在的对象
ArrayList<Object> arr= readObject(f);
if(arr!=null)
System.out.println("arr不是空的");
for(Object stu : arr){
if(stu!=null)
System.out.println(stu);
}
//向文件内写入对象
// ArrayList<Object> arr = new ArrayList<Object>();
// arr.add(stu1);
// arr.add(stu2);
// arr.add(stu3);
// arr.add(null);
// arr.add(stu1);
// writeObject(arr,f);
System.out.println("-----------> End <--------");
}
public static ArrayList<Object> readObject(File f) throws IOException, ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
ArrayList<Object> objs = new ArrayList<Object>();
Object obj = null;
while((obj = ois.readObject())!=null){
objs.add(obj);
}
ois.close();
return objs;
}
public static void writeObject(ArrayList<Object> objs,File f) throws IOException{
if(!f.exists())
f.createNewFile();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f,true));
for(Object obj : objs){
oos.writeObject(obj);
}
oos.close();
}
}
| 五、随机存取类 RandomAccessFile
1.本质
他并不属于文本、字符输入输出流,他继承自Object类,他有着自己的读取字节、存储字节的方法,但他也属于IO体系中的一员,并且有着极为强大的功能。
2.核心
他之所以被称之为随机存取类,就是因为它能够通过 .seek()方法,跳跃性的去读取、存数字节,就像是将整个文件的内容存放进了数组一样。
六、编码
1.GBK能够识别中文 UTF-8也能识别中文 ISSO8559-1不能识别中文
不能互相是别的——编码 一次 解码一次 搞定
能相互识别的——
2.现象:在notepad中只存储“联通”两个字,打开后,出现乱码。
解释:在UTF-8编码格式中,当用单个字符时 打头01 双字符 110 10 三字符 1110 10 10
联通的编码正好是11000001
10101010
11001101
10101000
也就是说,用GBK格式存储的“联通”正好符合UTF-8的格式,被notepad捕捉到第一个字符的编码后,以UTF-8模式解码,所以出现乱码。
解决:在“联通”之前,加入其它的中文字符
|
|