zoukankan      html  css  js  c++  java
  • java-IO编程

    输入与输出

    将数据读入到虚拟机中==>输入

    将数据从内部到外部存储起来或显示出来(如输出到控制台)==>输出

    IO概念

    在传输数据的时候,需要一个流(对象)的概念。而流简单而言就是内存与存储设备之间传输数据的通道,管道

    JVM(虚拟机)

    磁盘上的文件作为数据源。

          流<=========文件

    虚拟机   ======

    将磁盘上的文件传到虚拟机中。

    IO流的分类:

    1)按方向分:(以虚拟机为参照物-重点)

      输入流:将<存储设备>中的内容读到<内存中>。==>读数据

      输出流:将<内存>中的内容写入到<存储设备>中。==>写数据

    输入和输出来说是相对虚拟机来说的。

    2)按单位(按照数据的):

      字节流:以字节为单位,可以操作所有类型的文件。

      字符流:以字符为单位,只能操作文本类型的文件。

    纯文本类型:.txt,.java,.html,.xml,.log等等(拿记事本打开能看懂的就是纯文本)

    3)按照流的功能分为:

      节点流:完成数据读写。

      过滤流:为节点流或其他流增强功能(过滤流可以看成节点流的装饰)。这就好比军人的使命是打仗,文工团(唱歌跳舞的)会让士气更高涨。这种设计来自于java中的设计模式,装饰模式。装饰模式解决了什么问题?

    装饰模式能解决需要组合功能的类。如武器是父类,其子类中零件和枪,零件就是过滤流。

    1.创建节点流

    2.包装过滤流

    3.读写数据

    4.关闭流

    字节流:

      InputStream是字节输入流的父类==>所有字节输入流都是InputStream的子类(只要看见XXXInputStream,就可以判断是字节输入流)  抽象类

      int read()读一个字节 返回值:读到的字节数据  返回-1表示结束;

      int read(byte[] bs):尝试读满bs数组 返回值:读到的字节个数 返回-1表示结束

      int read(byte[] bs,int start, int length):尝试读满bs数组中的一段   返回值:读到的字节个数 返回-1表示结束

      OutputStream是字节输出流的父类==>字节输出流都是OutputStream的所有子类(只要看见XXXOutputStream,就可以判断是字节输出流)抽象类

      write(int a): (byte)a是一个字节 

      write(int a): (byte[] bs): 将bs数组中所有数据写出去

      write(int a): (byte[] bs,int start,int length): 将bs数组中数据中的一段写出去

      write(int a): (byte[] bs,0,bs.length): 将bs数组中所有数据(写到length-1)写出去相当于write(s)

    InputStream,OutputStream这两个既非节点流,又非过滤流,它们是父类,没有节点过滤这一说。他们都是抽象类。

    FileInputStream/FileOutputStream 文件字节流         节点流

    文件的写入:

    package day22;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    public class TestFileOutputStream {
    
    	public static void main(String[] args) throws IOException{
         OutputStream out=new FileOutputStream("a.txt");
    //     out.write('A');
         out.write(65);
    	//流是一种资源,在代码结束后应该释放
         out.close();
    	}
    
    }
    

      资源保存在当前项目下,可以直接按照路径搜索,找到如下文件证明成功写入。

    向文件中写入数组:

    package day22;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    public class TestFileOutputStream {
    
    	public static void main(String[] args) throws IOException{
         OutputStream out=new FileOutputStream("a.txt");//文件不存在创建,存在覆盖掉
    //     如果想追加怎么办?new FileOutputStream("a.txt",A)这里的A指的是true或false,随便写
    //     out.write('A');
    //     out.write(65);
    	//流是一种资源,在代码结束后应该释放
         String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         byte[] bs=str.getBytes();
         out.write(bs);
         out.close();
    	}
    
    }
    

      代码运行后查看结果:

    IO操作几乎每句话都是需要抛出异常的。

     不用throws怎么处理呢?

    代码:

    package day22;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    public class TestFileOutputStream {
        public static void main(String[] args) {
            OutputStream out = null;
            try {
                out=new FileOutputStream("a.txt");
                String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                byte[] bs=str.getBytes();
                out.write(bs);
        }
            catch(Exception e){
                e.printStackTrace();
            }
            finally {
                //有异常的时候可能流没有关系
                if(out!=null)
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
        }
    }

    FileInputStream  字节输入流  节点流

    例子:

    package day22;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class TestFileInputStream {
    
    	public static void main(String[] args)throws IOException {
    		InputStream in = new FileInputStream("a.txt");
    		byte[] bs=new byte[10];
    		while(true) {
    			int len=in.read(bs,2,7);
    			  /*输入数据流的操作,in为一个inputstream对象,read()是in的方法,
    			  每次读取一个字节的二进制数据,并判断in.read()的值是否等于-1,
    			  当in.read()值等于-1时,代表数据读取完毕,最后将输入流的值赋值给c*/
    			if(len==-1) break;
    			System.out.print(len+":");
    			for(int i=0;i<len;i++) {//一个一个的读
    				System.out.print((char)bs[i]+" ");
    			}
    			System.out.println();
    		}
    		in.close();
    	}
    
    }
    

      运行截图:

     用节点流实现文件拷贝:

      文件拷贝要求新文件和老文件的大小一致(IO的数据交换速度得快)

    有原文件 ,目标文件     文件输入流把文件读到虚拟机里边,虚拟机再把读到的内容通过一个问件输出流写到目标文件里。

    数据过滤流:

      DataInputStream/DataOutputStream 功能:读写八种基本类型和字符串   过滤流 

    输入流

    InputStream

  • 相关阅读:
    Linux的优缺点,Linux与windows的区别
    一文带你读懂 Mysql 和 InnoDB存储引擎
    由浅入深一个Demo带你认识Restful风格的架构
    同步锁Synchronized与Lock的区别?
    认识多线程中start和run方法的区别?
    Java多线程与并发相关问题
    初识WebSocket
    Tomcat与Nginx服务器的配合使用及各自的区别
    Java内存模型相关原则详解
    你对区块链的理解还停留在炒币上吗
  • 原文地址:https://www.cnblogs.com/SpringChuXin/p/13941963.html
Copyright © 2011-2022 走看看