黑马程序员---Java基础---IO流(三)

来源:互联网 发布:360浏览器mac版下载 编辑:程序博客网 时间:2024/06/05 09:42

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


一.打印流

         1.什么是打印流

                   PrintStream是一个打印流, 在程序中输出数据的时候经常使用这个流, 它既可以输出字节, 也可以输出字符.

                   通常使用PrintStream都是输出指定对象toString()方法的返回值

         2.怎么使用

                   创建PrintStream可以指定一个文件写出, 也可以指定一个字节输出流,可以指定码表和自动flush()

                   print()和println()方法都可以将指定对象的toString()返回值写出

                   println()在写出之后加上换行符号

package it.io2;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;import java.io.UnsupportedEncodingException;public class PrintStreamDemo {public static void main(String[] args) throws IOException {//demo1();//demo2();//demo3();//demo4();//demo5();}//创建PrintStream可以指定一个文件写出, 也可以指定一个字节输出流, 可以指定码表和自动flush()public static void demo5() throws FileNotFoundException,UnsupportedEncodingException {BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("file.txt"));PrintStream ps = new PrintStream(bos, true, "UTF-8");//每次输出之后自动调用flush()ps.println("张三");ps.println("李四");ps.println("王五");ps.close();}//PrintStream的print和println方法可以打印实参对象的toString()返回值public static void demo4() throws FileNotFoundException {PrintStream ps = new PrintStream("file.txt");ps.println(97);// 原理: 97 -> new Integer(97) -> toString() -> "97"ps.println(98);ps.println(99);ps.close();}//PrintStream的print和println方法写出一个对象的时候,会将对象的toString()返回值写出public static void demo3() throws FileNotFoundException, UnsupportedEncodingException {Person p1 = new Person("张三", 19);Person p2 = new Person("李四", 23);PrintStream ps = new PrintStream("file.txt", "UTF-8");//指定码表写出ps.println(p1);ps.println(p2);ps.close();}//PrintStream的print和println方法可以写出字符public static void demo2() throws FileNotFoundException {PrintStream ps = new PrintStream("file.txt");ps.println("张三");ps.println("李四");ps.println("王五");ps.close();}//PrintStream是继承与OutputStream的,可以当作一个普通的字节输出流使用public static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("fiel.txt");PrintStream ps = new PrintStream("file1.txt");byte[] buffer = new byte[8192];int len;while ((len = fis.read(buffer)) != -1)ps.write(buffer, 0, len);fis.close();ps.close();}}
                   

二.标准输入输出流

         1.什么是标准输入输出流

                   System.in是一个InputStream,它是标准输入流, 默认可以从键盘输入读取字节.

                   System.out是一个PrintStream,它是标准输出流, 默认可以向屏幕输出数据.

         2.改变标准输入输出流

                   使用System.setIn(InputStream)可以将标准输入流指向其他数据源

                   使用System.setOut(PrintStream)可以将标准输出流指向其他的数据目的地

package it.io2;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;public class StandardStreamDemo {public static void main(String[] args) throws IOException {//demo1();//demo2();}// 使用System.setIn(InputStream)可以将标准输入流指向其他数据源public static void demo2() throws FileNotFoundException, IOException {System.setIn(new FileInputStream("file.txt"));BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.println(br.readLine());}// 使用System.setOut(PrintStream)可以将标准输出流指向其他的数据目的地public static void demo1() throws FileNotFoundException {System.setOut(new PrintStream("file.txt"));System.out.println("Hello Wolrd!");}}
                   

三.字节数组输出流

         1.什么是字节数组输出流

                   ByteArrayOutputStream是一个可以向内存中写出字节的一个输出流, 通常可以作为一个缓冲区使用

         2.怎么使用

                   创建对象之后, 可以向ByteArrayOutputStream写入字节数据, 这些数据都会在内存中存储.

                   可以调用toByteArray()方法将写入的数据一次性获取出来

                   如果想清空数据, 可以调用reset()方法

                   获取长度可以调用size()方法

         3.应用场景

                   读取一个文件中的文本数据,转为字符串.

                   如果使用普通的字符输入流读取, 那么会每读一两个字节转为一个字符, 这样效率较低.

                   可以使用FileInputStream将文件数据读取, 写入到ByteArrayOutputStream中, 将文件中所有内容都写入.

                   然后使用ByteArrayOutputStream的toByteArray()方法一次性获取数据转为字符.

package it.io2;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;public class ByteArrayOutputStreamDemo {public static void main(String[] args) throws IOException {//demo1();//demo2();//demo3();//demo4();}//用ByteArrayOutputStream读取字符数据public static void demo4() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("file.txt");ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[8192];int len;while ((len = fis.read()) != -1)baos.write(buffer, 0, len);//将文件中所有数据写入到内存中fis.close();baos.close();String content = new String(baos.toByteArray());//吧内存中的数据取出,一次性转为字符System.out.println(content);}//读取字符public static void demo3() throws FileNotFoundException, IOException {FileReader fr = new FileReader("file.txt");int i;while ((i = fr.read()) != -1)System.out.println((char)i);fr.close();}//用ByteArrayOutputStream写入字节数据public static void demo2() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("file.txt");ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[8192];int len;while ((len = fis.read(buffer)) != -1)baos.write(buffer, 0, len);//将文件中所有数据写入到内存中fis.close();baos.close();byte[] data = baos.toByteArray();//获取内存中的数据FileOutputStream fos = new FileOutputStream("file1.txt");fos.write(data);//一次性写出到文件fos.close();}//字节流拷贝public static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("file.txt");FileOutputStream fos = new FileOutputStream("file1.txt");byte[] buffer = new byte[8192];int len;while ((len = fis.read(buffer)) != -1)fos.write(buffer, 0, len);fis.close();fos.close();}}
                   

四.数据输入输出流

         1.什么是数据输入输出流

                   DataInputStream,DataOutputStream, 可以按照基本数据类型大小读写数据

         2.怎么使用

                   使用DataOutputStream可以按照基本数据类型大小写出, 例如: writeInt()方法可以写出一个int值, 占4个字节. writeLong()可以写出long值, 占8个字节

                   使用DataInputStream可以读取DataOutputStream写出的数据, 例如: readInt()可以读取4个字节,readLong()可以读取8个字节

package it.io2;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class DataStreamDemo {public static void main(String[] args) throws IOException {//记录程序使用次数,从文件读取使用次数,加1在写出//demo1();//只能写0到255//demo2();//每次需要转换//demo3();//可以按照基本数据类型大小读写数据}public static void demo3() throws FileNotFoundException, IOException {DataInputStream dis = new DataInputStream(new FileInputStream("file.txt"));int x = dis.readInt();System.out.println(x++);dis.close();DataOutputStream dos = new DataOutputStream(new FileOutputStream("file.txt"));dos.writeInt(x);;dos.close();}public static void demo2() throws FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new FileReader("file.txt"));int x = Integer.parseInt(br.readLine());System.out.println(x++);br.close();BufferedWriter bw = new BufferedWriter(new FileWriter("file.txt"));bw.write(x + "");bw.close();}public static void demo1() throws FileNotFoundException, IOException {FileInputStream fis = new FileInputStream("file.txt");int x = fis.read();System.out.println(x++);fis.close();FileOutputStream fos = new FileOutputStream("file.txt");fos.write(x);fos.close();}}
         

五.对象输入输出流

         1.什么是对象输入输出流

                   ObjectInputStream,ObjectOutputStream, 可以读写对象

         2.怎么使用

                   使用ObjectOutputStream.writeObject()方法可以写出一个实现了Serializable接口的对象

                   使用ObjectInputStream.readObject()方法可以读取ObjectOutputStream写出的对象

         3.读写多个对象

                   如果需要写出多个对象, 通常会将多个对象存入集合,然后将集合写出

                   读取的时候读到集合, 遍历集合即可

package it.io2;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.Collections;public class ObjectStreamDemo {public static void main(String[] args) throws IOException, ClassNotFoundException {//demo1();//读对象//demo2();//存对象}public static void demo1() throws IOException, FileNotFoundException,ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.txt"));ArrayList<Person> al = (ArrayList<Person>) ois.readObject();ois.close();for (Person p : al) System.out.println(p);}public static void demo2() throws IOException, FileNotFoundException {Person p1 = new Person("张三", 90);Person p2 = new Person("李四", 80);Person p3 = new Person("王五", 95);ArrayList<Person> al = new ArrayList<Person>();Collections.addAll(al, p1, p2, p3);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.txt"));oos.writeObject(al);oos.close();}}
         

六.序列流

         1.什么是序列流

                   SequenceInputStream可以用来把多个输入流合并成一个

         2.怎么使用

                   使用构造函数可以接收2个InputStream,或者一个包含多个InputStream的Enumeration

                   创建SequenceInputStream之后, 读取的时候内部会从第一个流逐个读取, 直到所有的流都读完才读到末尾

package it.io2;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.SequenceInputStream;import java.util.ArrayList;import java.util.Collections;import java.util.Enumeration;import java.util.Vector;public class SequenceInputStreamDemo {public static void main(String[] args) throws IOException {//demo1();//demo2();}public static void demo2() throws FileNotFoundException, IOException {FileInputStream fis1 = new FileInputStream("a.txt");FileInputStream fis2 = new FileInputStream("b.txt");FileInputStream fis3 = new FileInputStream("c.txt");ArrayList<InputStream> al = new ArrayList<InputStream>();//为了得到Enumeration创建ArrayListCollections.addAll(al, fis1, fis2, fis3);//装入输入流Enumeration<InputStream> e = Collections.enumeration(al);//获取EnumerationSequenceInputStream sis = new SequenceInputStream(e);//合并流FileOutputStream fos = new FileOutputStream("file.txt");int i;while ((i = sis.read()) != -1)//使用SequenceInputStream读取时,先从第一个流开始读,读完读第二个,直到所有的都读完返回-1fos.write(i);sis.close();fos.close();}public static void demo1() throws FileNotFoundException, IOException {FileInputStream fis1 = new FileInputStream("a.txt");FileInputStream fis2 = new FileInputStream("b.txt");SequenceInputStream sis = new SequenceInputStream(fis1, fis2);//创建序列流,合并两个输入流FileOutputStream fos = new FileOutputStream("file.txt");int i;while ((i = sis.read()) != -1)//使用SequenceInputStream读取时,先从第一个流开始读,读完读第二个,直到所有的都读完返回-1fos.write(i);sis.close();fos.close();}}
                   

七.IO总结

         1.字节流拷贝文件

                   FileInputStream和FileOutputStream,自定义数组

                   BufferedInputStream和BufferedOutputStream,内置缓冲区

         2.字符流读写文本文件

                   InputStreamReader,FileReader, BufferedReader读取字符数据

                   OutputStreamWriter,FileWriter, BufferedWriter写出字符数据

         3.File类

                   拷贝文件夹


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

0 0