`
longgangbai
  • 浏览: 7325919 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 分割功能实现

 
阅读更多

    在项目针对比较大的文件需要文件的分割功能,特意写了一个具有分割功能代码,以供大家拍砖之用,目的进行沟通交流,如有好的建议和联系本人沟通交流谢谢!

package easyway.tbs.file.transport.core.split;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.Serializable;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 文件读写访问器
 * 
 * @author longgangbai
 *
 */
public class DataFileAccessor implements Serializable {
	 private final static Log logger = LogFactory.getLog(DataFileAccessor.class);
     
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 只读模式
	 */
	public static final String RANDOMACESSFILE_READ_MODE="r";
	/**
	 * 只写模式
	 */
	public static final String RANDOMACESSFILE_WRITE_MODE="w";
	/**
	 * 读写模式
	 */
	public static final String RANDOMACESSFILE_WRITE_READ_MODE="rw";
	
	/**
	 * 随机读取的缓存文件的长度
	 */
	public static final int RANDOMACESSFILE_BUFFER_LENGTH=1024*1000;
				
				
	/**
	 * 文件读取的对象操作对象
	 */
	private RandomAccessFile fileAcessor;
	/**
	 * 在文件的路径
	 */
    private String filePath;
    
    /**
     * 
     * @throws IOException
     */
	public DataFileAccessor() throws IOException {
		this("", RANDOMACESSFILE_WRITE_READ_MODE);
	}

	/**
	 * 文件读取访问其
	 * @param sName 
	 * @param nPos
	  * @param nPos
	 * @throws IOException
	 */
	public DataFileAccessor(String filePath, String mode) throws IOException {
		this.filePath=filePath;
		//支持读写操作
		if(logger.isDebugEnabled()){
			logger.info("filePath="+filePath+"======mode===="+mode);
		}
		fileAcessor = new RandomAccessFile(filePath, mode);
	}

	/**
	 * 写文件的片段
	 * @param buffer 
	 *             临时存储的数据的数组
	 * @param nStart
	 * @param nLen
	 * @return
	 */
	public synchronized int write(byte[] buffer, int nStart, int nLen) {
		if(logger.isDebugEnabled()){
			logger.info("nStart="+nStart+"  nLen="+nLen);
		}
		int n = -1;
		try {
			//移动文件指针
			fileAcessor.seek(nStart);
			fileAcessor.write(buffer, nStart, nLen);
			n = nLen;
		} catch (IOException e) {
			logger.error("write file "+filePath +" nStart="+nStart+"   nLen="+nLen,e);
			
		}
		return n;
	}
	
	/**
	 * 写文件的片段
	 * @param buffer 
	 *             临时存储的数据的数组
	 * @param nStart
	 * @param nLen
	 * @return
	 */
	public synchronized int readFile(byte[] buffer, int offset, int nLen) {
		try {
			fileAcessor.seek(offset);
			long length = nLen + 1;// 文件段的长度
			byte[] b = new byte[RANDOMACESSFILE_BUFFER_LENGTH];
			long m = length / b.length;// 读和写入2048个字节的次数
			int leftsize = (int) (length - m * b.length);// 剩下的字节数
			long timestart = System.currentTimeMillis();
			for (long i = 1; i <= m; i++) {
				fileAcessor.read(b);// 将数据从from文件读入
			}
			fileAcessor.read(b, 0, leftsize);// 读入最后剩下的字节
			fileAcessor.close();// 关闭输入
			long timeend = System.currentTimeMillis();
			if(logger.isDebugEnabled()){
				logger.info("线程" + Thread.currentThread().getName()
						+ "读写完毕,共使用" + (timeend - timestart) + "毫秒");
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return -1;
	}
	/**
	 * 
	 * @param file
	 * @param tempFile
	 * @param begin
	 * @param end
	 * @return
	 * @throws IOException
	 */
	  public  long writeTempFile(File file, File tempFile, long begin ,long end) throws IOException{
		  RandomAccessFile in=new RandomAccessFile(file,RANDOMACESSFILE_READ_MODE);
		  RandomAccessFile out=new RandomAccessFile(tempFile,RANDOMACESSFILE_WRITE_READ_MODE);
		  byte[] b=new byte[RANDOMACESSFILE_BUFFER_LENGTH];
		  int n=0;
		  in.seek(begin);
		  while(in.getFilePointer()<=end&&(n=in.read(b))!=-1){
			  out.write(b,0,n);
		  }
		  long endPointer=in.getFilePointer();
		  in.close();
		  out.close();
		  return endPointer;
	  }
	  
	
	public synchronized int read(byte[] buffer, int offset, int nLen) {
		int n = -1;
		FileInputStream is=null;
		try {
			 is=new FileInputStream(filePath);
			 //忽略前面的读取信息
			 is.skip(offset);
			 fileAcessor.seek(offset);
			 //定义读取输入流内容的缓存数据
			 byte[] buff=new byte[RANDOMACESSFILE_BUFFER_LENGTH];
			 //定义最多需要读取几次就可以完成本次的读取
			 long times=(nLen%RANDOMACESSFILE_BUFFER_LENGTH==0)?nLen/RANDOMACESSFILE_BUFFER_LENGTH:((nLen/RANDOMACESSFILE_BUFFER_LENGTH)+1);
			 int hasRead=0;
			 for (int i = 0; i < times; i++) {
				 hasRead=is.read(buff);
				 if(hasRead<0){
					 break;
				 }
				 fileAcessor.read(buffer);
			}
			n = nLen;
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(is!=null){
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				is=null;
			}
		}
		return n;
	}
	
	/**
	 * 关闭流对象
	 *
	 */
	public void close(){
	    if (fileAcessor != null) {
            try {
            	fileAcessor.close();
            } catch (Throwable ignore) {
            }
            fileAcessor = null;
        }
	}


	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}
	
	
}

 

 

package easyway.tbs.file.transport.core.split;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
 * 文件分割线程
 * @author longgangbai
 *
 */
public class FileSplitterFetch implements Runnable {
	 private final static Log logger = LogFactory.getLog(DataFileAccessor.class);
	  
    /**
     * 将读取到的字节输出到raf中
     */
    private DataFileAccessor raf;
    /**
     * 文件整个完成标识
     */
	private CountDownLatch masterLatch;
    /**
     * 当前文件读取执行完毕的标识
     */
	private CountDownLatch childrenLatch;
    /**
     * 文件分割的文件片段
     */
    private FileSplitterMessage message;
    
    

    /**
     * 构造器 
     * @param filepath 	服务器文件的路径
     * @param offset	输出流和读取起始点
     * @param length   输出流和读取结束点
     * @param buffer   数组的大小
     * @throws IOException
     */
    public FileSplitterFetch(FileSplitterMessage message,CountDownLatch masterLatch,CountDownLatch childrenLatch) throws IOException {
    	super();
    	this.message=message;
    	this.masterLatch=masterLatch;
    	this.childrenLatch=childrenLatch;
    	this.raf=new DataFileAccessor(message.getFilePath(),DataFileAccessor.RANDOMACESSFILE_READ_MODE);
    	System.out.println("raf=="+this.raf);
    }

    /**
     * 执行读取的方法
     */
    public void run() {

    	File tempFile = message.getTempFile();
    	try {
        	if(!tempFile.exists()){
        		tempFile.createNewFile();
        	}
			//masterLatch.await();
    		this.raf.writeTempFile(new File(message.getFilePath()), tempFile, message.getStartPos(), message.getEndPos());
        } catch (Exception ex) {
        	if(tempFile.exists()){
        		try {
					FileUtils.forceDelete(tempFile);
				} catch (IOException e) {
					
				}
        	}
        }finally {  
        	//使用finally块来关闭当前线程的输入流、输出流
        	this.raf.close();
        	//childrenLatch.countDown();
        }
        
    }


}

   

 

 

package easyway.tbs.file.transport.core.split;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 文件分割管理器
 * 当单个线程执行完毕之后,开始发送文件
 * @author longgangbai
 *
 */
public class FileSplitterManager {
	private static String File_Split_Separator="_";
	 private static final transient Logger logger = LoggerFactory.getLogger(FileSplitterManager.class);

	/**
	 * 文件的总长度
	 */
	private long fileLength;

	/**
	 * 整个文件分割完成的标识
	 * 开始执行发送消息
	 */
	private CountDownLatch masterLatch = new CountDownLatch(1);
	/**
	 *文件分割线程的数量
	 */
	private int splitThreadNum;
    /**
     * 
     * 当每一个线程执行完毕时候,则报告执行执行线程完成,当所有的执行线程
     * 执行完毕,则开始发送文件
     */
	private CountDownLatch childrenLatch = null;
	
	/**
	 * 文件片段的集合
	 */
	private List<FileSplitterMessage> fileSplitterMessageList=null;
	/**
	 * 创建文件锁
	 */
	private FileTransportLock fileLock=null;
	//发送文件的路径
	private String filepath;
	//发送文件的限制大小
	private int filepageSize;
	
	
	private String fileChannel;
	
	private File file;
	
	/**
	 * 
	 * @param filepath
	 * @param filepageSize
	 */
	public FileSplitterManager(String filepath,int filepageSize,String fileChannel){
		this.filepath=filepath;
		this.filepageSize=filepageSize;
		this.fileChannel=fileChannel;
	}

	/**
	 * 文件分割管理器的方法
	 *
	 */
	public void splitFileMgr(){
		file=new File(filepath);
		 //获取文件的大小
    	long fileTotalSize=file.length();
    	//如果文件的大小
    	if(filepageSize>0&&(filepageSize<fileTotalSize)){
    		initSplitFileMgr(file);
    	}else{
    		//直接发送文件
				fileSplitterMessageList=new ArrayList<FileSplitterMessage>(1);
				
				FileSplitterMessage fileSplitMessage=new  FileSplitterMessage();
	    		fileSplitMessage.setFilePath(file.getAbsolutePath());
	    		fileSplitMessage.setFileLength(file.length());
	    		fileSplitMessage.setFileName(file.getName());
	    		fileSplitMessage.setSplitThreadNum(1);
	    		fileSplitMessage.setCurrentThreadNum(1);
	    		fileSplitMessage.setStartPos(0);
	    		fileSplitMessage.setEndPos(filepageSize);
	    		fileSplitMessage.setLen(fileTotalSize);
	    		
	    		String threadNum="1";
	    		String currentThread="1";
	    		//临时文件的命名规则:源文件名称+“_”+"总线程数"+“_”+"当前线程编号"
	    		String tempFileName=file.getName()+File_Split_Separator+threadNum+File_Split_Separator+currentThread+".tmp";
	    		//文件相对比较小,文件的总线程数为1,当前线程也为1
	    		File tempFile=getTempFileName(file.getParent(),tempFileName);
	    		
	    		fileSplitMessage.setTempFile(tempFile);
	    		fileSplitterMessageList.add(fileSplitMessage);
	    		
	    		//重新命名原来的文件,标识文件已经开始发送
	    		file.renameTo(new File(file.getAbsolutePath()+".bak"));
	    		
	    		if(logger.isDebugEnabled()){
					logger.debug("the direct send file "+file.getAbsolutePath());
				}
    	}
    	System.out.println("fileSplitterMessageList ="+fileSplitterMessageList.size());
	}
	/**
	 * 创建临时文件
	 * @param parentPath
	 * @param tempFileName
	 * @return
	 */
	public File getTempFileName(String parentPath,String tempFileName){
		System.out.println(parentPath+File.separator+tempFileName);
			File tempFile=new File(parentPath+File.separator+tempFileName);
	
		try {
			if(tempFile.exists()){
				FileUtils.forceDelete(tempFile);
				if(logger.isDebugEnabled()){
					logger.info("文件存在,已经删除!");
				}
			}
			tempFile.createNewFile();
		} catch (IOException e) {
			if(logger.isDebugEnabled()){
				logger.info("文件创建失败:"+e);
			}
		}
		return tempFile;
	}

	/**
	 * 分割文件的方法
	 *
	 */
	public void initSplitFileMgr(File file) {
		if(file.exists()){
			//创建文件锁
			//fileLock=new FileTransportLock(file,false);
			try {
				//设置文件锁
				//fileLock.lock();
				String fileName=file.getName();
	            //获取文件的长度
	        	fileLength=file.length();
	        	//获取文件对应的线程数
	        	splitThreadNum=(int)getThreadNum(fileLength,filepageSize);
	        	//线程同步线程
	        	childrenLatch = new CountDownLatch(splitThreadNum);
	        	//
	        	fileSplitterMessageList=new ArrayList<FileSplitterMessage>(splitThreadNum);
	        	//文件分割的过程
	        	splitFile(filepath,filepageSize,fileName);
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				//释放文件锁
				//fileLock.unlock();
			}
		}
	}
	

	/**
	 * 总的线程数
	 * @param fileSize
	 * @param filepageSize
	 * @return
	 */
	public long getThreadNum(long fileSize,long filepageSize){
		long 	threadNum=(fileSize%filepageSize==0)?(fileSize%filepageSize):((fileSize/filepageSize)+1);
		return threadNum;
	}
	
	/**
	 * 分解文件
	 * @param filepath  文件路径
	 * @param filepageSize  文件的大小
	 */ 
	public void splitFile(String filepath,int filepageSize,String fileName){
				
		        //当前线程真正读取的长度
	        	int length=filepageSize;
	        	//创建一个线程池
	        	ExecutorService threadExePool = Executors.newFixedThreadPool(splitThreadNum);
	        	//循环创建线程
	        	for(int i=1;i<=splitThreadNum;i++){
	        		//起始点
	        		int startPos=(i-1)*filepageSize;
	        		
	        		int endPos=i*filepageSize;
	        		
	        		FileSplitterMessage  fileSplitterMessage=new FileSplitterMessage();
	        		
	        		String tempFileName=file.getName()+File_Split_Separator+splitThreadNum+File_Split_Separator+i+".tmp";
	        		
	        		File tempFile=getTempFileName(file.getParent(), tempFileName);
	        		
	        		//针对文件最后一个片度结束点和片段长度
	        		if((splitThreadNum==i)&&(fileLength%filepageSize!=0)){
	        			endPos=(int)fileLength;
	        			length=(int)fileLength-startPos;
	        		}
	        		//设置文件片段内容
        			fileSplitterMessage.setTempFile(tempFile);
        			//文件读取起始点
        			fileSplitterMessage.setStartPos(startPos);
        			//文件读取起始点
        			fileSplitterMessage.setEndPos(endPos);
        			//文件总长度
        			fileSplitterMessage.setFileLength(fileLength);
        			//文件路径
        			fileSplitterMessage.setFilePath(filepath);
        			//文件分割线程数
        			fileSplitterMessage.setSplitThreadNum(splitThreadNum);
        			//当前线程编号数
        			fileSplitterMessage.setCurrentThreadNum(i);
        			//读取的长度
        			fileSplitterMessage.setLen(length);
        			
        			System.out.println("fileSplitterMessage="+fileSplitterMessage);
        			//文件的名称
        			fileSplitterMessage.setFileName(file.getName());
        			fileSplitterMessageList.add(fileSplitterMessage);
	        }
	       try {
	    		if(logger.isDebugEnabled()){
					logger.debug("文件"+fileName+"开始分割....");
				}
	    		//线程池开始执行线程
	        	for (FileSplitterMessage fileMessage : fileSplitterMessageList) {
	        		threadExePool.execute(new FileSplitterFetch(fileMessage,masterLatch,childrenLatch));					
				}
				masterLatch.countDown();//宣布开始
				if(logger.isDebugEnabled()){
					logger.debug("文件"+fileName+"分割完毕....");
				}
				//等待CountdownLatch信号为0,表示所有子线程都结束。 
				childrenLatch.await();//等待结束
		 
				System.out.println("size ================="+fileSplitterMessageList.size());
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				System.out.println("整个文件"+fileName+"分割完毕");
				//开始执行发送文件
			}
			//注意线程已经要结束了,但是threadExePool线程如果不关闭是不会结束的
			threadExePool.shutdown();
	}


	public int getFilepageSize() {
		return filepageSize;
	}


	public void setFilepageSize(int filepageSize) {
		this.filepageSize = filepageSize;
	}


	public String getFilepath() {
		return filepath;
	}


	public void setFilepath(String filepath) {
		this.filepath = filepath;
	}


	public String getFileChannel() {
		return fileChannel;
	}

	public void setFileChannel(String fileChannel) {
		this.fileChannel = fileChannel;
	}

}

 

 

 

package easyway.tbs.file.transport.core.split;

import java.io.File;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * 文件分割一段的信息
 * 
 * 
 * @author longgangbai
 *
 */
public class FileSplitterMessage {
	
		/**
		 * 文件路径
		 */
		private String filePath;
		/**
		 * 文件总长度
		 */
		private long fileLength;
		
		/**
		 * 文件名称
		 */
		private String fileName;
		/**
		 * 分割线程数量
		 */
		private int splitThreadNum;
		
		/**
		 * 当前分割线程编号
		 */
		private int currentThreadNum;
		/**
		 * 文件开始读取的起始点
		 */
		private int startPos;
		/**
		 * 文件开始读取的结束点
		 */
		private int endPos;
		/**
		 * 文件起止点之间的数据信息
		 */
		private byte[] data;
		/**
		 * 临时文件
		 */
		private File tempFile;
		/**
		 * 临时文件的长度
		 */
		private long len;
		
		
		
		public byte[] getData() {
			return data;
		}
		public void setData(byte[] data) {
			this.data = data;
		}
		public int getEndPos() {
			return endPos;
		}
		public void setEndPos(int endPos) {
			this.endPos = endPos;
		}
		public long getFileLength() {
			return fileLength;
		}
		public void setFileLength(long fileLength) {
			this.fileLength = fileLength;
		}
		public String getFilePath() {
			return filePath;
		}
		public void setFilePath(String filePath) {
			this.filePath = filePath;
		}
		public int getSplitThreadNum() {
			return splitThreadNum;
		}
		public void setSplitThreadNum(int splitThreadNum) {
			this.splitThreadNum = splitThreadNum;
		}
		public int getStartPos() {
			return startPos;
		}
		public void setStartPos(int startPos) {
			this.startPos = startPos;
		}
		public int getCurrentThreadNum() {
			return currentThreadNum;
		}
		public void setCurrentThreadNum(int currentThreadNum) {
			this.currentThreadNum = currentThreadNum;
		}
		

		public String getFileName() {
			return fileName;
		}
		public void setFileName(String fileName) {
			this.fileName = fileName;
		}
		public File getTempFile() {
			return tempFile;
		}
		public void setTempFile(File tempFile) {
			this.tempFile = tempFile;
		}
	
	    @Override
		public String toString(){
			return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
		}
		public long getLen() {
			return len;
		}
		public void setLen(long len) {
			this.len = len;
		}
}

 

 

 

package easyway.tbs.file.transport.core.split;

import java.io.File;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * 文件分割一段的信息
 * 
 * 
 * @author longgangbai
 *
 */
public class FileSplitterMessage {
	
		/**
		 * 文件路径
		 */
		private String filePath;
		/**
		 * 文件总长度
		 */
		private long fileLength;
		
		/**
		 * 文件名称
		 */
		private String fileName;
		/**
		 * 分割线程数量
		 */
		private int splitThreadNum;
		
		/**
		 * 当前分割线程编号
		 */
		private int currentThreadNum;
		/**
		 * 文件开始读取的起始点
		 */
		private int startPos;
		/**
		 * 文件开始读取的结束点
		 */
		private int endPos;
		/**
		 * 文件起止点之间的数据信息
		 */
		private byte[] data;
		/**
		 * 临时文件
		 */
		private File tempFile;
		/**
		 * 临时文件的长度
		 */
		private long len;
		
		
		
		public byte[] getData() {
			return data;
		}
		public void setData(byte[] data) {
			this.data = data;
		}
		public int getEndPos() {
			return endPos;
		}
		public void setEndPos(int endPos) {
			this.endPos = endPos;
		}
		public long getFileLength() {
			return fileLength;
		}
		public void setFileLength(long fileLength) {
			this.fileLength = fileLength;
		}
		public String getFilePath() {
			return filePath;
		}
		public void setFilePath(String filePath) {
			this.filePath = filePath;
		}
		public int getSplitThreadNum() {
			return splitThreadNum;
		}
		public void setSplitThreadNum(int splitThreadNum) {
			this.splitThreadNum = splitThreadNum;
		}
		public int getStartPos() {
			return startPos;
		}
		public void setStartPos(int startPos) {
			this.startPos = startPos;
		}
		public int getCurrentThreadNum() {
			return currentThreadNum;
		}
		public void setCurrentThreadNum(int currentThreadNum) {
			this.currentThreadNum = currentThreadNum;
		}
		

		public String getFileName() {
			return fileName;
		}
		public void setFileName(String fileName) {
			this.fileName = fileName;
		}
		public File getTempFile() {
			return tempFile;
		}
		public void setTempFile(File tempFile) {
			this.tempFile = tempFile;
		}
	
	    @Override
		public String toString(){
			return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
		}
		public long getLen() {
			return len;
		}
		public void setLen(long len) {
			this.len = len;
		}
}

 

 

 

package easyway.tbs.file.transport.core.split;

/**
 * 分割文件测试类
 * @author longgangbai
 *
 */
public class FileSplitterManagerMain {
	
	public static void main(String[] args) {
		FileSplitterManager manager=new FileSplitterManager("E:/TestJoltProxy/RMAN.txt",10*1024*1024,"queue-svn");
		manager.splitFileMgr();
	}

}

 

分享到:
评论

相关推荐

    java文件分割压缩

    6. **类的设计**:`Work5`, `Work5_new`, `OneTest`, `JieMu`等可能是实现文件分割和压缩功能的具体类。它们可能包含了主函数、方法以及一些辅助类来完成文件处理任务。 7. **测试**:`OneTest`类很可能包含了单元...

    用JAVA实现文件的分割

    本篇将详细介绍如何使用Java实现文件的分割,并提供相关的代码示例。 首先,我们需要理解文件分割的基本原理。文件分割通常涉及到读取原始文件的字节内容,然后按照指定的大小或逻辑结构将其分成多个部分。在Java中...

    java 分割字符串

    在Java编程语言中,分割字符串是一项常见的...综上所述,`java 分割字符串`是一个基本但强大的功能,它在处理文本数据时起着至关重要的作用。熟练掌握`split()`方法的使用,可以提高你在处理字符串时的效率和灵活性。

    新版java分割器来了,哈哈

    此次发布的"新版Java分割器"是原有版本的升级,优化了功能,使其更加实用,适应更多场景的需求。下面将详细介绍这个工具的核心特性、使用方法以及与Java编程相关的知识。 1. **核心功能**: 新版Java分割器的主要...

    java图像分割方法集合

    在提供的代码片段中,有一个名为`ImageTest`的类,它实现了简单的图像分割功能。该类包含了一个`splitImage`方法,该方法接受一个文件路径、行数和列数作为参数,并返回一个由分割后的小图像组成的数组。具体实现...

    面板的分割java

    根据给定的信息,本文将详细解释Java中的面板分割技术,并结合密码验证功能及JList等组件的应用场景。本文主要分为以下几个部分:理解JSplitPane、实现面板分割、整合其他组件如JList,以及如何增强应用安全性。 ##...

    java_spliter.zip_java split_java spliter_分割文件

    这个名为"java_spliter.zip"的压缩包包含了一个名为"Splitter.java"的源代码文件,它是实现文件分割功能的Java程序。这个小程序对理解Java的输入/输出(I/O)操作具有很好的学习价值。 首先,让我们深入了解一下...

    java实现文件的分割.rar

    本示例“java实现文件的分割.rar”提供的SplitFile程序,利用了Java的随机访问流(RandomAccessFile)来实现文件的切割。下面我们将深入探讨这个过程涉及的关键知识点。 1. **随机访问流(RandomAccessFile)**: Java...

    java实现文件合并与分割

    在Java编程语言中,文件合并与分割是常见的文件操作任务,尤其在大数据处理、日志分析和文件管理等场景中尤为关键。本程序提供了一个基础的实现,旨在帮助初学者理解这一过程,并通过MD5校验确保文件的完整性和未被...

    java 分割文件 将大文件分割成小文件

    在Java编程语言中,分割大文件是一项常见的任务,特别是在处理大量数据或需要分批传输大文件的场景下。本文将详细介绍如何使用Java将一个大文件按照特定条件(如文件大小或生成日期)分割成多个小文件。 首先,我们...

    用java实现任意文件分割

    本文将深入探讨如何使用Java语言来实现任意文件的分割与合并,以及如何利用这种技术来提高效率和节省存储空间。 首先,让我们理解文件分割的概念。文件分割是将一个大文件拆分为多个小文件的过程,这在处理大型数据...

    java 字符串分割

    在本例中,我们将学习如何使用 Java 实现字符串分割功能,包括将输入字符串分割成 10 个字符一组的数组,并将其倒序输出。 知识点一:字符串分割的基本概念 字符串分割是指将一个给定的字符串按照一定的规则分割成...

    如何利用Java实现QQ文件传输功能

    在Java中实现文件传输功能是一个广泛的话题,涉及到网络编程和数据传输的许多基础知识。本知识点将围绕Java网络编程中的Socket通信和文件传输的实现原理进行详细探讨。 1. Java网络编程基础 Java网络编程提供了两个...

    JAVA 聊天室功能实现

    本项目名为"JAVA 聊天室功能实现",它涵盖了单聊、群聊、文件传输以及截屏和字体颜色设置等核心功能。以下是这些功能的详细说明: 1. **单聊与群聊**: 单聊是指两个用户之间的私密对话,而群聊则是多用户参与的...

    Java实现文件分割与合并

    本文将详细介绍如何使用Java语言实现文件的分割与合并功能。此技术对于数据传输、备份或处理大量数据时非常有用。通过分割大文件为较小的部分,可以有效地减少单个文件的大小,从而更容易进行传输或存储。此外,文件...

    JAVA实现文件预览功能

    在Java编程环境中,实现文件预览功能是一项常见的需求,尤其在开发桌面应用或者Web应用时。文件预览可以使用户在不打开文件本身的情况下查看文件内容,增强了用户体验。本篇文章将深入探讨如何使用Java来实现这一...

    java文件分割器java文件分割器

    #### 文件分割功能实现 1. **文件读取与大小检测**:`openFile`方法用于打开并读取指定的文件。通过`FileInputStream`流,可以逐块读取文件数据。这里定义了一个字节数组`b`,大小为1024字节,用于一次性读取文件的...

    java实现流媒体播放

    流媒体技术的核心在于将连续的音频或视频数据分割成小的数据包,然后通过网络逐个发送给客户端,从而实现实时播放的效果,而无需等待整个文件下载完毕。 一、Java 流媒体基础 Java 语言提供了丰富的API来处理流媒体...

    java 把大文件分割为小文件

    下面是实现该功能的 Java 代码示例: ### 1. 大文件分割 大文件分割是指将一个大文件分割成多个小文件,以便于存储、管理和处理。在 Java 中,可以使用 Java.IO 包中的 FileReader 和 FileWriter 类来实现大文件的...

    将大文件分割及合并java源码

    首先,我们来看一下`SplitImageUtil.java`这个文件,它是实现文件分割和合并功能的主要代码。在Java中,我们可以使用`java.io`包中的`File`类、`BufferedInputStream`和`BufferedOutputStream`进行文件操作。`...

Global site tag (gtag.js) - Google Analytics