------- android培训、java培训、期待与您交流!----------
一:转换流
转换流实际上就是字符流
OutputStreamWriter:输出转换流
构造方法:
传入一个相应的字节流,返回一个相应的字符流 而这个字符流就是转换流对象
注意:
在使用过程中:将字节流对象转成字符流对象
在本质上:字符流通向字节流的桥梁
InputStreamReader:输入转换流
构造方法:
传入一个相应的字节流,返回一个相应的字符流 而这个字符流就是转换流对象
注意:
在使用过程中:将字节流对象转成字符流对象
在本质上:字节流通向字符流的桥梁
代码实现:
package cn.itcast2; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; public class Demo5 { public static void main(String[] args) throws IOException { method(); } //转换流作为字符流完成文件复制 public static void method() throws IOException { InputStream is = new FileInputStream("g.txt"); InputStreamReader isr = new InputStreamReader(is); OutputStream os = new FileOutputStream("h.txt"); OutputStreamWriter osw = new OutputStreamWriter(os); int c; while((c=isr.read())!=-1) { osw.write(c); } osw.close(); isr.close(); } }
二:字节输入输出流
System.in:字节输入流 从控制台读入 名为标准输入流
System.out: 字节输出流 输出到控制台 名为标准输出流
代码实现:
package cn.itcast2; import java.io.IOException; import java.io.InputStream; public class Demo6 { public static void main(String[] args) throws IOException { // OutputStream os = System.out; // os.write(97); // os.write(98); // os.close(); InputStream is = System.in; int b; while((b=is.read())!=-1) { System.out.println(b); } is.close(); } }
结合前面的IO流,完成需求:从控制台读取,再写到控制台中去
package cn.itcast2; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; public class Demo7 { public static void main(String[] args) throws IOException { //创建字节流对象 InputStream is = System.in; OutputStream os = System.out; //创建字符流对象 InputStreamReader isr = new InputStreamReader(is); OutputStreamWriter osr = new OutputStreamWriter(os); //创建高效字符流对象 BufferedReader br = new BufferedReader(isr); BufferedWriter bw = new BufferedWriter(osr); //读 String line; while((line=br.readLine())!=null) { //定义停止输入的标记字符串 if("byebye".equals(line)) { break; } //写 bw.write(line); bw.newLine(); bw.flush(); } //关闭流 osr.close(); isr.close(); } }
三:数据输入输出流
DataOutputStream:数据输出流
public final void writeXxx(xx x) throws IOException 写出XXX类型的数据
DataInputStream:数据输入流
注意:public final byte readXxx(xx x) throws IOException 读入Xxx类型的数据
在数据输入输出流的操作过程中,必须按照写入顺序读取,否则由于读取规则的不同,会造成乱码。
代码实现:
package cn.itcast; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; public class Demo { public static void main(String[] args) throws IOException { // FileWriter fw = new FileWriter("a.txt"); // fw.write("10"); // fw.close(); int a = 983; DataOutputStream dos = new DataOutputStream(new FileOutputStream("a.txt")); dos.writeInt(a); dos.writeBoolean(true); dos.writeChar('a'); dos.writeDouble(365); dos.writeUTF("i love java 中国"); dos.close(); DataInputStream dis = new DataInputStream(new FileInputStream("a.txt")); System.out.println(dis.readInt()); System.out.println(dis.readBoolean()); System.out.println(dis.readChar()); System.out.println(dis.readDouble()); System.out.println(dis.readUTF()); dis.close(); } }
四:内存操作流
不需要调用底层资源的IO流
ByteArrayOutputStream:字节数组输出流 即将数据写到数组中
ByteArrayInputStream:字节数组输入流 即从数组中读取
CharArrayReader:从数组中读去字符
CharArrayWriter:将字符写到数组中
StringWriter:将字符写到字符串中
StringReader:从字符串中读取数据
注意:
有些IO操作流流关闭无效,不会产生IO异常。如ByteArray操作流与String操作流
代码实现:
package cn.itcast; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Arrays; public class Demo2 { public static void main(String[] args) { /* * CharArrayReader:从数组中读去字符 * CharArrayWriter:将字符写到数组中 * StringWriter:将字符写到字符串中 * StringReader:从字符串中读取数据 */ //创建IO流对象 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //向缓冲区中写出3个字节 baos.write('a'); baos.write('b'); baos.write('c'); //返回缓冲区中的字节数组 byte[] byteArray = baos.toByteArray(); //使用数组工具类打印字节数组内容 System.out.println(Arrays.toString(byteArray)); //创建IO流对象,指定一个字节数组为数据源 ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); //读取数组中的每一个字节 int b; while((b=bais.read())!=-1) { System.out.println((char)b); } } }
五:打印流
专门用来输出的IO流
特点:
专注于输出,不关心数据输入。
可以打印任意类型。
PrintStream :字节打印流
PrintWriter :字符打印流
可以作为普通的输出流。
public void print(char c)
public PrintWriter printf(String format, Object... args)
public void println()
printf与println方法支持自动刷新
代码实现:
package cn.itcast; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; public class Demo3 { public static void main(String[] args) throws IOException { PrintWriter pw = new PrintWriter(new FileOutputStream("b.txt"),true); pw.println(200.0); pw.println(false); pw.print(100.0); pw.print(true); pw.println("i love java"); pw.printf("我是前边的参数%d%d%.2f", 10,20,10.1); // pw.flush(); // pw.close(); } }
六:随机访问流
RandomAccessFile:对文件进行随机访问
特点:
同时支持读与写。
需要指定模式。使用“rw”模式。
随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组,即文件是由字节字节组成的,随机访问流将整个文件看做一个byte数组了;
存在指向该隐含数组的光标或索引,称为文件指针;
该指针可以设置或者获取;
设置指针:public void seek(long pos) throws IOException
获取指针:public long getFilePointer() throws IOException
构造方法:
public RandomAccessFile(File file, String mode) throws FileNotFoundException 需要配合读写模式
EOFException:相当于数组角标越界,即索引的访问异常
代码实现:
package cn.itcast; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class Demo4 { public static void main(String[] args) throws IOException { myWrite(); myRead(); } public static void myWrite() throws IOException { RandomAccessFile raf = new RandomAccessFile("c.txt", "rw"); System.out.println(raf.getFilePointer()); raf.writeInt(998); System.out.println(raf.getFilePointer()); raf.writeDouble(10.1); System.out.println(raf.getFilePointer()); raf.writeUTF("abc中"); System.out.println(raf.getFilePointer()); raf.close(); } public static void myRead() throws IOException { RandomAccessFile raf = new RandomAccessFile("c.txt", "rw"); System.out.println(raf.readInt()); raf.seek(8); System.out.println(raf.readDouble()); System.out.println(raf.readUTF()); raf.close(); } }
七:对象序列化流
ObjectOutputStream:序列化流
public final void writeObject(Object obj) throws IOException
ObjectInputStream:反序列化流
public final Object readObject() throws IOException, ClassNotFoundException
被序列化的对象必须可序列化,即实现序列化接口作为可序列化的标记。
Serializable:序列化接口
无方法,仅作为可序列化标记使用
写出与读入时,序列化ID必须相同
代码实现:
package cn.itcast; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Demo5 { public static void main(String[] args) throws IOException, ClassNotFoundException { // ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d.txt")); // // Person p = new Person("唐嫣",26); // oos.writeObject(p); // // oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d.txt")); Object readObject = ois.readObject(); Person p2 = (Person)readObject; System.out.println(p2.getName()); System.out.println(p2.getAge()); System.out.println(p2); ois.close(); } }
八:Properties
该类是Hashtable的子类。用于存储属性键值对,通常作为配置文件来使用。
特点:
键值对均为字符串
可以直接操作IO流
Properties没有泛型,但是一般情况下,该集合中的键与值均为字符串。
代码实现:
package cn.itcast; import java.util.Properties; import java.util.Set; public class Demo6 { public static void main(String[] args) { //创建集合对象 Properties p = new Properties(); //创建元素对象 //将元素放到集合中 p.put("呼保义", new Person("宋江",28)); p.put("玉麒麟", new Person("卢俊义",32)); p.put("九纹龙", new Person("史进",24)); //迭代集合 Set<Object> keySet = p.keySet(); for (Object key : keySet) { Object value = p.get(key); System.out.println(key+":"+value); } } }
Properties特有方法:
Properties一般作为属性集。里边存储的都为字符串。
public Object setProperty(String key,String value) 为某个属性赋值,即添加元素
public String getProperty(String key) 通过键获取值
public String getProperty(String key, String defaultValue)用指定的键在属性列表中搜索属性。如果没有,就返回默认值
代码实现:
package cn.itcast; import java.util.Properties; public class Demo7 { public static void main(String[] args) { Properties p = new Properties(); p.setProperty("智多星", "吴用"); p.setProperty("入云龙", "公孙胜"); p.setProperty("大刀", "关胜"); System.out.println(p.getProperty("智多星")); System.out.println(p.getProperty("大刀")); System.out.println(p.getProperty("豹子头")); System.out.println(p.getProperty("霹雳火")); System.out.println(p.getProperty("霹雳火","梁山好汉")); } }
Properties与IO相关的方法:
public void list(PrintStream out) 将属性列表输出到指定的输出流。通常用于调试。
public void store(OutputStream out, String comments) throws IOException 将属性列表输出到指定的输出流。
public void load(InputStream inStream)throws IOException 从输入流中读取属性列表(键和元素对)。
代码实现:
package cn.itcast; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; public class Demo8 { public static void main(String[] args) throws IOException { Properties p = new Properties(); p.setProperty("是否隐身", "在线"); p.setProperty("在线状态", "忙碌"); p.setProperty("是否记住密码", "否"); // PrintWriter pw = new PrintWriter("e.txt"); // p.list(pw); // pw.close(); // FileOutputStream fos = new FileOutputStream("e.txt"); // p.store(fos, "hello"); // fos.close(); // FileWriter fw = new FileWriter("e.properties"); // p.store(fw, "hello"); // fw.close(); Properties p2 = new Properties(); FileReader fr = new FileReader("e.properties"); p2.load(fr); fr.close(); System.out.println(p); } }
完成需求:复制多级文件夹
代码实现:
package cn.itcast; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File srcDIR = new File("a"); File destDIR = new File("b"); method(srcDIR,destDIR); } //声明函数定义 public static void method(File srcDIR,File destDIR) throws IOException { //获取源文件夹下的所有文件对象 File[] listFiles = srcDIR.listFiles(); //遍历数组,依次获取每一个文件对象 for (File fileorDIR : listFiles) { //判断是否为文件 if(fileorDIR.isFile()) { File oldFile = fileorDIR; File newFile = new File(destDIR,oldFile.getName()); //新文件所在目录即目标目录,文件名称与老文件名称相同 //复制文件 //创建流对象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oldFile)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile)); //读写 int b; while((b=bis.read())!=-1) { bos.write(b); } //关闭 bos.close(); bis.close(); } else { //文件对象为文件夹 File oldDIR = fileorDIR; File newDIR = new File(destDIR,oldDIR.getName()); //新文件夹所在目录即目标目录,文件夹名称与老文件夹名称相同 //复制文件夹 //创建文件夹 newDIR.mkdir(); //递归调用method完成文件夹复制 method(oldDIR,newDIR); } } } }