zoukankan      html  css  js  c++  java
  • JAVA 基础IO流

    java.io 包中定义了所有的"流"类

    如何分类:

    按数据流的方向不同可以分为输入流和输出流,读取文件的时候就是数据流

    按处理数据单位不同可以分为字节流和字符流,字节(一个字节)010101读的时候,字符(UNCODE 两个字节):一个字符一个字符读的时候

    按功能不同的可以分为节点流和处理流:个人理解的话,节点流其实就是上面说的直接通过InputStream OutputStream Reader Writer 单类进行读取的,而处理流就是要在正常的读取上进行更一步的细化细分,比如 FileInputStream放到了BufferedInputStream中去这种进行包装之后的就叫做处理流

    输入流和输出流:

    举个例子,如果一个程序要从文件中读取数据,那么这个流是输入流和输出流?

    这个应该是相对的,如果对于程序来说这个肯定是输入流,应该要把文件中的数据输入到自身中,但是对于文件来说,那就是输出流,因为自身的数据被读取出来

    重点:以后我们都是站到程序的角度上去理解,所以读取文件就要用输入流!!!

    凡事以Stream结尾的类都是字节类InputStream OutputStream,字符流的话一般都是Reader Writer(读取的是两个字节的)

    需要注意的是:刚才Stream的话是相对于程序的,但是这里Reader就是相对于文件的,比如读取文件用的就是Reader,所以这样理解!

    先看输入流输出流,这里用到的是FileInputStream 和 FileOutputStream,它们继承于InputStream 和 OutputStream类

    FileInputStream的如下举例,这里实现了通过FileInputStream对象将文件的内容读取出来,并且通过ByteArrayOutputStream对象来将该流中的内容进行保存,所以如果不想要保存的话其实也可以直接输出,看你自己怎么用了

    package com.zpchcbd.stream;
    
    import java.io.*;
    import java.util.Arrays;
    
    public class MyFileInputStream {
        public static void main(String[] args) throws IOException {
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\test.txt");
            }catch (FileNotFoundException e){
                System.out.println(e);
                System.exit(-1);
            }
    
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    
            byte[] bytes = new byte[1024];
            int iReadSize = 0;
            try {
                while((iReadSize = fileInputStream.read(bytes)) != -1){
                    byteArrayOutputStream.write(bytes,0,iReadSize);
                }
            }catch (IOException e){
                System.out.println(e);
            }
            fileInputStream.close();
            byteArrayOutputStream.close();
            System.out.println(bytes.toString());
        }
    }
    

    通过,代码如下:

    public class MyFileOutputStream {
        public static void main(String[] args) throws IOException {
            FileOutputStream fileOutputStream = new FileOutputStream("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\wwww.txt");
            String szBufferContent = "aaaaaaaaaaa";
            fileOutputStream.write(szBufferContent.getBytes());
        }
    }
    

    继续看FileReader类,跟流的功能一样,但是唯一的区别就是读取单位的大小不同,Reader、Writer这种一次读取是读两个字节的!!!

    public class MyFileReader {
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\test.txt");
            char[] chars = new char[1024];
            int iReadSize = 0;
            while((iReadSize = fileReader.read(chars)) != -1){
                System.out.println(chars);
            }
            fileReader.close();
        }
    }
    

    那么类似的FileWriter类,实现的代码如下,就直接实现一个简单的通过FileReader和FileWriter实现读写的文件操作:

    package com.zpchcbd.stream;
    
    import javax.swing.*;
    import java.io.*;
    
    public class MyFileWriter {
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\test.txt");
            FileWriter fileWriter = new FileWriter("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\qqqq.txt");
            char[] chars = new char[1024];
            int iReadSize = 0;
            while((iReadSize = fileReader.read(chars)) != -1){
                fileWriter.write(chars);
            }
            fileReader.close();
            fileWriter.close();
        }
    }
    

    缓存流

    继续讲,关于什么是缓冲流(其实是处理流中的一种,进行了封装) 比如BufferedInputStream类 和 BufferedOutputStream类,这种流就是对基本输入流和输出流的增强,提供了一些新的方法以便于更方便的处理

    可以看下这些类的构造方法,如下可以看出它是需要一个普通的输入流和输出流作为支撑的,其实也好理解要不然怎么增强呢,一定是基于某种基础上继续加强

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    

    实现方法如下,原本想试下,但是发现mark 和 reset函数不见效,那么这里BufferOutputStream其实也是类似的!

    public class MyBufferInputStream{
        public static void main(String[] args) throws IOException {
            FileInputStream fileInputStream = new FileInputStream("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\wwww.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int iReadSize = 0;
            byte[] bytes = new byte[1024];
            System.out.println(bufferedInputStream.read());
            System.out.println(bufferedInputStream.read());
    
    
            //bufferedInputStream.mark(100);
            while((iReadSize = bufferedInputStream.read(bytes)) != -1){
                byteArrayOutputStream.write(bytes, 0, iReadSize);
            }
            System.out.println(byteArrayOutputStream.toString());
            //bufferedInputStream.reset();
    //        while((iReadSize = bufferedInputStream.read(bytes)) != -1){
    //            byteArrayOutputStream.write(bytes, 0, iReadSize);
    //        }
    //        System.out.println(byteArrayOutputStream.toString());
            bufferedInputStream.close();
            byteArrayOutputStream.close();
        }
    }
    

    BufferWriter,不同点其实就是读取的字节单位大小,并且还提供了一写好使用的方法,实现的代码如下,这样实现了读取一个字符能够换行的代码!

    小提醒:在BufferedReader还提供了一个readline的方法用来读取一行,这里自己就没写了

    public class MyBufferedWriter {
        public static void main(String[] args) throws IOException {
            FileReader fileReader = new FileReader("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\wwww.txt");
            FileWriter fileWriter = new FileWriter("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\asdasd.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    
            int iReadSize = 0;
            while((iReadSize = bufferedReader.read()) != -1){
                bufferedWriter.write(iReadSize);
                bufferedWriter.newLine();
            }
    
            bufferedWriter.flush();
            bufferedReader.close();
            bufferedWriter.close();
        }
    }
    

    转换流

    继续讲,什么是转换流?就是能够实现将字符流与字节流进行相互转换,OutputStreamWriter类 和 InputStreamReader类

    OutputStreamWriter类的使用:

    例如OutputStream 转换为 Writer来进行写入

    public class MyOutputStreamWriter {
        public static void main(String[] args) throws IOException {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\qzczc.txt"));
            outputStreamWriter.write("123123123");
            System.out.println(outputStreamWriter.getEncoding());
    
            // 扩展:还可以进行追加写入
            outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\Users\dell\Desktop\ALL\javaidea\MyFirstTestMaven\javaApp2\servlet1\qzczc.txt", true), "ISO8859_1");
            System.out.println(outputStreamWriter.getEncoding());
            outputStreamWriter.write("321312321");
            outputStreamWriter.close();
        }
    }
    

    InputStreamReader类的使用:

    public class MyInputStreamReader {
        public static void main(String[] args) throws IOException {
            InputStreamReader inputStreamReader = new InputStreamReader(System.in); // System.in默认是一个输入流,这个System.in输入流当进行接收的时候会堵塞
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //能够使用readline方法,更好的测试读取
    
            String szBuffer;
            szBuffer = bufferedReader.readLine();
            while(szBuffer != null){
                System.out.println(szBuffer);
                szBuffer = bufferedReader.readLine();
            }
    
            bufferedReader.close();
        }
    }
    

    数据流

    DataInputStream 和 DataOutputStream 分别继承自 InputStream 和 OutputStream,它们属于处理流,是在InputStream 和 OutputStream类型的节点流是上。

    通过它们这两个类可以实现存取与机器无关的Java原始类型数据的方法

    唯一需要注意的就是读取的时候是谁先写入先读谁的,那么也就是dataOutputStream中的数据结构是队列!

    public class MyDataOutputStream {
        public static void main(String[] args) throws IOException {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
            dataOutputStream.writeBoolean(true);
            dataOutputStream.writeFloat((float) 0.1);
    
    
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream);
            boolean bRet =  dataInputStream.readBoolean();
            System.out.println(bRet);
            float fnum = dataInputStream.readFloat();
            System.out.println(fnum);
        }
    }
    

    Print流

    PrintWriter PrintInputStream 都属于输出流,分别针对的是字符和字节

    1、通过设置系统标准输出的位置,来通过System.out.println来进行写文件

    public class MyPrinterStream {
        public static void main(String[] args) throws FileNotFoundException {
            FileOutputStream fileOutputStream = new FileOutputStream("./aaa.txt");
            PrintStream printStream = new PrintStream(fileOutputStream);
            System.setOut(printStream);
            System.out.println("aaaaaaaaa");
        }
    }
    

    2、通过命令行窗口中输入内容,将内容写入到指定文件中

    public class MyPrinterWriter {
        public static void main(String[] args) throws IOException {
            InputStreamReader inputStreamReader = new InputStreamReader(System.in); //这里的System.in 是一个InputStream
            String s = null;
    
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            FileWriter fileWriter = new FileWriter("./asd.txt");
            PrintWriter printWriter = new PrintWriter(fileWriter);
            while((s = bufferedReader.readLine()) != null){
                if(s.toLowerCase().equals("exit"))break;
                System.out.println(s);
                printWriter.write(s);
                bufferedReader.readLine();
            }
            printWriter.close();
            bufferedReader.close();
        }
    }
    

    Object流

    接口为Serializable序列化和反序列化的实现:

    public class MyObjectInputStreamAndOutputStream {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            FileOutputStream fileOutputStream = new FileOutputStream("./object.txt");
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
    
            T t1 = new T();
            t1.a = 5555;
            objectOutputStream.writeObject(t1);
    
    
            FileInputStream fileInputStream = new FileInputStream("./object.txt");
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            T t2 = (T)objectInputStream.readObject();
            System.out.println(t2.a);
        }
    }
    
    
    class T implements Serializable{
        public int a=1;
        public float b = (float) 0.1;
        public String c = "123";
    }
    
  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/13490408.html
Copyright © 2011-2022 走看看