Java IO流學習總結
流的概念和作用
流是一組有順序的,有起點和終點的字節集合,是對數據傳輸的總稱或抽象。即數據在兩設備間的傳輸稱爲流,流的本質是數據傳輸,根據數據傳輸特性將流抽象爲各種類,方便更直觀的進行數據操作。
IO流的分類
- 字節流:FileInputStream,FileOutputStream
- 字符流:FileReader,FileWriter
- 二進制流:DataInputStream,DataOutputStream
- 對象序列化/對象反序列化:ObjectInputStream,ObjectOutputStream
-----華麗的分割線 接下來我們看一下java版的IOdemo
-----------java版-----------
--字節流,字符流Demo
import java.io.*;
public class IODemo {
public static void main(String[]args) throws Exception {
public class IODemo {
public static void main(String[]args) throws Exception {
-----關於圖片的複製,因爲是圖片,需要用字節流。
FileInputStream in = new FileInputStream("C:/IoDemo/a/捕獲.PNG");//建立輸入流
FileOutputStream out = new FileOutputStream("C:/IoDemo/b/捕獲copy.PNG");//建立輸出流
byte [] buffer = new byte[1024];//建立緩存區,1024爲傳輸的數據大小。建立緩存區,不需要特別大,適合就好。
int len =0;
while (true){
len = in.read(buffer); //len爲記錄輸入流池塘中的數據是否傳輸完畢
if (len == -1){ //當傳輸完成時,len==-1,break終止數據傳輸
break;
}
out.write(buffer,0,len);//寫入讀取的數據,省的複製後文件損壞。如果沒有第2、3個參數,copy後的文件大小》原文件,會造成文件損壞無法打開。
out.flush();//刷新
}
out.close();//釋放資源遵循着先開後閉的原則!
FileInputStream in = new FileInputStream("C:/IoDemo/a/捕獲.PNG");//建立輸入流
FileOutputStream out = new FileOutputStream("C:/IoDemo/b/捕獲copy.PNG");//建立輸出流
byte [] buffer = new byte[1024];//建立緩存區,1024爲傳輸的數據大小。建立緩存區,不需要特別大,適合就好。
int len =0;
while (true){
len = in.read(buffer); //len爲記錄輸入流池塘中的數據是否傳輸完畢
if (len == -1){ //當傳輸完成時,len==-1,break終止數據傳輸
break;
}
out.write(buffer,0,len);//寫入讀取的數據,省的複製後文件損壞。如果沒有第2、3個參數,copy後的文件大小》原文件,會造成文件損壞無法打開。
out.flush();//刷新
}
out.close();//釋放資源遵循着先開後閉的原則!
in.close();
System.out.println("ok....");
BufferedReader in1 = new BufferedReader(new InputStreamReader(new FileInputStream("C:/IoDemo/a/aa.txt"),"gbk"));//使用了裝飾GBK編碼
PrintWriter out1 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:/IoDemo/b/bb.txt"),"utf-8"));//這裏如果不使用UTF編碼裝飾則會亂碼
String str = null;
while (true){
str = in1.readLine();
if (str == null){
break;
}
System.out.println(str);
out1.write(str);
out1.flush();
}
in1.close();
out1.close();
}
System.out.println("ok....");
BufferedReader in1 = new BufferedReader(new InputStreamReader(new FileInputStream("C:/IoDemo/a/aa.txt"),"gbk"));//使用了裝飾GBK編碼
PrintWriter out1 = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:/IoDemo/b/bb.txt"),"utf-8"));//這裏如果不使用UTF編碼裝飾則會亂碼
String str = null;
while (true){
str = in1.readLine();
if (str == null){
break;
}
System.out.println(str);
out1.write(str);
out1.flush();
}
in1.close();
out1.close();
}
---對象序列化及對象反序列化demo
--首先創建實體類Users並將其實現Serializable 接口
package cn.IOdemo;
import java.io.Serializable;
public class Users implements Serializable {
private Integer uAge;
private String uName;
public Integer getuAge() {
return uAge;
}
public void setuAge(Integer uAge) {
this.uAge = uAge;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
private Integer uAge;
private String uName;
public Integer getuAge() {
return uAge;
}
public void setuAge(Integer uAge) {
this.uAge = uAge;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
}
--接下來創建測試類,利用單元測試進行測試
package cn.IOdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class ObjectIOdemo {
@Test
@Test
//對象序列化
public void tObjectWrite(){
try {
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(
new File("C:/IO/Object.txt")));
public void tObjectWrite(){
try {
ObjectOutputStream oos = new ObjectOutputStream
(new FileOutputStream(
new File("C:/IO/Object.txt")));
Users u = new Users();
u.setuAge(18);
u.setuName("zs");
oos.writeObject(u);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
u.setuAge(18);
u.setuName("zs");
oos.writeObject(u);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
//對象反序列化
public void tObjectRead(){
try {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(
new File("C:/IO/Object.txt")));
Users u =(Users)ois.readObject();
System.out.println(u.getuName()+"\t"+u.getuAge());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------華麗的分割線 出來吧,python版的Iodemo
public void tObjectRead(){
try {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(
new File("C:/IO/Object.txt")));
Users u =(Users)ois.readObject();
System.out.println(u.getuName()+"\t"+u.getuAge());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------華麗的分割線 出來吧,python版的Iodemo
ww=open("C:/IoDemo/a/aa.txt")
xx=open("C:/IoDemo/b/aaPython.txt","w")
for line in ww:
xx.write(line)
print("txt複製成功!")
二進制讀寫
#使用默認緩存區
ww=open("C:/IoDemo/a/捕獲.PNG","rb")
xx=open("C:/IoDemo/b/捕獲python.PNG","wb")
for line in ww:
xx.write(line)
print("png複製成功!")
#自定義緩存區
CC=open("C:/IoDemo/a/捕獲.PNG","rb")
CV=open("C:/IoDemo/b/捕獲python_自定義緩存區.PNG","wb")
CC.seek(0,2)#跳轉到結尾
CCcount=CC.tell()
CC.seek(0,0)#跳轉到開頭
n=0 #記錄數據傳輸的次數
ofSize=0#累計傳輸數據的大小
while True:
if ofSize >CCcount: #如果累計傳輸數據的大小,終止傳輸
break
CCsize= CC.read(10240)#緩存區大小爲10k
CV.write(CCsize)
ofSize +=10240
n +=1
print(n)
#對象讀寫(對象序列化,對象反序列)
class person:
def __init__(self,name=None,age=None):
self.name=name
self.age=age
def __str__(self):
return "我叫{0},今年{1}".format(self.name,self.age)
import pickle
p = person("張三",19)
op=open("C:/IoDemo/b/person.dat","wb")
pickle.dump(p,op) #將person對象寫入
print(p)
op.close() #如果沒有op.close(),則會報錯:EOFError: Ran out of input
p1 = pickle.load(open("C:/IoDemo/b/person.dat","rb"))
print(p1)
#複製非空文件到指定文件中:
xx=open("C:/IoDemo/b/aaPython.txt","w")
for line in ww:
xx.write(line)
print("txt複製成功!")
二進制讀寫
#使用默認緩存區
ww=open("C:/IoDemo/a/捕獲.PNG","rb")
xx=open("C:/IoDemo/b/捕獲python.PNG","wb")
for line in ww:
xx.write(line)
print("png複製成功!")
#自定義緩存區
CC=open("C:/IoDemo/a/捕獲.PNG","rb")
CV=open("C:/IoDemo/b/捕獲python_自定義緩存區.PNG","wb")
CC.seek(0,2)#跳轉到結尾
CCcount=CC.tell()
CC.seek(0,0)#跳轉到開頭
n=0 #記錄數據傳輸的次數
ofSize=0#累計傳輸數據的大小
while True:
if ofSize >CCcount: #如果累計傳輸數據的大小,終止傳輸
break
CCsize= CC.read(10240)#緩存區大小爲10k
CV.write(CCsize)
ofSize +=10240
n +=1
print(n)
#對象讀寫(對象序列化,對象反序列)
class person:
def __init__(self,name=None,age=None):
self.name=name
self.age=age
def __str__(self):
return "我叫{0},今年{1}".format(self.name,self.age)
import pickle
p = person("張三",19)
op=open("C:/IoDemo/b/person.dat","wb")
pickle.dump(p,op) #將person對象寫入
print(p)
op.close() #如果沒有op.close(),則會報錯:EOFError: Ran out of input
p1 = pickle.load(open("C:/IoDemo/b/person.dat","rb"))
print(p1)
#複製非空文件到指定文件中:
import shutil
old="D:/demo/a"
n=old[len(old)-1:]
n=old[len(old)-1:]
new="D:/demo/b/"
new=new+n
shutil.copytree(old,new)