目錄
一、轉換流
(1)指定的字元集讀寫資料
二、序列化流和反序列化流
三、解壓縮流和壓縮流
(1)解壓縮流
(2)壓縮流
一:壓縮檔案
二:壓縮檔案夾
注:本文并未介紹Java中的所有進階流,隻介紹了三種!
一、轉換流
轉換流就是轉換,它可以使位元組流轉換成字元流,也可以将字元流轉換成位元組流。
在讀資料時InputStreamReader,就是将位元組流轉換成字元流
寫資料時OutputStreamWriter,就是将字元流轉換成位元組流
他們的作用可以指定字元集讀寫資料,位元組流可以使用字元流中的方法
(1)指定的字元集讀寫資料
public class exe_one { public static void main(String[] args) throws IOException { File src=new File("D:\\java\\8.txt"); duqu(src,"GBK"); xie(src,"GBK"); } public static void duqu(File src,String charset) throws IOException { //讀取src路徑的檔案,charset是指定的字元集 //轉換流 InputStreamReader inputStreamReader=new InputStreamReader(new FileInputStream(src),charset); int b; while((b=inputStreamReader.read())!=-1){ System.out.print((char)b); } inputStreamReader.close(); } public static void xie(File src,String charset) throws IOException { //寫到src檔案,charset是指定的字元集 OutputStreamWriter outputStreamWriter=new OutputStreamWriter(new FileOutputStream(src),charset); outputStreamWriter.write("一加一等于100"); outputStreamWriter.close(); } }
二、序列化流和反序列化流
序列化流:ObjectOutputStream,它可以把Java中的對象
寫到本地檔案中,比如具體執行個體中遊戲的存檔,如果單純将資料寫進去,
那麼使用者就可以看懂并進行修改,序列化的作用就是将對象寫進本地檔案中,
并且是一串奇怪的字元,别人看不懂。
同時要注意一個小細節,使用序列化流儲存檔案一定要記得将javabean類實作Serializable接口
反序列化流:ObjectInputStream他的作用就是将序列化到本地檔案中的對象讀取到程式中
public class exe_one { public static void main(String[] args) throws IOException, ClassNotFoundException { File src=new File("D:\\java\\7.txt"); //xulie(src); fanxulie(src); } public static void xulie(File src) throws IOException { //序列化流将對象儲存到本地檔案中 Student s=new Student("張三",19); ObjectOutputStream outputStream=new ObjectOutputStream(new FileOutputStream(src)); outputStream.writeObject(s); outputStream.close(); } public static void fanxulie(File src) throws IOException, ClassNotFoundException { //反序列化 ObjectInputStream o=new ObjectInputStream(new FileInputStream(src)); Student s= (Student) o.readObject(); System.out.println(s.name); o.close(); } }
三、解壓縮流和壓縮流
對于解壓縮流和壓縮流的定義其實很簡單,就是解壓和壓縮
(1)解壓縮流
解壓本質:就是吧每一個ZipEntry按照層級拷貝到本地另外一個檔案夾中
要注意這裡的解壓縮的格式字尾名一定要是zip,其他Java無法識别。
解壓縮流基本代碼:
//将一個a壓縮包解壓
public class exe_one {
public static void main(String[] args) throws IOException {
File src=new File("D:\\java\\a.zip");
File dest=new File("D:\\java");
jieyasuo(src,dest);
}
public static void jieyasuo(File src,File dest) throws IOException {
//先擷取壓縮包中的資料
ZipInputStream zip=new ZipInputStream(new FileInputStream(src));
//擷取壓縮包中的每一個zipEntry對象
ZipEntry entry;
while((entry= zip.getNextEntry())!=null){
System.out.println(entry);
if(entry.isDirectory()){
//是檔案夾
File fiel=new File(dest,entry.toString());
fiel.mkdirs();
}
else{
//是檔案
//開始将壓縮包中的資料寫到指定的位置上去
FileOutputStream outputStream=new FileOutputStream(new File(dest,entry.toString()));
int b;
while((b=zip.read())!=-1){
outputStream.write(b);
}
outputStream.close();
zip.closeEntry();
}
}
zip.close();
}
}
(2)壓縮流
一:壓縮檔案
public class exe_one { public static void main(String[] args) throws IOException { File src=new File("D:\\C\\ssss.txt"); File dest=new File("D:\\C"); jieyasuo(src,dest); } public static void jieyasuo(File src,File dest) throws IOException { //将ssss.txt壓縮成zip格式 //建立壓縮關流 ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(new File(dest,"ssss.txt"))); //建立zipEntry對象,表示壓縮包中的每一個檔案 ZipEntry entry=new ZipEntry("ssss.txt"); //将ZipEntry對象放到壓縮包中 zipOutputStream.putNextEntry(entry); //将src檔案中的資料寫到壓縮包中 FileInputStream fileInputStream=new FileInputStream(src); int b; while((b=fileInputStream.read())!=-1){ zipOutputStream.write(b); } zipOutputStream.closeEntry(); zipOutputStream.close(); } }
二:壓縮檔案夾
具體代碼如下:
public class exe_one { public static void main(String[] args) throws IOException { File src=new File("D:\\java\\a"); File destparent=src.getParentFile();//得到壓縮檔案的父級路徑 File dest=new File(destparent,src.getName()+".zip"); //建立壓縮關聯包 ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(dest)); //擷取src中的每個檔案以及檔案夾變成ZipEntry對象 yasuo(src,zipOutputStream,src.getName()); zipOutputStream.close(); } public static void yasuo(File src,ZipOutputStream zipOutputStream,String name) throws IOException { File[] files=src.listFiles(); for(File file:files){ if(file.isFile()){ //是檔案 //變成ZipEntrry對象,将資料壓縮 ZipEntry entry=new ZipEntry(name+"\\"+file.getName());//壓縮到的路徑 zipOutputStream.putNextEntry(entry); //讀取檔案中的資料,寫到壓縮包中 FileInputStream inputStream=new FileInputStream(file); int b; while((b=inputStream.read())!=-1){ zipOutputStream.write(b); } inputStream.close(); zipOutputStream.closeEntry(); } else{ //檔案夾壓縮 //遞歸壓縮 yasuo(file,zipOutputStream,name+"\\"+file.getName()); } } } }