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";
    }
    
  • 相关阅读:
    Web用户控件
    ASP.Net状态管理读书笔记--思维导图
    网站教学 提纲总结到ajax结束后面还有
    ajax文本空输入显示用户信息
    Ajax 下拉列表联动显示
    用Ajax删除的做法
    Findora:引入保密性和可审计的区块链
    角逐云计算的“新黄金十年”,谁将胜出?
    区块链世界的中心应该是什么?
    边缘计算2.0时代存在哪些挑战?
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/13490408.html
Copyright © 2011-2022 走看看