黑马程序员——java学习日记1——IO部分总结

时间:2023-02-18 07:28:55

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、流 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) {
// TODO: handle exception
System.out.println(e.toString());
}finally{
try {
if(bufi!=null)
bufi.close();
} catch (Exception e2) {
// TODO: handle exception
System.out.println(e2.toString());
}
try {
if(bufo!=null)
bufo.close();
} catch (Exception e3) {
// TODO: handle exception
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{
// TODO Auto-generated method stub
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模式解码,所以出现乱码。         解决:在“联通”之前,加入其它的中文字符