IO

来源:互联网 发布:数据库索引的认识 编辑:程序博客网 时间:2024/05/29 19:30

IO作用: 处理设备之间的数据传输

IO分类:

    按照传输方向:

        a.输入流:基类:InputStream,Reader
        b.输出流:基类:OutputStream,Writer

    按照操作数据类型:

        a.字节流:InputStream、OutputStream
        b.字符流:Reader、Writer

IO使用步骤:

    a.创建对象
    b.操作流,并处理异常
    c.关闭流

IO流功能测试

一.IO用于复制演示:

class Demo01_Copy {public static void main(String[] args) {// 创建源文件的读入流。InputStream input = null;// 创建源文件的写出流OutputStream output = null;// 定义缓冲字节数组byte[] buffer = new byte[1024 * 8];try {// 输入输出类类名可以使用绝对路径。而且被写的文件不存在,还可能自动创建文件input = new FileInputStream("a.txt");output = new FileOutputStream("b.txt");// 定义缓冲数组从输入源读取字节数目int len = 0;// 进行读写操作,read(byte[])返回的是读取字节的数量,如果没有读取则返回-1.//如果使用read()方法,会将byte类型数据返回为int//因为将byte类型加上24位零后就不可能为负数。所以返回一个int值在为负数时可以确定没有读取数据。while ((len = input.read(buffer)) != -1) {output.write(buffer, 0, len);}// 关闭输入、输出流。可能会产生异常。OuputStream类的每个方法都会产生IOException异常} catch (FileNotFoundException e) {// 当要读入的文件不存在时,抛出该异常e.printStackTrace();} catch (IOException e) {// 当读写操作失误或者不能关闭异常时,抛出该异常e.printStackTrace();} finally {//输入输出流可能在初始化时爆出异常而没有建立,所以先检查是否为空。if (input != null)try {input.close();} catch (IOException e) {e.printStackTrace();}}if (output != null)try {output.close();} catch (IOException e) {e.printStackTrace();}}}


二.字节缓冲演示

/* * 当不想自己设定缓冲字节数组时,可以使用采用了装饰类设计模式的 BufferedInputStream、BufferedOutputStream类对象.通常来说,自己定义字节数组会比缓冲类速度快一点。因为自己定义的数组少了一次冲数组到数组的复制 但是没有缓冲类易读性强。 */class Demo02_BufferedCopy {public static void main(String[] args) {// 创建源文件的读入流。InputStream input = null;// 创建源文件的写出流OutputStream output = null;// 定义缓冲字节数组byte[] buffer = new byte[1024 * 8];try {input = new BufferedInputStream(new FileInputStream("c.txt"));output = new BufferedOutputStream(new FileOutputStream("d.txt"));// 定义缓冲数组从输入源读取字节数目int len = 0;// 进行读写操作,read(byte[])返回的是读取字节的数量,如果没有读取则返回-1.while ((len = input.read(buffer)) != -1) {output.write(buffer, 0, len);}// 关闭输入、输出流。可能会产生异常。OuputStream类的每个方法都会产生IOException异常//输出流都实现了Closeable、Flushable接口。//在关闭流时会自动刷新流。如果不关闭流,则最后的数据可能不会写入到目标文件中。input.close();output.close();} catch (FileNotFoundException e) {// 当要读入的文件不存在时,抛出该异常e.printStackTrace();} catch (IOException e) {// 当读写操作失误或者不能关闭异常时,抛出该异常e.printStackTrace();}}}


三.关于对于流的关闭和在try块中处理的演示

/* * 在1.7以前的关闭流的异常处理是需要嵌套进行的.例如Demo01_Copy * 在1.7以后可以为try添加文件类型的参数,系统在使用完try语句块后自动关闭流 */class Demo03_Closed {public static void main(String[] args) throws IOException {try(FileInputStream input = new FileInputStream("a.txt");FileOutputStream output = new FileOutputStream("b.txt");MyClose mc = new MyClose();){int b;while((b = input.read()) != -1) {output.write(b);}}}}class MyClose implements AutoCloseable {    public void close() {        System.out.println("我关了");    }}
输出结果:

我关了


四.字符流拷贝文本文件演示演示:

/*字符的拷贝:不推荐这样使用,因为对字符文件的拷贝先读入字节、转换成字符、再将字符转换成字节输出。很浪费资源如果只是复制文件,建议使用字节流使用字符流输入输出一般用于从其他地方(文件、线程、网络)读取字符。或者写字符到其他地方去(文件、线程、网络)。而且写出字符时直接输出系统的是字符而不用转换成字节再输出给系统。*/class Demo04_CharCopy{public static void main(String[] args) throws IOException {//将流装饰到缓冲器中可以减少间断虚拟机系统请求读写的次数,加快读写BufferedReader reader = new BufferedReader(new FileReader("e.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter("f.txt"));//使用BufferedReader的readLine()方法读取一行字符串,如果到达文件末尾就返回nullString line = "";while((line = reader.readLine()) != null) {writer.write(line);}//记得关闭输入输出流。reader.close();writer.close();}}

五.字符流拷贝非文本文件演示演示:

/* * 在读取的时候会将字节转换为字符,转换过程中,可能找不到对应的字符,就会用“?”代替,而写出的时候会将字符转换成字节写出去 * 如果是“?”,直接写出,这样写出之后的文件就乱了,不能够被正常读取。   * 这个文件不能播放 */class Demo05_CharCopyNonText{public static void main(String[] args) throws IOException {//将流装饰到缓冲器中可以减少间断虚拟机系统请求读写的次数,加快读写BufferedReader reader = new BufferedReader(new FileReader("同桌的你.mp3"));BufferedWriter writer = new BufferedWriter(new FileWriter("temp\\同桌的你.mp3"));//使用BufferedReader的readLine()方法读取一行字符串,如果到达文件末尾就返回nullString line = "";while((line = reader.readLine()) != null) {writer.write(line);}//记得关闭输入输出流。reader.close();writer.close();}}

六.使用UTF-8字符集IO演示。

/* * 通过InputStreamReader可以将字节流转换成字符流。而且在其构造方法中还能指定编码格式 * 通过OutputStreamWriter可以将字节流转换成字符流。而且在其构造方法中还能指定编码格式*/class Demo06_UseCharset{public static void main(String[] args) throws IOException {//先使用UTF-8编码文件BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"), "UTF-8"));//要存储的字符串String str = "从明天起,做一个幸福的人\r\n"+ "喂马,劈柴,周游世界\r\n"+ "从明天起,关心粮食和蔬菜\r\n"+ "我有一所房子,面朝大海,春暖花开\r\n";//在文件中写入字符writer.write(str);//关闭输出流writer.close();//定义并且初始化输入流BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"), "UTF-8"));//定义初始化字符串缓存String line = "";while((line = reader.readLine()) != null){System.out.println(line);}//关闭输入流。reader.close();}}


七.关于IO实际应用测试演示:

/* * 当我们下载一个试用版软件,没有购买正版的时候,每执行一次就会提醒我们还有多少次使用机会用学过的IO流知识,模拟试用版软件, * 试用10次机会,执行一次就提示一次您还有几次机会,如果次数到了提示请购买正版 * 分析: 因为每次软件使用完毕后都会退出,如果下次还要使用这一次操作过的数据需要将数据存储在硬盘中。所以需要IO来记录次序。建立输入、输出的流,然后每次对读入的数据进行减一就满足要求。*/class Demo07_LogNums{public static void main(String[] args) throws IOException {//创建带缓冲的输入流对象BufferedReader br = new BufferedReader(new FileReader("config.txt"));//将读到的字符串转换为int类型String line = br.readLine();int times = Integer.parseInt(line);//对int数进行判断,如果大于0,就将其--写回去,如果不大于0,就提示请购买正版if(times > 0) {//在if判断中要将times减去1并且在结果打印,并将结果通过输出流写到文件上System.out.println("您还有" + (times--) + "次机会");FileWriter fw = new FileWriter("config.txt");fw.write(times + "");fw.close();}else {System.out.println("您的试用次数已到,请购买正版");}//关闭流br.close();}}

八.合并输入流演示:

/* * 如果只是想合并两个输入流时可以使用SequenceInputStream(InputStream i1, InputStream i2)。例如multiInputStream中的使用 * 如果想要使用多个InputStream对象,因为SequenceInputStream是InputStream的装饰类所以可以使用SequenceInputStream的迭代 * 例如:SequenceInputStream(SequenceInputStream s1, InputStream i1)…… * 或者使用SequenceInputStream(Enumeration e)进行初始化。例如useEnumeration()中的使用 */class Demo08_SequenceInputStream{public static void main(String[] args) throws IOException {useEnumeration();multiInputStream();}/*使用Vector收集多个InputStream对象,然后返回Enumeration对象enum。再将enum传递给SequenceInputStream对象 */public static void useEnumeration() throws FileNotFoundException,IOException {FileInputStream input1 = new FileInputStream("a.txt");FileInputStream input2 = new FileInputStream("b.txt");FileInputStream input3 = new FileInputStream("c.txt");//通过Vector收集多个InputStream对象,然后返回Enumeration对象enum。避免重新实现Enumeration接口Vector<FileInputStream> vector = new Vector<>();vector.add(input1);vector.add(input2);vector.add(input3);Enumeration<FileInputStream> enumeration = vector.elements();//将返回的Enumeration对象传递给SequenceInputStream对象。SequenceInputStream sequence = new SequenceInputStream(enumeration);FileOutputStream output = new FileOutputStream("d.txt");//读取SequenceInputStream对象中内容然后写入文件int b;while((b = sequence.read()) != -1) {output.write(b);}//关闭流sequence.close();output.close();}public static void multiInputStream() throws FileNotFoundException, IOException {FileInputStream input1 = new FileInputStream("a.txt");FileInputStream input2 = new FileInputStream("b.txt");SequenceInputStream sequence = new SequenceInputStream(input1, input2);FileOutputStream output = new FileOutputStream("c.txt");int b;while((b = sequence.read()) != -1) {output.write(b);}//sequence在关闭的时候,会将构造方法中传入的流对象也都关闭sequence.close();output.close();}}

九.黑马程序员面试题测试。

/* 定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5) 分析: 从文件中读入数据到内存中,可以使用文件输入流 因为要使用read(byte[] b),而且b的长度为5.如果直接在屏幕上打印该字符串,char的字符单元是2.所以如果读入5个字节并且直接打印五个字节可能会出现乱码 需要将读入数组的数据连接并保存起来,然后使用String的构造函数在屏幕上打印 */class Demo09_ByteArrayOutputStream {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("a.txt");//在内存中创建了可以增长的内存数组ByteArrayOutputStream byteArray = new ByteArrayOutputStream();//定义读取数据的个数int len;//定义缓存数组byte[] temp = new byte[5];//将读取到的数据逐个写到内存中while((len = fis.read(temp)) != -1) {byteArray.write(temp, 0, len);}//关闭输入流fis.close();//将获得字节数组取出并转换成字符串byte[] arr = byteArray.toByteArray();System.out.println(new String(arr));//关闭字节流byteArray.close();}}


标准输入输出流

标准输入输出概述:

        System.in:标准输入语句。是InputStream的子类。
        System.out:标准输出语句。是outputStream的实现类PrintStream

打印流:

平常最多使用的是System.out.println()。out是System下自定义的PrintStream对象。该对象自动打印当前系统的字符集。当想要使用其他字符集,需要使用PrintWriter对象。而且println方法可以自动增加换行符。其实标准输出流也是一个打印流。

0 0
原创粉丝点击