java IO字元流與位元組流簡單使用示例
阿新 • • 發佈:2018-11-06
1.Reader && Writer
Reader
java.lang.Object
|-- java.io.Reader//常用方法
|-- int read() //讀取單個字元
|-- int read(char[] cbuf) //將字元讀入陣列中
|-- abstract int read(char[] cbuf, int off, int len) //將字元讀入陣列中的某一部分。
|--abstract void close() //關流
|-- java.io.BufferedReader//其方法大致和Reader相同不在列舉,注意BufferedReader有ReadLine()方法
|-- java.io.LineNumberReader //以下為其常用方法
|-- LineNumberReader(Reader in) //構造方法
|-- int getLineNumber() //獲取當前行號
|-- int read() //讀取單個字元
| -- int read(char[] cbuf, int off, int len) //將字元讀入陣列中的某一部分。
|-- String readLine() //讀取文字行。
|-- void close() //關流
|-- java.io.InputStreamReader//繼承自Reader,常用方法與Reader基本相同,注意構造方法引數,此類將位元組流轉換為字元流,是位元組流通向字元流的橋樑
|-- InputStreamReader(InputStream in) //構造方法
|-- InputStreamReader(InputStream in, Charset cs)//構造方法,建立使用給定字符集的 InputStreamReader。
|-- java.io.FileReader//常用方法
|-- FileReader(File file)//構造方法
|-- FileReader(String fileName) //構造方法
|-- java.io.CharArrayReader//此類實現一個可用作字元輸入流的字元緩衝區。
|-- CharArrayReader(char[] buf) //構造方法,根據指定的 char 陣列建立一個 CharArrayReader。
|-- CharArrayReader(char[] buf, int offset, int length) //構造方法,根據指定的 char 陣列建立一個 CharArrayReader。
|-- java.io.PipedReader//傳送的字元輸入流。
|-- PipedReader() //構造方法,建立尚未連線的 PipedReader。
|-- PipedReader(int pipeSize) //建立一個尚未連線的 PipedReader,並對管道緩衝區使用指定的管道大小。
|-- PipedReader(PipedWriter src) //建立連線到傳送 writer src 的 PipedReader。
|-- PipedReader(PipedWriter src, int pipeSize) // 建立一個 PipedReader,使其連線到管道 writer src,並對管道緩衝區使用指定的管道大小。
|-- void connect(PipedWriter src) //使此傳送 reader 連線到傳送 writer src。
|-- java.io.FilterReader
|-- protected FilterReader(Reader in) //建立一個新的 filtered reader,其餘方法和Reader相似
|-- java.io.StringReader //其源為一個字串的字元流。與CharArrayReader相似
|-- StringReader(String s) //建立一個新字串 reader。
$$ 此例為複製檔案:通過File建立一個空檔案,並把之前已存在的檔案進行讀取,將內容複製到空檔案中,實現複製檔案,
package com.IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedReaderTest02 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("E:\\Blog\\test.txt");
BufferedReader br = new BufferedReader(new FileReader("E:\\Blog\\Copy01.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter(file));//使用 FileReader(String fileName) 構造方法
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}
}
$$ 此例仍以複製檔案為例:InputStreamReader 和 OutputStreamWriter方法的具體演示,註釋掉的是另一種實現方法,並不是錯誤,得到的結果都是相同的,都會複製到指定檔案中,注意:一旦操作文字涉及到具體的指定編碼表時,必須使用轉換流 。
本例解析:讀取一個檔案,將其轉換為字元流進行操作,可以進行整行讀取比較方便
package com.IO;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class InputStreamReaderTest01 {
@SuppressWarnings("unused")
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// InputStreamReader in = new InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt"));
// OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy04.txt"));
BufferedReader in = new BufferedReader(new
InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt")));
BufferedWriter out = new BufferedWriter(new
OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy06.txt")));
// int len;
// char[] ch = new char[1024];
//
// while((len = in.read(ch)) != -1) {
// out.write(ch,0,len);
// out.flush();
// }
String line = null;
while((line = in.readLine()) != null) {
out.write(line);
out.newLine();
out.flush();
}
out.close();
in.close();
}
}
$$ 此例為CharArrayReader 的基本操作,此類用的相對較少對應位元組流中的 ByteArrayInputStream
package com.IO;
import java.io.CharArrayReader;
import java.io.IOException;
public class CharArrayReaderTest01 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
CharArrayReader cr = new CharArrayReader(ch);
System.out.println((char)cr.read());
cr.skip(1);//跳過下標為 1 之前的元素
char[] ch1 = new char[5];
cr.read(ch1, 0, 4);//相當於複製0~4的元素ch1中
System.out.println(new String(ch1));
}
}
/**結果為
* a
* ervt
*/
Writer
與Reader相似,二者大多數都是對應存在的,相當於有輸入必有輸出
java.lang.Object
|-- java.io.Writer //常用方法
|-- Writer append(char c) //將指定字元新增到此 writer。
|-- abstract void flush() //重新整理該流的緩衝。
|-- void write(char[] cbuf) //寫入字元陣列。
|-- abstract void write(char[] cbuf, int off, int len) //寫入字元陣列的某一部分
|-- void write(int c) //寫入單個字元。
|-- void write(String str) //寫入字串。
|-- void write(String str, int off, int len) // 寫入字串的某一部分。
|-- java.io.BufferedWriter //緩衝流,提高效率,方法看父類,注意建構函式要傳進來一個 Writer out,存在 newLine方法寫入一個行分隔符
|-- java.io.OutputStreamWriter //字元流通向位元組流的橋樑,將輸出的字元流變為位元組流
|-- OutputStreamWriter(OutputStream out) //建構函式
|-- String getEncoding() //返回此流使用的字元編碼的名稱。其餘方法參看父類
|-- java.io.CharArrayWriter//使用較少,不再列舉其具體方法
|-- java.io.StringWriter//不做例項,不列舉方法
|-- java.io.FilterWriter
|-- protected FilterWriter(Writer out)// 建立一個新的 filtered writer,其餘方法參看父類
|-- java.io.PipedWriter 傳送的字元輸出流。
|-- PipedWriter() //建立一個尚未連線到傳送 reader 的傳送 writer。
|-- PipedWriter(PipedReader snk) //建立傳送 writer,使其連線到指定的傳送 reader。
|-- void connect(PipedReader snk) //將此傳送 writer 連線到接收方。
|-- java.io.PrintWriter//向文字輸出流列印物件的格式化表示形式
|-- PrintWriter(File file) //使用指定檔案建立不具有自動行重新整理的新 PrintWriter。
|-- PrintWriter(OutputStream out)// 根據現有的 OutputStream 建立不帶自動行重新整理的新 PrintWriter。
|-- PrintWriter(OutputStream out, boolean autoFlush)// 通過現有的 OutputStream 建立新的 PrintWriter。
|-- PrintWriter(String fileName)//建立具有指定檔名稱且不帶自動行重新整理的新 PrintWriter
|-- PrintWriter(Writer out) //建立不帶自動行重新整理的新 PrintWriter。
|-- PrintWriter(Writer out, boolean autoFlush)// 建立新 PrintWriter。
|-- void println(int x) // 列印整數,然後終止該行。
|-- void print(int i) //列印整數。
$$ CharArrayWriter 簡單示例
package com.IO;
import java.io.CharArrayWriter;
public class CharArrayWriterTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
CharArrayWriter cw = new CharArrayWriter();
cw.write(ch, 0, 6);
System.out.println(cw.size());
System.out.println(cw.toString());
char[] ch1 = cw.toCharArray();
for(char c : ch1)
System.out.print(c + " ");
}
}
/**
*
* 結果為
* 6
* acervt
* a c e r v t
*
* */
$$PrintWriter 示例
package com.IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class PrintWriterTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
PrintWriter po;
String s = "abe";
String ss = "kl阿斯頓發";
try {
po = new PrintWriter(new FileOutputStream("E:\\Blog\\test02.txt"));
po.write(ch);
po.println(s);//列印到E:\\Blog\\test02.txt中
po.print(ss);
po.flush();
po.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.InputStream與OutputStream
InputStream
這裡只介紹幾種比較常用的類
java.lang.Object
|-- java.io.InputStream
|-- int available() // 返回此輸入流下一個方法呼叫可以不受阻塞地從此輸入流讀取(或跳過)的估計位元組數。
|-- void close() //關流
|-- abstract int read() //從輸入流中讀取資料的下一個位元組。
|-- int read(byte[] b) //從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列 b 中
|-- int read(byte[] b, int off, int len) //將輸入流中最多 len 個數據位元組讀入 byte 陣列。
|-- java.io.FileInputStream
|-- FileInputStream(File file)
|-- FileInputStream(String name)
|-- protected void finalize() //確保在不再引用檔案輸入流時呼叫其 close 方法。
|-- java.io.ByteArrayInputStream //與CharArrayReader相似
|-- ByteArrayInputStream(byte[] buf)
|-- ByteArrayInputStream(byte[] buf, int offset, int length)
|-- java.io.FilterInputStream
|-- java.io.BufferedInputStream//緩衝區,提高效率
|-- BufferedInputStream(InputStream in) //建構函式
|-- java.io.DataInputStream
|-- DataInputStream(InputStream in)
|-- java.io.ObjectInputStream
|-- Object readObject() //從 ObjectInputStream 讀取物件。
|-- java.io.PipedInputStream //管道輸入流應該連線到管道輸出流;管道輸入流提供要寫入管道輸出流的所有資料位元組
|-- PipedInputStream() //建立尚未連線的 PipedInputStream。
|-- PipedInputStream(int pipeSize) //建立一個尚未連線的 PipedInputStream,並對管道緩衝區使用指定的管道大小。
|-- PipedInputStream(PipedOutputStream src) //建立 PipedInputStream,使其連線到管道輸出流 src。
|-- PipedInputStream(PipedOutputStream src, int pipeSize) //建立一個 PipedInputStream,使其連線到管道輸出流 src,並對管道緩衝區使用指定的管道大小。
|-- void connect(PipedOutputStream src) //使此管道輸入流連線到管道輸出流 src。
$$ ObjectInputStream與ObjectOutputStream用法簡單示例,注意:ObjectInputStream writerObject物件的時候,不能直接新增,需要將此類實現序列化serializable。
package com.IO;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class ObjectStreamTest01 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
Set<Worker> list = new HashSet<Worker>();
list.add(new Worker("lisi01",10000));
list.add(new Worker("lisi02",10000));
list.add(new Worker("lisi02",15000));
list.add(new Worker("lisi01",10000));
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("E:\\Blog\\test03.txt"));
out.writeObject(list);
ObjectInputStream in = new ObjectInputStream(new FileInputStream("E:\\Blog\\test03.txt"));
@SuppressWarnings("unchecked")
Set<Worker> ww = (Set<Worker>)in.readObject();
for(Worker w : ww)
System.out.println(w.getId() + " :: " + w.getSalary());
out.close()