一、IO流概述及體系
- IO流用來處理設備之間的數據傳輸。
- Java對數據的操作是通過流(系統資源)的方式。
- Java用於操作流的對象都在Java.io包中。
- 流按照操作數據分爲兩種:字節流,字符流。
- 流按照流向分爲:輸入流,輸出流。
二、Java字符流的使用
關於緩衝區:
- 緩衝區,提高了對數據的讀寫效率。
- 對應類:BufferedWriter和BufferedReader。
- 緩衝區要結合流纔可以使用,在流的基礎上對流的功能進行了增強。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 使用帶緩衝區的字符流實現文件copy
*
*/
public class Demo {
public static void main(String[] args) {
BufferedReader source = null;
BufferedWriter target = null;
try {
// new用讀取流緩衝(new建立讀取流對象(new建立源文件對象))
source = new BufferedReader(new FileReader(new File("D:\\Demo1\\a.txt")));
// new用寫入流緩衝(new建立寫入流對象(new建立目標文件對象)
target = new BufferedWriter(new FileWriter(new File("D:\\Demo2\\b.txt")));
String line = null;
while ((line = source.readLine()) != null) {
target.write(line);
target.newLine();
target.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (source != null) {
source.close();
}
} catch (IOException e) {
throw new RuntimeException("讀取流關閉出問題了.");
}
try {
if (target != null) {
target.close();
}
} catch (IOException e) {
throw new RuntimeException("寫入流關閉出問題了.");
}
}
}
}
三、Java字節流的使用
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用帶緩衝區的字節流實現文件copy
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
BufferedInputStream souce = null;
BufferedOutputStream target = null;
try {
souce = new BufferedInputStream(new FileInputStream("D:\\Demo1\\a.txt"));
target = new BufferedOutputStream(new FileOutputStream("D:\\Demo2\\b.txt"));
byte[] b = new byte[1024];
int len = 0;
while ((len = souce.read(b)) != -1) {
target.write(b, 0, len);
target.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (souce != null) {
souce.close();
}
if (target != null) {
target.close();
}
}
}
}
四、Java轉換流的使用
爲什麼要有轉換流?
- InputStreamReader和OutputStreamWriter,方便字符流與字節流之間的操作,是字符流與字節流之間的橋樑。
- 應用:當字節流中的數據都是字符時,轉換成字符流操作更高效。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 使用帶緩衝區的轉換流實現文件copy
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
BufferedReader source = null;
BufferedWriter target = null;
try {
// source = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\Demo1\\a.txt")));
source = new BufferedReader(new FileReader("D:\\Demo1\\a.txt"));
// target = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\Demo2\\b.txt"), "utf-8"));
target = new BufferedWriter(new FileWriter("D:\\Demo2\\b.txt"));
String line = null;
while ((line = source.readLine()) != null) {
target.write(line);
target.newLine();
target.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (source != null) {
source.close();
}
if (target != null) {
target.close();
}
}
}
}
五、標準輸入輸出流的使用
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
/**
* 使用標準輸入輸出流進行輸入輸出
*
*/
public class 標準輸入輸入流 {
public static void main(String[] args) throws IOException {
// InputStream in = System.in;
// PrintStream out = System.out;
BufferedReader source = null;
BufferedWriter target = null;
try {
source = new BufferedReader(new InputStreamReader(System.in));
target = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while ((line = source.readLine()) != null) {
if ("over".equals(line)) {
break;
}
target.write(line.toUpperCase());// 讀取的同時將小寫字母轉換爲大寫
target.newLine();
target.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (source != null) {
source.close();
}
if (target != null) {
target.close();
}
}
}
}
六、打印流的使用
- printWriter和printStream分別是字符打印流和字節打印流,可以直接操作輸入流和文件。
- printStream爲其它輸出流添加了功能,使它們能夠方便的打印各種數據值表示形式。
/**
* 字節打印流測試
*/
@Test
public void test1() throws IOException {
PrintStream ps = new PrintStream("a.txt");
ps.write(97);// write方法自動轉化爲a
ps.print(97);// print方法原樣輸出
ps.flush();
ps.close();
}
/**
* 字符打印流測試
*
*/
@Test
public void test2() throws IOException {
PrintStream out = System.out;
PrintWriter pw = new PrintWriter(out);
pw.print('a');
pw.flush();
pw.close();
}
七、對象流的使用
如何使用對象流?
- 被操作的對象需要實現Serializable(標記接口),儘量顯示生成序列號(版本號)。
- 將內存彙總的對象寫入磁盤,從而進行持久化操作。(即序列化過程)
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 org.junit.Test;
public class 對象流 {
/**
* 序列化過程 將內存中的對象寫入磁盤
*
* @throws IOException
*/
@Test
public void test1() throws IOException {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c.txt"));
out.writeObject(new Person("zs", 20));
out.flush();
out.close();
}
/**
* 反序列化過程 將磁盤中的對象讀出到內存
*
* @throws IOException
* @throws ClassNotFoundException
*/
@Test
public void test2() throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("c.txt"));
Object readObject = in.readObject();
Person p = (Person) readObject;
System.out.println(p.getName());
in.close();
}
}
// Person類實現Serializable接口
class Person implements Serializable {
String name;
int age;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}