可以讀寫基本數據類型的數據 * 數據輸入流:DataInputStream * DataInputStream(InputStream in) * 數據輸出流:DataOutputStream * DataOutputStream(OutputStream out) package cn.itcas ...
可以讀寫基本數據類型的數據
* 數據輸入流:DataInputStream
* DataInputStream(InputStream in)
* 數據輸出流:DataOutputStream
* DataOutputStream(OutputStream out)
package cn.itcast_01; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /* * 可以讀寫基本數據類型的數據 * 數據輸入流:DataInputStream * DataInputStream(InputStream in) * 數據輸出流:DataOutputStream * DataOutputStream(OutputStream out) */ public class DataStreamDemo { public static void main(String[] args) throws IOException { // 寫 // write(); // 讀 read(); } private static void read() throws IOException { // DataInputStream(InputStream in) // 創建數據輸入流對象 DataInputStream dis = new DataInputStream( new FileInputStream("dos.txt")); // 讀數據 byte b = dis.readByte(); short s = dis.readShort(); int i = dis.readInt(); long l = dis.readLong(); float f = dis.readFloat(); double d = dis.readDouble(); char c = dis.readChar(); boolean bb = dis.readBoolean(); // 釋放資源 dis.close(); System.out.println(b); System.out.println(s); System.out.println(i); System.out.println(l); System.out.println(f); System.out.println(d); System.out.println(c); System.out.println(bb); } private static void write() throws IOException { // DataOutputStream(OutputStream out) // 創建數據輸出流對象 DataOutputStream dos = new DataOutputStream(new FileOutputStream( "dos.txt")); // 寫數據了 dos.writeByte(10); dos.writeShort(100); dos.writeInt(1000); dos.writeLong(10000); dos.writeFloat(12.34F); dos.writeDouble(12.56); dos.writeChar('a'); dos.writeBoolean(true); // 釋放資源 dos.close(); } }
記憶體操作流:用於處理臨時存儲信息的,程式結束,數據就從記憶體中消失。
* 位元組數組:
* ByteArrayInputStream
* ByteArrayOutputStream
* 字元數組:
* CharArrayReader
* CharArrayWriter
* 字元串:
* StringReader
* StringWriter
package cn.itcast_02; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /* * 記憶體操作流:用於處理臨時存儲信息的,程式結束,數據就從記憶體中消失。 * 位元組數組: * ByteArrayInputStream * ByteArrayOutputStream * 字元數組: * CharArrayReader * CharArrayWriter * 字元串: * StringReader * StringWriter */ public class ByteArrayStreamDemo { public static void main(String[] args) throws IOException { // 寫數據 // ByteArrayOutputStream() ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 寫數據 for (int x = 0; x < 10; x++) { baos.write(("hello" + x).getBytes()); } // 釋放資源 // 通過查看源碼我們知道這裡什麼都沒做,所以根本需要close() // baos.close(); // public byte[] toByteArray() byte[] bys = baos.toByteArray(); // 讀數據 // ByteArrayInputStream(byte[] buf) ByteArrayInputStream bais = new ByteArrayInputStream(bys); int by = 0; while ((by = bais.read()) != -1) { System.out.print((char) by); } // bais.close(); } }
*
* 列印流
* 位元組流列印流 PrintStream
* 字元列印流 PrintWriter
*
* 列印流的特點:
* A:只有寫數據的,沒有讀取數據。只能操作目的地,不能操作數據源。
* B:可以操作任意類型的數據。
* C:如果啟動了自動刷新,能夠自動刷新。
* D:該流是可以直接操作文本文件的。
* 哪些流對象是可以直接操作文本文件的呢?
* FileInputStream
* FileOutputStream
* FileReader
* FileWriter
* PrintStream
* PrintWriter
* 看API,查流對象的構造方法,如果同時有File類型和String類型的參數,一般來說就是可以直接操作文件的。
*
* 流:
* 基本流:就是能夠直接讀寫文件的
* 高級流:在基本流基礎上提供了一些其他的功能
package cn.itcast_03; import java.io.IOException; import java.io.PrintWriter; /* * 列印流 * 位元組流列印流 PrintStream * 字元列印流 PrintWriter * * 列印流的特點: * A:只有寫數據的,沒有讀取數據。只能操作目的地,不能操作數據源。 * B:可以操作任意類型的數據。 * C:如果啟動了自動刷新,能夠自動刷新。 * D:該流是可以直接操作文本文件的。 * 哪些流對象是可以直接操作文本文件的呢? * FileInputStream * FileOutputStream * FileReader * FileWriter * PrintStream * PrintWriter * 看API,查流對象的構造方法,如果同時有File類型和String類型的參數,一般來說就是可以直接操作文件的。 * * 流: * 基本流:就是能夠直接讀寫文件的 * 高級流:在基本流基礎上提供了一些其他的功能 */ public class PrintWriterDemo { public static void main(String[] args) throws IOException { // 作為Writer的子類使用 PrintWriter pw = new PrintWriter("pw.txt"); pw.write("hello"); pw.write("world"); pw.write("java"); pw.close(); } }
package cn.itcast_03; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /* * 1:可以操作任意類型的數據。 * print() * println() * 2:啟動自動刷新 * PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true); * 還是應該調用println()的方法才可以 * 這個時候不僅僅自動刷新了,還實現了數據的換行。 * * println() * 其實等價於於: * bw.write(); * bw.newLine(); * bw.flush(); */ public class PrintWriterDemo2 { public static void main(String[] args) throws IOException { // 創建列印流對象 // PrintWriter pw = new PrintWriter("pw2.txt"); PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true); // write()是搞不定的,怎麼辦呢? // 我們就應該看看它的新方法 // pw.print(true); // pw.print(100); // pw.print("hello"); pw.println("hello"); pw.println(true); pw.println(100); pw.close(); } }
列印流改進複製文本文件案例
需求:DataStreamDemo.java複製到Copy.java中 -----printWriter實現自動刷新和自動換行
package cn.itcast_03; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /* * 需求:DataStreamDemo.java複製到Copy.java中 * 數據源: * DataStreamDemo.java -- 讀取數據 -- FileReader -- BufferedReader * 目的地: * Copy.java -- 寫出數據 -- FileWriter -- BufferedWriter -- PrintWriter */ public class CopyFileDemo { public static void main(String[] args) throws IOException { // 以前的版本 // 封裝數據源 // BufferedReader br = new BufferedReader(new FileReader( // "DataStreamDemo.java")); // // 封裝目的地 // BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java")); // // String line = null; // while ((line = br.readLine()) != null) { // bw.write(line); // bw.newLine(); // bw.flush(); // } // // bw.close(); // br.close(); // 列印流的改進版 // 封裝數據源 BufferedReader br = new BufferedReader(new FileReader( "DataStreamDemo.java")); // 封裝目的地 PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true); String line = null; while((line=br.readLine())!=null){ pw.println(line); } pw.close(); br.close(); } }
/*
* 隨機訪問流:
* RandomAccessFile類不屬於流,是Object類的子類。
* 但它融合了InputStream和OutputStream的功能。
* 支持對文件的隨機訪問讀取和寫入。
*
* public RandomAccessFile(String name,String mode):第一個參數是文件路徑,第二個參數是操作文件的模式。
* 模式有四種,我們最常用的一種叫"rw",這種方式表示我既可以寫數據,也可以讀取數據
*/
package cn.itcast_05; import java.io.IOException; import java.io.RandomAccessFile; /* * 隨機訪問流: * RandomAccessFile類不屬於流,是Object類的子類。 * 但它融合了InputStream和OutputStream的功能。 * 支持對文件的隨機訪問讀取和寫入。 * * public RandomAccessFile(String name,String mode):第一個參數是文件路徑,第二個參數是操作文件的模式。 * 模式有四種,我們最常用的一種叫"rw",這種方式表示我既可以寫數據,也可以讀取數據 */ public class RandomAccessFileDemo { public static void main(String[] args) throws IOException { // write(); read(); } private static void read() throws IOException { // 創建隨機訪問流對象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); int i = raf.readInt(); System.out.println(i); // 該文件指針可以通過 getFilePointer方法讀取,並通過 seek 方法設置。 System.out.println("當前文件的指針位置是:" + raf.getFilePointer()); char ch = raf.readChar(); System.out.println(ch); System.out.println("當前文件的指針位置是:" + raf.getFilePointer()); String s = raf.readUTF(); System.out.println(s); System.out.println("當前文件的指針位置是:" + raf.getFilePointer()); // 我不想重頭開始了,我就要讀取a,怎麼辦呢? raf.seek(4); ch = raf.readChar(); System.out.println(ch); } private static void write() throws IOException { // 創建隨機訪問流對象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); // 怎麼玩呢? raf.writeInt(100); raf.writeChar('a'); raf.writeUTF("中國"); raf.close(); } }
合併流讀取兩個文件的內容複製到一個文件中
package cn.itcast_06; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; /* * 以前的操作: * a.txt -- b.txt * c.txt -- d.txt * * 現在想要: * a.txt+b.txt -- c.txt */ public class SequenceInputStreamDemo { public static void main(String[] args) throws IOException { // SequenceInputStream(InputStream s1, InputStream s2) // 需求:把ByteArrayStreamDemo.java和DataStreamDemo.java的內容複製到Copy.java中 InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("DataStreamDemo.java"); SequenceInputStream sis = new SequenceInputStream(s1, s2); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("Copy.java")); // 如何寫讀寫呢,其實很簡單,你就按照以前怎麼讀寫,現在還是怎麼讀寫 byte[] bys = new byte[1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); sis.close(); } }
合併流讀取多個文件的內容複製到一個文件中
package cn.itcast_06; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; /* * 以前的操作: * a.txt -- b.txt * c.txt -- d.txt * e.txt -- f.txt * * 現在想要: * a.txt+b.txt+c.txt -- d.txt */ public class SequenceInputStreamDemo2 { public static void main(String[] args) throws IOException { // 需求:把下麵的三個文件的內容複製到Copy.java中 // ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java // SequenceInputStream(Enumeration e) // 通過簡單的回顧我們知道了Enumeration是Vector中的一個方法的返回值類型。 // Enumeration<E> elements() Vector<InputStream> v = new Vector<InputStream>(); InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java"); InputStream s2 = new FileInputStream("CopyFileDemo.java"); InputStream s3 = new FileInputStream("DataStreamDemo.java"); v.add(s1); v.add(s2); v.add(s3); Enumeration<InputStream> en = v.elements(); SequenceInputStream sis = new SequenceInputStream(en); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream("Copy.java")); // 如何寫讀寫呢,其實很簡單,你就按照以前怎麼讀寫,現在還是怎麼讀寫 byte[] bys = new byte[1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos.write(bys, 0, len); } bos.close(); sis.close(); } }