JAVA基础知识总结4——IO

输出和输入都是以程序为中心

File类:代表系统文件名(路径和文件名)    
        可以进行创建、删除文件和路径等操作,只对文件本身进行操作,并不涉及文件的具体内容
        路径分隔符常量:public static final String separator;
                        String separator = File.separator;   
        创建带路径的文件:
                创建文件前判断父路径(getParentFile()取得父路径)是否存在,
                如果不存在则应该先创建目录(mkdirs()创建多级目录),再创建文件
        列出指定目录下的所有文件及子目录信息(FileList.java)
                先判断给定的路径是否是目录,如果是则应该列出,再对每个子目录进行判断
                采用递归的方式
        判断文件是否存在:public boolean exists();
                
java.io包中定义了多个流类型来实现输入输出功能
所有的流类型都分别继承四个抽象流(抽象类),
                字节流      字符流
    输入流:IntputStream    Reader
    输出流:OutoutStream    Writer
继承自IntputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
继承自Writer的流都是用于向程序中输入数据,且数据的单位为字符(16 bit)
继承自Reader的流都是用于向程序中输出数据,且数据的单位为字符(16 bit)
继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8 bit)

节点流:可以从一个特定的数据源(节点)读写数据(如文件、内存),
处理流:“连接”在已存在的流(节点流和处理流)之上,通过对数据处理为程序提供更强大的读写功能

流相当于一个管道,比如fileInputStream就是连接在文件的上一个管道。
FileInputStream in = new FileInputStream("E:\\Java\\eclipse-jee-mars-R-win32-x86_64 JDK 1.7+\\MyProject\\mydir1\\mydir2\\myfile2.txt");
in这个对象(管道)就连接在文件myfile2.txt上,可以从文件中输出数据,输入到程序中

处理流就是在管道外面再套一层管道,BufferedInputStream属于处理流。
BufferedInputStream bis = new BufferedInputStream(in),
bis这个对象(管道)就是套在in这个管道外面的一个管道,也可以从文件myfile2.txt上得到数据

输出一般用打印流,输入一般用BufferedReader或者扫描流

输出
OutputStream常用方法:
a、public void close() throws IOException 关闭字节输出流
b、flush()这个函数是清空的意思,用于清空缓冲区的数据流,
    进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,
    那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失
c、public void write(byte b[], int off, int len) throws IOException  输出部分字节数组数据
d、c表明使用OutputStream输出数据必须是字节类型数据,为了解决这个问题,java提供了打印流

FileOutputStream是抽象类OutputStream的一个字类,用于进行文件操作
构造方法:public FileOutputStream(File file) throws FileNotFoundException   
            一根管道插在了文件file上面,用于程序向文件输出数据
举例:    P478

输入
字符缓冲流输入:a、    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in))
                    //System.in是InputStream类对象,BufferedReader的构造方法里面需要接收Reader类对象
                    //利用InputStreamReader将字节流对象变为字符流对象
                 b、 BufferedReader in = new BufferedReader(new FileReader(file));
                    String str=in.readLine();
重点                //BufferedReader是Reader的子类,具有readLine方法(读一行数据,且以String类型的形式返回)
            
字节流和字符流的区别:
        a、字节流直接与终端文件进行数据交互,字符流需要将数据经过缓冲区处理才与终端文件数据交互
        b、字符流可以对中文进行有效处理,如果没有中文则推荐使用字节流
            
转换流:InputStreamReader、OutputStreamWriter
        构造方法:public InputStreamReader(InputStream in)
        InputStreamReader类的构造方法中接受InputStream类的对象,
        而InputStreamReader是Reader类的子类,该类可以向上转型成Reader类对象,
        这样可以把字节输入流转换成字符输入流
        
打印流: 
        PrintStream(字节打印流)、PrintWriter(字符打印流)
        PrintStream是OutputStream的子类
        PrintStream的方法:
            构造方法:public PrintStream(OutPutStream out)
            普通方法:public void print()
                      public void println()

System.out是进行屏幕输出的操作对象,是一个PrintStream类的实例化对象
            由于PrintStream是OutputStream的子类,所以也可以利用System.out为OutputStream类进行实例化
            OutPutStream out = System.out;
            Out.write("cqubob".getBytes[]);
System.in是进行键盘输入的操作对象,是一个InputStream类的实例化对象
            InputStream input = System in;
            byte data[] = new byte[1024];
            int len = input.read(data);
            System.out.println(new String(data,0,len))

扫描流:java.util.Scanner
        构造方法:public Scanner(InputStream source)  接受InputStream输入流对象,以此为输入源
        方法:public boolean hasNext()   判断是否有数据输入
              public String next()         取得数据,以String的形式返回
              public Scanner useDelimiter(String pattern) 设置读取的分隔符
        P512、
内存流: ByteArrayInputStream(内存字节输入流)、ByteArrayOutputStream(内存字节输出流)
            构造方法:public ByteArrayInputStream(byte buf[])
            构造方法:public ByteArrayOutputStream()
            在内存流实例化对象时就必须准备好要操作的数据信息,
            内存流的操作实质就是将操作数据先保存到内存(不是程序)中,然后利用IO流操作进行单个字节的处理
            P498

对象序列化:将内存中所保存的对象数据转换为二进制数据流进行传输的操作
            实现Serializable接口的类可进行序列化操作
            在开发中只有需要传输对象所在的类时才需要实现Serializable接口,主要是指简单java类
            一个类中的属性如果使用transient关键字声明,则此属性的内容不会被序列化
            对象的输入输出主要使用ObjectInputStream和ObjectOutputStream类完成
            
            
以后开发中,只要操作的不是二进制数据,输出都使用打印流,输入使用扫描流或者字符缓冲区输入流

猜你喜欢

转载自blog.csdn.net/qq_38635681/article/details/84144789