讀寫數(shù)據(jù)是java開發(fā)過程中經(jīng)常需要做的,本篇文章將我們平時常用的java io處理類做個總結,同時給出相關demo。 可以看得出來,JAVA IO主要有這四個類InputStream、OutputStream、Reader、Writer來處理,要處理字節(jié)流的就用InputStream、OutputStream,要處理字符流,就用Reader、Writer,現(xiàn)實中根據(jù)需要,我們選擇他們的相關子類進行數(shù)據(jù)的讀寫。給出類圖: 根據(jù)處理媒介的不同進行劃分 下面給出常用的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, * 按處理媒介來劃分可以分為字節(jié)流和字符流 * 另外為了處理不同的數(shù)據(jù)類型,輸入輸出流可以層層包裝 * 比如處理文件數(shù)據(jù)的FileInputStream,FileOutputStream. * 另外處理網(wǎng)絡的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(); } /** * 字節(jié)流輸入FileInputStream輸出FileOutputStream 文件超大有可能會OOM */ public static void testInputStreamAndOutputStream() { try { // 寫入數(shù)據(jù) String hello = new String('hello world!'); byte[] byteArray = hello.getBytes(); File file = new File('E:\\學習資料\\java學習\\testIO\\iostream.txt'); // 因為是用字節(jié)流來寫媒介,所以對應的是OutputStream // 又因為媒介對象是文件,所以用到子類是FileOutputStream OutputStream os = new FileOutputStream(file); os.write(byteArray); os.close(); // 讀取數(shù)據(jù) byte[] byteArrayNew = new byte[(int) file.length()]; // 因為是用字節(jié)流來讀媒介,所以對應的是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 { // 寫入數(shù)據(jù) 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(); // 讀取數(shù)據(jù) // 因為是用字符流來讀媒介,所以對應的是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 緩存一定大小字符流后再一次性輸入輸出 * 每次一個字符一個字符的讀寫肯定影響性能的 每次讀寫緩存大小的數(shù)據(jù)量,一般不會OOM,批量讀寫明顯會提高效率 */ public static void testBufferReaderAndWriter() { try { // 寫入數(shù)據(jù) String hello = new String('hello worLd!'); File file = new File( 'E:\\學習資料\\java學習\\testIO\\bufferReaderAndWriter.txt'); // 因為是用字符流來讀媒介,所以對應的是Writer,又因為媒介對象是文件,所以用到子類是FileWriter Writer os = new FileWriter(file); // 外部再包裝一層buffer 不設置緩沖大小,默認8k,也可以自己通過這個構造函數(shù)指定 // BufferedWriter(Writer paramWriter, int paramInt) BufferedWriter bw = new BufferedWriter(os); bw.write(hello); // 寫一行換一行 bw.newLine(); bw.close(); os.close(); // 讀取數(shù)據(jù) // 因為是用字符流來讀媒介,所以對應的是Reader // 又因為媒介對象是文件,所以用到子類是FileReader Reader reader = new FileReader(file); // 外部再包裝一層buffer 不設置緩沖大小,默認8k,也可以自己通過這個構造函數(shù)指定 // 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(); } } /** * 一定記得實現(xiàn)Serializable,否則無法序列化成字節(jié)流 * @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 + ']'; } } } /** 另外我們在處理文件讀寫經(jīng)常用到java.io.File,這個類比較簡單,給出常用方法大家看看就會了: 好了,大家可以自己動手試一下。 參考文章 Java IO https://blog.csdn.net/suifeng3051/article/details/48344587 Java的IO操作---File類 https://www.cnblogs.com/alsf/p/5746480.html |
|
來自: sxw6wduc8b7bn5 > 《待分類》