最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)文件的歸檔和解檔

 更新時(shí)間:2019年09月26日 09:03:32   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件的歸檔和解檔,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java實(shí)現(xiàn)文件歸檔和解檔的具體代碼,供大家參考,具體內(nèi)容如下

文件的歸檔

package cn.yimen.archiver;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 歸檔器
 */
public class Archiver {
 public static void main(String[] args) throws Exception {
 //
 FileOutputStream fos = new FileOutputStream("d:/arch/x.xar");
 fos.write(addFile("D:/arch/a.xls"));
 fos.write(addFile("D:/arch/b.xml"));
 fos.write(addFile("D:/arch/c.jpg"));
 fos.close();
 //

 }

 /**
 * path : d:/xxx/xxx/a.jpg
 * @throws Exception
 */
 public static byte[] addFile(String path) throws Exception{
 //文件
 File f = new File(path);
 //文件名
 String fname = f.getName();
 //文件名數(shù)組
 byte[] fnameBytes = fname.getBytes() ;
 //文件內(nèi)容長度
 int len = (int)f.length();

 //計(jì)算總長度  文件名長度 + 文件名內(nèi)容 + 文件內(nèi)容長度 + 文件內(nèi)容
 int total = 4 + fnameBytes.length + 4 + len ;

 //初始化總數(shù)組
 byte[] bytes = new byte[total];

 //1.寫入文件名長度
 byte[] fnameLenArr = Util.int2Bytes(fnameBytes.length);
 System.arraycopy(fnameLenArr, 0, bytes, 0, 4);

 //2.寫入文件名本身
 System.arraycopy(fnameBytes, 0, bytes, 4, fnameBytes.length);

 //3.寫入文件內(nèi)容長度
 byte[] fcontentLenArr = Util.int2Bytes(len);
 System.arraycopy(fcontentLenArr, 0, bytes, 4 + fnameBytes.length, 4);

 //4.寫入文件內(nèi)容
 //讀取文件內(nèi)容到數(shù)組中
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 FileInputStream fis = new FileInputStream(f);
 byte[] buf = new byte[1024];
 int len0 = 0 ;
 while((len0 = fis.read(buf)) != -1){
  baos.write(buf, 0, len0);
 }
 fis.close();
 //得到文件內(nèi)容
 byte[] fileContentArr = baos.toByteArray();

 System.arraycopy(fileContentArr, 0, bytes, 4 + fnameBytes.length + 4, fileContentArr.length);

 return bytes ;
 }
}

文件的解檔

package cn.yimen.archiver;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 解檔程序
 */
public class Unarchiver {
 public static void main(String[] args) throws Exception {

 List<FileBean> files = new ArrayList<FileBean>();
 //
 FileInputStream fis = new FileInputStream("d:/arch/x.xar");

 FileBean fileBean = null ;
 //
 while((fileBean = readNextFile(fis)) != null){
  files.add(fileBean);
 }
 //關(guān)閉流
 fis.close();

 FileOutputStream fos = null ;
 //
 for(FileBean fb : files){
  fos = new FileOutputStream("d:/arch/unarch/" + fb.getFileName());
  fos.write(fb.getFileContent());
  fos.close();
 }
 }

 /**
 * 從流中讀取下一個(gè)文件
 */
 public static FileBean readNextFile(FileInputStream fis) throws Exception{
 //
 byte[] bytes4 = new byte[4];
 //讀取四個(gè)字節(jié)
 int res = fis.read(bytes4);
 if(res == -1){
  return null ;
 }
 //文件名長度
 int fnameLen = Util.bytes2Int(bytes4);

 //文件名數(shù)組
 byte[] fileNameBytes = new byte[fnameLen];
 fis.read(fileNameBytes);

 //得到文件名
 String fname = new String(fileNameBytes);

 //再讀取4個(gè)字節(jié),作為文件內(nèi)容的長度
 fis.read(bytes4);
 int fileContLen = Util.bytes2Int(bytes4);

 //讀取文件內(nèi)容
 byte[] fileContBytes = new byte[fileContLen];
 fis.read(fileContBytes);
 return new FileBean(fname,fileContBytes);
 }
}
package cn.yimen.archiver;
/**
 * 文件Bean
 */
public class FileBean {
 private String fileName;
 private byte[] fileContent;

 public FileBean() {
 }

 public FileBean(String fname, byte[] fileContBytes) {
 this.fileName = fname ;
 this.fileContent = fileContBytes ;
 }

 public String getFileName() {
 return fileName;
 }

 public void setFileName(String fileName) {
 this.fileName = fileName;
 }

 public byte[] getFileContent() {
 return fileContent;
 }

 public void setFileContent(byte[] fileContent) {
 this.fileContent = fileContent;
 }

}

工具類

package cn.yimen.archiver;
public class Util {
 /**
 * 整型轉(zhuǎn)換成字節(jié)數(shù)組
 */
 public static byte[] int2Bytes(int i){
 byte[] arr = new byte[4] ;
 arr[0] = (byte)i ;
 arr[1] = (byte)(i >> 8) ;
 arr[2] = (byte)(i >> 16) ;
 arr[3] = (byte)(i >> 24) ;
 return arr ;
 }

 /**
 * 字節(jié)數(shù)組轉(zhuǎn)成int
 */
 public static int bytes2Int(byte[] bytes){
 int i0= bytes[0];
 int i1 = (bytes[1] & 0xFF) << 8 ;
 int i2 = (bytes[2] & 0xFF) << 16 ;
 int i3 = (bytes[3] & 0xFF) << 24 ;
 return i0 | i1 | i2 | i3 ;
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • Java項(xiàng)目打包部署之部署jar包和war包

    Java項(xiàng)目打包部署之部署jar包和war包

    我們在開發(fā)環(huán)境部署項(xiàng)目一般通過ideal將項(xiàng)目打包成包,然后連接linux服務(wù)器,這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目打包部署之部署jar包和war包的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 學(xué)習(xí)Java中的List集合

    學(xué)習(xí)Java中的List集合

    這篇文章主要介紹了學(xué)習(xí)Java中的List集合,List是一個(gè)有序集合, 說是集合,其實(shí)只是只是Collection接口的一個(gè)子接口,下面關(guān)于List的相關(guān)資料 需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • 深入淺出理解Java Lambda表達(dá)式之四大核心函數(shù)式的用法與范例

    深入淺出理解Java Lambda表達(dá)式之四大核心函數(shù)式的用法與范例

    Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊,今天小編帶你理解Lambda表達(dá)式之四大核心函數(shù)式的用法,感興趣的朋友快來看看吧
    2021-11-11
  • 更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator

    更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator

    這篇文章主要為大家介紹了更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringBoot框架實(shí)現(xiàn)支付和轉(zhuǎn)賬功能

    SpringBoot框架實(shí)現(xiàn)支付和轉(zhuǎn)賬功能

    在 Spring Boot 框架中實(shí)現(xiàn)支付和轉(zhuǎn)賬功能時(shí),涉及到多個(gè)細(xì)節(jié)和注意點(diǎn),這些功能通常需要高度的安全性、穩(wěn)定性和可擴(kuò)展性,本文介紹了實(shí)現(xiàn)支付和轉(zhuǎn)賬功能的一些關(guān)鍵點(diǎn),需要的朋友可以參考下
    2024-08-08
  • Spring?Security實(shí)現(xiàn)接口放通的方法詳解

    Spring?Security實(shí)現(xiàn)接口放通的方法詳解

    在用Spring?Security項(xiàng)目開發(fā)中,有時(shí)候需要放通某一個(gè)接口時(shí),我們需要在配置中把接口地址配置上,這樣做有時(shí)候顯得麻煩。本文將通過一個(gè)注解的方式快速實(shí)現(xiàn)接口放通,感興趣的可以了解一下
    2022-05-05
  • SpringBoot集成Liquibase的詳細(xì)步驟

    SpringBoot集成Liquibase的詳細(xì)步驟

    Liquibase 是一個(gè)強(qiáng)大的數(shù)據(jù)庫版本控制工具,能夠與 Spring Boot
    無縫集成,以簡化數(shù)據(jù)庫遷移和管理的過程,以下是從開始集成到最終運(yùn)行的詳細(xì)步驟,需要的朋友可以參考下
    2024-12-12
  • Java StringTokenizer分隔符拆分字符串

    Java StringTokenizer分隔符拆分字符串

    Java中的StringTokenizer類用于將一個(gè)字符串分解成標(biāo)記,本文主要介紹了Java StringTokenizer分隔符拆分字符串,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • springboot中的starter及自定義方法詳解

    springboot中的starter及自定義方法詳解

    這篇文章主要介紹了springboot中的starter及自定義方法詳解,Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境(條件)進(jìn)行自動(dòng)配置,需要的朋友可以參考下
    2023-11-11
  • SpringBoot項(xiàng)目中引入本地JAR包配置的幾種方法

    SpringBoot項(xiàng)目中引入本地JAR包配置的幾種方法

    SpringBoot有時(shí)需要引入本地JAR包以便重用已有的代碼庫或者第三方庫,本文主要介紹了SpringBoot項(xiàng)目中引入本地JAR包配置的幾種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評論

新乡县| 榆林市| 伊宁县| 灵山县| 广西| 宝兴县| 尼木县| 三门峡市| 孝昌县| 内乡县| 额济纳旗| 常宁市| 荆州市| 福海县| 迭部县| 荣成市| 万荣县| 城口县| 石家庄市| 萨嘎县| 鄄城县| 敦化市| 康马县| 麻江县| 哈密市| 新巴尔虎左旗| 汨罗市| 岳西县| 尉犁县| 图片| 中阳县| 阜康市| 卢氏县| 西华县| 儋州市| 广西| 阳城县| 张掖市| 桂平市| 湖南省| 奉节县|