1、IO流
1.1、IO概述
- 列IO流用來處理設備之間的數據傳輸
- 列Java對數據的操作是通過流的方式
- 列Java用於操作流的對象都在IO包中
- 列流按操作對象分爲兩種:字節流與字符流,字節流可以操作任何數據,字符流只能操作純字符數據比較方便。
- 列流按流向分爲:輸入流,輸出流。
1.2、IO流結構圖
1.3、字節流
以上我常用的就是FileInputStream以及FileOutputStream。我比較喜歡直接上乾貨,所以直接用代碼通過幾個例子來講解字節流的實現過程。
package com.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* 從程序把數據寫出到磁盤
* @author Administrator
*
*/
public class Demo1 {
public static void main(String[] args) {
try {
//1.使用File類找到一個文件對象,得到IO操作的源或目標
File file = new File("F:/test.txt");
//2.通過字節流或字符流的子類創建對象,(得到IO操作的通道)
//OutputStream os = new FileOutputStream(file);
OutputStream os = new FileOutputStream(file, true);
//3.進行讀或寫的操作,(IO操作)
byte[] b = "hello word!".getBytes();
os.write(b);
//os.write("hello word!".getBytes());
//4.關閉輸入/輸出,(打完收工,注意節約資源,關掉)
os.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件找不到!");
}
}
}
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* 從磁盤把數據文件讀出到程序
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
try {
//1.使用File類找到一個文件對象,得到IO操作的源或目標
File file = new File("F:\\test.txt");
//2.通過字節流或字符流的子類創建對象,(得到IO操作的通道)
InputStream is = new FileInputStream(file);
//3.進行讀或寫的操作,(IO操作)
byte[] b = new byte[512];
while(is.read(b) != -1){
String str = new String(b);
System.out.println(str);
}
//4.關閉輸入/輸出,(打完收工,注意節約資源,關掉)
is.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件找不到!");
}
}
}
1.4字符流
我常用的是FileReader以及WriterReader。上乾貨
package com.io;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
/**
* 通過字符流把數據寫到磁盤文件
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
try {
//1.使用File類找到一個文件對象,得到IO操作的源或目標
File file = new File("F:/test.txt");
//2.通過字節流或字符流的子類創建對象,(得到IO操作的通道)
Writer writer = new FileWriter(file);
//3.進行讀或寫的操作,(IO操作)
writer.write("你好,張文!");
//4.關閉輸入/輸出,(打完收工,注意節約資源,關掉)
writer.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.io;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
/**
* 通過字符流把文件內容讀到程序中
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) {
try {
//1.使用File類找到一個文件對象,得到IO操作的源或目標
File file = new File("F:/test.txt");
//2.通過字節流或字符流的子類創建對象,(得到IO操作的通道)
Reader reader = new FileReader(file);
//3.進行讀或寫的操作,(IO操作)
char[] b = new char[512];
int num = 0;
while((num = reader.read(b)) != -1){
String str = new String(b, 0, num);
System.out.println(str);
}
//4.關閉輸入/輸出,(打完收工,注意節約資源,關掉)
reader.close();
System.out.println("操作完成!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
接下來寫一個copy的程序,把某個文件複製到另外的地方:
package com.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 複製文件到某個目錄
* @author Administrator
*
*/
public class Demo5 {
public static void main(String[] args) {
File f1 = new File("D:\\IMG_9214s.jpg");
File f2 = new File("E:\\zhangwen.jpg");
copy(f1, f2);
}
/**
*
* @param f1源文件
* @param f2複製文件
*/
public static void copy(File f1, File f2){
try {
//1、分別創建輸入流和輸出流,通過字節流或字符流的子類創建對象,(得到IO操作的通道)
InputStream is = new FileInputStream(f1);
OutputStream os = new FileOutputStream(f2);
//2、讀寫操作(邊讀邊寫)先讀再寫
byte[] b = new byte[512];
//先讀取
int num = is.read(b);
while(num != -1){
//開始寫
os.write(b);
num = is.read(b);
}
//3.關閉輸入/輸出,(打完收工,注意節約資源,關掉)
is.close();
os.close();
System.out.println("操作成功!");
} catch (Exception e) {
System.out.println("文件找不到!");
}
}
}
1.5緩衝流
IO的緩衝區的存在就是爲了提高效率,把要操作的數據放進緩衝區,然後一次性把緩衝區的內容寫到目的地,而不是寫一次就往目的地寫一次。
package com.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* 字符輸入緩衝流
* @author Administrator
*
*/
public class Demo6 {
public static void main(String[] args) throws IOException {
//1、創建文件對象
File file = new File("H:/軟考真題/20170323_IO流/20170323_IO流/筆記/IO和XML.txt");
//2、創建流對象
BufferedReader bf = new BufferedReader(new FileReader(file));
//3、讀操作
String str = null;
while((str = bf.readLine()) != null){
System.out.println(str);
}
//4、關閉流釋放資源
bf.close();
}
}
package com.io;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* 字符輸出緩衝流
* @author Administrator
*
*/
public class Demo7 {
public static void main(String[] args) throws IOException {
//1、創建文件對象
File file = new File("H:/test.txt");
//2、創建流對象
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
//3、輸出操作
bw.write("你好JAVA!");
//4、關閉流
bw.close();
}
}
1.6轉換流
打印流:該流提供了打印方法,可以將各種數據類型的數據都原樣打印。
package com.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
/**
* 轉換輸出流
* @author Administrator
*
*/
public class Demo8 {
public static void main(String[] args) throws IOException {
//1、創建文件對象
File file = new File("H:/test.txt");
//2、創建轉換流,字節流轉換爲字符流
Writer writer = new OutputStreamWriter(new FileOutputStream(file));
//3、輸出操作
writer.write("轉換輸出流!");
//4、關閉流
writer.close();
}
}
1.7打印流
打印流:該流提供了打印方法,可以將各種數據類型的數據都原樣打印。
package com.io;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
/**
* 字符打印輸出流
* @author Administrator
*
*/
public class Demo9 {
public static void main(String[] args) throws FileNotFoundException {
//1、創建文件對象
File file = new File("H:/test.txt");
//2、創建打印流
PrintWriter printWriter = new PrintWriter(file);
//3、輸出操作
printWriter.write("你好打印流!");
//4、關閉流
printWriter.close();
printWriter.flush();
}
}