1. 程式人生 > >java io常用類總結

java io常用類總結

讀寫資料是java開發過程中經常需要做的,本篇文章將我們平時常用的java io處理類做個總結,同時給出相關demo。

可以看得出來,JAVA IO主要有這四個類InputStream、OutputStream、Reader、Writer來處理,要處理位元組流的就用InputStream、OutputStream,要處理字元流,就用Reader、Writer,現實中根據需要,我們選擇他們的相關子類進行資料的讀寫。給出類圖:

根據處理媒介的不同進行劃分

下面給出常用的IO處理demo

/**

 * 專案名稱(中文)

 * 專案名稱(英文)

 * Copyright (c) 2018 ChinaPay Ltd. All Rights Reserved.

 */

package com.figo.study.test;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.io.Reader;

import java.io.Serializable;

import java.io.StringWriter;

import java.io.Writer;

/**

 * IO操作總結 IO按讀寫劃分可以分為輸入流和輸出流 IO,

 * 按處理媒介來劃分可以分為位元組流和字元流 

 * 另外為了處理不同的資料型別,輸入輸出流可以層層包裝

 * 比如處理檔案資料的FileInputStream,FileOutputStream.

 * 另外處理網路的IO一般使用Socket,jdk1.4及以上版本又推出了NIO, NIO non-blocking

 * io非阻塞的開源專案比如MINA,NETTY,本demo討論io

 * 

 * @author figo

 * @version 1.0 2018-6-12 改訂

 * @since 1.0

 */

public class TestIO {

    /**

     * .

     * 

     * @param args

     */

    public static void main(String[] args) {

        // testInputStreamAndOutputStream();

        // testReaderAndWriter();

//        testBufferReaderAndWriter();

        testObjectInputStreamAndObjectOutputStream();

    }

    /**

     * 位元組流輸入FileInputStream輸出FileOutputStream 檔案超大有可能會OOM

     */

    public static void testInputStreamAndOutputStream() {

        try {

            // 寫入資料

            String hello = new String("hello world!");

            byte[] byteArray = hello.getBytes();

            File file = new File("E:\\學習資料\\java學習\\testIO\\iostream.txt");

            // 因為是用位元組流來寫媒介,所以對應的是OutputStream

            // 又因為媒介物件是檔案,所以用到子類是FileOutputStream

            OutputStream os = new FileOutputStream(file);

            os.write(byteArray);

            os.close();

            // 讀取資料

            byte[] byteArrayNew = new byte[(int) file.length()];

            // 因為是用位元組流來讀媒介,所以對應的是InputStream

            // 又因為媒介物件是檔案,所以用到子類是FileInputStream

            InputStream is = new FileInputStream(file);

            int size = is.read(byteArrayNew);

            System.out.println("大小:" + size + ";內容:" + new String(byteArray));

            is.close();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

    /**

     * 字元流輸入FileReader輸出FileWriter 檔案超大有可能會OOM

     */

    public static void testReaderAndWriter() {

        try {

            // 寫入資料

            String hello = new String("hello worLd!");

            File file = new File(

                    "E:\\學習資料\\java學習\\testIO\\readerAndwriter.txt");

            // 因為是用字元流來讀媒介,所以對應的是Writer,又因為媒介物件是檔案,所以用到子類是FileWriter

            Writer os = new FileWriter(file);

            os.write(hello);

            os.close();

            // 讀取資料

            // 因為是用字元流來讀媒介,所以對應的是Reader

            // 又因為媒介物件是檔案,所以用到子類是FileReader

            Reader reader = new FileReader(file);

            char[] byteArray = new char[(int) file.length()];

            int size = reader.read(byteArray);

            System.out.println("大小:" + size + ";內容:" + new String(byteArray));

            reader.close();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

    /**

     * 快取字元輸入BufferedReader和輸出BufferedWriter 快取一定大小字元流後再一次性輸入輸出

     * 每次一個字元一個字元的讀寫肯定影響效能的 每次讀寫快取大小的資料量,一般不會OOM,批量讀寫明顯會提高效率

     */

    public static void testBufferReaderAndWriter() {

        try {

            // 寫入資料

            String hello = new String("hello worLd!");

            File file = new File(

                    "E:\\學習資料\\java學習\\testIO\\bufferReaderAndWriter.txt");

            // 因為是用字元流來讀媒介,所以對應的是Writer,又因為媒介物件是檔案,所以用到子類是FileWriter

            Writer os = new FileWriter(file);

            // 外部再包裝一層buffer 不設定緩衝大小,預設8k,也可以自己通過這個建構函式指定

            // BufferedWriter(Writer paramWriter, int paramInt)

            BufferedWriter bw = new BufferedWriter(os);

            bw.write(hello);

            // 寫一行換一行

            bw.newLine();

            bw.close();

            os.close();

            // 讀取資料

            // 因為是用字元流來讀媒介,所以對應的是Reader

            // 又因為媒介物件是檔案,所以用到子類是FileReader

            Reader reader = new FileReader(file);

            // 外部再包裝一層buffer 不設定緩衝大小,預設8k,也可以自己通過這個建構函式指定

            // BufferedReader(Reader paramReader, int paramInt)

            BufferedReader bufferReader = new BufferedReader(reader);

            String tempString = null;

            while ((tempString = bufferReader.readLine()) != null) {

                // 顯示行號

                System.out.println(tempString);

            }

            bufferReader.close();

            reader.close();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

    /**

     * 物件讀寫到檔案ObjectInputStream和ObjectOutputStream .

     */

    public static void testObjectInputStreamAndObjectOutputStream() {

        try {

            //定義一個物件

            Student student=new Student();

            student.setName("abc");

            student.setSex("男");

            student.setGrade("一年級");

            student.setAddress("上海");

            student.setMobile("15812345678");

            //物件寫入檔案

            FileOutputStream fos=new FileOutputStream("E:\\學習資料\\java學習\\testIO\\Student.txt");

            ObjectOutputStream oos=new ObjectOutputStream(fos);

            oos.writeObject(student);

            oos.flush();

            oos.close();

            //從檔案讀取物件

            FileInputStream fis=new FileInputStream("E:\\學習資料\\java學習\\testIO\\Student.txt");

            ObjectInputStream ois=new ObjectInputStream(fis);

            Student studentNew=(Student)ois.readObject();

            System.out.println(studentNew.toString());

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

    /**

     * 一定記得實現Serializable,否則無法序列化成位元組流

     * @author figo

     * .

     */

    public static class Student implements Serializable{

        /**

         * .

         */

        private static final long serialVersionUID = 1L;

        String name;

        String sex;

        String grade;

        String address;

        String mobile;

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public String getSex() {

            return sex;

        }

        public void setSex(String sex) {

            this.sex = sex;

        }

        public String getGrade() {

            return grade;

        }

        public void setGrade(String grade) {

            this.grade = grade;

        }

        public String getAddress() {

            return address;

        }

        public void setAddress(String address) {

            this.address = address;

        }

        public String getMobile() {

            return mobile;

        }

        public void setMobile(String mobile) {

            this.mobile = mobile;

        }

        @Override

        public String toString() {

            return "Student [name=" + name + ", sex=" + sex + ", grade="

                    + grade + ", address=" + address + ", mobile=" + mobile

                    + "]";

        }

    }

}

 /**
     * 
     * 字元轉位元組流InputStreamReader和OutputStreamWriter . 
     * 這兩個類的好處是可以指定讀取和寫入的字元編碼
     */
    public static void testInputStreamReaderAndOutputStreamWriter() {


        try {
            //寫檔案
            String filePathAndName = "E:\\學習資料\\java學習\\testIO\\InputStreamReaderWriter.txt";
            File fileWrite = new File(filePathAndName);
            if (!fileWrite.exists()) {
                fileWrite.createNewFile();
            }
            OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(fileWrite), "UTF-8");
            BufferedWriter writer = new BufferedWriter(write);
            String fileContent = "hello,world,你好世界!";
            writer.write(fileContent);
            writer.close();
            //讀檔案
            File fileRead = new File(filePathAndName);
            if (fileRead.isFile() && fileRead.exists()) {
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(fileRead), "UTF-8");
                BufferedReader reader = new BufferedReader(read);
                String line;
                StringBuffer sringBuffer=new StringBuffer();
                while ((line = reader.readLine()) != null) {
                    //這樣也可以指定編碼,但是會new很多的String物件
//                  String newLine=new String(line.getBytes("UTF-8"));
                    sringBuffer.append(line);
                }
                System.out.println(fileContent);
                read.close();
            }


        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

另外我們在處理檔案讀寫經常用到java.io.File,這個類比較簡單,給出常用方法大家看看就會了:

好了,大家可以自己動手試一下。

參考文章

Java IO

https://blog.csdn.net/suifeng3051/article/details/48344587

Java的IO操作---File類

https://www.cnblogs.com/alsf/p/5746480.html