IO(JAVA/python版)

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 {

-----關於圖片的複製,因爲是圖片,需要用字節流。
            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();
        }
---對象序列化及對象反序列化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;
 }
}
--接下來創建測試類,利用單元測試進行測試
package cn.IOdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class ObjectIOdemo {
 

 @Test
//對象序列化
 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
//對象反序列化
 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)

#複製非空文件到指定文件中:
import shutil
old="D:/demo/a"
n=old[len(old)-1:]
new="D:/demo/b/"
new=new+n
shutil.copytree(old,new)



發佈了36 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章