JAVA简单图片分割器

更新时间:2023-05-11 02:37:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

java小程序

将一个图片切割成多个文件。在将多个文件合并成该图片





1,通过字节流读取该图片。定义一个缓冲区数组该数组的大小 是要生成的切割后的文件大小。

通过输出流将该数组中的数据,写到一个文件中(文件名要有规律。1.haha 2.haha...)

(可以通过一个自定义配置文件保存原文件的基本属性信息。如:源文件的名字 已经切割出来的碎片文件的个数。方便合并。)



2,合并,首先要知道碎片文件的目录,列出该目录当前的所有.haha文件。(遍历时可以通过配置文件中的信息确定循环的次数。)

并按照顺序把每一个碎片文件用流读取。(一个文件对应一个流。)

将这些流存入集合。(why?因为要通过序列流进行合并。(SequenceInputStream)该流会接受一个Enumeration)



3,读取序列流中的数据,并把该数据都写入到一个(图片)文件中。

*/



import java.io.*;



/*文件分割类,

1.通过流的形式读取源数据

2.通过定义一个固定的字节数组,实现文件分割

a,用FileInputStream读取源文件

b,通过一个字节数组作为中介存储

c,把读取到的数据写入到一个新文件

3.把原来的文件名和分割的个数写入到一个配置文件中

*/



import java.io.*;



/*文件分割类,

1.通过流的形式读取源数据

2.通过定义一个固定的字节数组,实现文件分割

a,用FileInputStream读取源文件

b,通过一个字节数组作为中介存储

c,把读取到的数据写入到一个新文件

3.把原来的文件名和分割的个数写入到一个配置文件中

*/

import java.io.*;



/*文件分割类,

1.通过流的形式读取源数据

2.通过定义一个固定的字节数组,实现文件分割

a,用FileInputStream读取源文件

b,通过一个字节数组作为中介存储

c,把读取到的数据写入到一个新文件

3.把原来的文件名和分割的个数写入到一个配置文件中

*/



import java.io.*;

import java.util.*;



/*文件分割类,

1.通过流的形式读取源数据

2.通过定义一个固定的字节数组,实现文件分割

a,用FileInputStream读取源文件

b,通过一个字节数组作为中介存储

c,把读取到的数据写入到一个新文件

3.把原来的文件名和分割的个数写入到一个配置文件中

*/

class FileSplit

{

private File f;

private FileInputStream fis;

private FileOutputStream fos;

priv
ate String fileName;

int count;



//传入要分割的文件路径

FileSplit( String s )

{

f=new File( s );

fileName=s;

count=0;

}




java小程序

public void split()

{

try

{

fis=new FileInputStream( f );

byte buf[]=new byte[1024*256];

int num=0;

while( ( num=fis.read( buf ) )!=-1 )

{

//创建一个临时的分割文件对象

if( createSplitFile( buf, 0, num )==-1 )

{

return;

}

count++;

}

}

catch( IOException e )

{

e.printStackTrace();

}

finally

{

//关闭输入流

if( fis!=null )

{

try

{

fis.close();

}

catch( IOException e )

{

e.printStackTrace();

}

}

}



//创建配置文件“file.ini”,其中格式为“文件个数>文件名”

createInfoFile();



System.out.println( "文件分割成功" );

}



////创建一个临时的分割文件对象,如果返回-1表示创建失败,

//程序退出

private int createSplitFile( byte buf[],int zero,int num )

{

//创建临时的文件对象

FileOutputStream fosTemp=null;

try

{

fosTemp=new FileOutputStream( count+".haha" );

fosTemp.write( buf,zero,num );

fosTemp.flush();

}

catch( IOException e )

{

System.out.println( "文件"+count+".haha创建失败" );

return -1;

}

finally

{

//关闭输出流

try

{

fosTemp.close();

}

catch( IOException e )

{


e.printStackTrace();

}

}

return 1;

}



//创建配置文件“file.ini”,其中格式为“文件个数>文件名”

private void createInfoFile()

{


java小程序

File infoFile=new File( "file.ini" );

BufferedWriter br=null;

try

{

//如果文件不存在就创建一个新的的文件

if( !infoFile.exists() )

{

infoFile.createNewFile();

}



br=new BufferedWriter(

new FileWriter(infoFile) );

br.write( count+">"+fileName );

br.newLine();

br.flush();

}

catch( IOException e )

{

e.printStackTrace();

}

finally

{

if( br!=null )

{

try

{

br.close();

}

catch( IOException e )

{

e.printStackTrace();

}

}

}

}



}



/*

文件合并类

1.通过枚举获取配置文件对象

2.通过输入流获取文件个数和源文件名称

3.把各个文件对象存放在序列流中

4.把通过序列流合并成一个文件

*/

class FileMerge

{

File fileDir; //配置文件目录



FileMerge( String s )

{

this.fileDir=new File( s );

}





public void startMerge()

{

//获取配置文件对象

File f=getFile( fileDir );



//获取文件的配置信息

String fileInfo=getFileInfo( f );



//获取文件的个数

int count=getFileCount( fileInfo );



//获取分割前的文件名

String fileName=getFileName( fileInfo );



//获取枚举集合

Vector<FileInputStream> v=getAllFile( count );



//如果集合不为空就合并文件

if( v!=null )

{

merge( v,fileName );

}

}



//获取配置文件对象

private File getFile( File fileDir )

{

File fileList[]=fileDir.listFiles();

for( int i=0; i<fileList.le
ngth; i++ )

{

if( fileList[i].getName().equals("file.ini"))

{

return fileList[i];

}

}

return null;

}



//

java小程序

获取文件的配置信息

private String getFileInfo( File f )

{

BufferedReader br=null;

String s=null;



try

{

//读取配置信息

br=new BufferedReader( new FileReader( f ) );

s=br.readLine();

}

catch( IOException e )

{

System.out.println( "读取配置文件失败" );

e.printStackTrace();

}

finally

{

//关闭输入流

if( br!=null )

{

try

{

br.close();

}

catch( IOException e )

{

e.printStackTrace();

}

}

}



return s;

}



//获取文件的个数

private int getFileCount( String fileInfo )

{

String num=null;

if( fileInfo!=null )

{

num=fileInfo.substring( 0,fileInfo.indexOf(''>'') );

}



return Integer.parseInt(num) ;

}



//获取分割前的文件名

private String getFileName( String fileInfo )

{

String fileName=null;

if( fileInfo!=null )

{

fileName=fileInfo.substring( fileInfo.indexOf(''>'')+1 );

}



return fileName;

}



//获取枚举集合

private Vector<FileInputStream> getAllFile( int count )

{

Vector<FileInputStream> v=new Vector<FileInputStream>();

for( int i=0; i<count; i++ )

{

File f=null;

try

{

f=new File( fileDir, i+".haha" );

if( !f.exists() )

{

System.out.println( i+".haha文件不存在,合并失败" );

return null;

}

v.add(
new FileInputStream( f ));

}

catch( IOException e )

{

e.printStackTrace();

}





}

return v;

}



//用序列流合并文件


java小程序

//V为枚举接口,count为文件数

private void merge( Vector<FileInputStream> v ,String fileName )

{

Enumeration<FileInputStream> e=v.elements();

SequenceInputStream sis=new SequenceInputStream(e);

FileOutputStream fos=null;

byte buf[]=new byte[1024];



try

{

//输出到文件fileName

fos=new FileOutputStream( fileName );

int num=0;



//读取文件的内容

while( (num=sis.read(buf))!=-1 )

{

fos.write( buf,0,num );

fos.flush();

}

}

catch( IOException e1 )

{

e1.printStackTrace();

}

finally

{

//关闭流

try

{

sis.close();

fos.close();

}

catch( IOException e1 )

{

e1.printStackTrace();

}

}



}



}



class Demo

{

public static void main(String arsg[]
)

{

//分割文件

new FileSplit( "1.bmp" ).split();



//合并文件

new FileMerge( "e://test" ).startMerge();

}

}

本文来源:https://www.bwwdw.com/article/v8we.html

Top