------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模式解码,所以出现乱码。
解决:在“联通”之前,加入其它的中文字符