当前位置:  编程技术>移动开发
本页文章导读:
    ▪Java资料的拆分与合并(一)        Java文件的拆分与合并(一)package cn.com; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; //文件的拆分和组合 //步骤: //1 依据源文件大小和每块的大小计.........
    ▪ 使用ExpandableListView——当有Group选项展开时,怎么正确获取长按的Group选项        使用ExpandableListView——当有Group选项展开时,如何正确获取长按的Group选项。当我们使用ExpandableListView时,实现点击一个GroupView则展开ChidView,那么这个时候,Adapter的大小前后是有变化的。 例.........
    ▪ 为啥在 Objective-C 中给 nil 发送消息程序不会崩溃       为什么在 Objective-C 中给 nil 发送消息程序不会崩溃? PC 上,在 C 语言中对空指针进行操作, 原因需要从源代码中寻找, 一般用 r0-r4 传递参数, /********************************************************.........

[1]Java资料的拆分与合并(一)
    来源: 互联网  发布时间: 2014-02-18
Java文件的拆分与合并(一)
package cn.com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
//文件的拆分和组合
//步骤:
//1 依据源文件大小和每块的大小计算出块数
//2 将每一块写到一个对应的文件
public class FileSeparatorAndUnite {
	long rawFileSize;
	long blocksNumber;
	String rawFileName=null;
	String [] allPaths=null;
	public static void main(String[] args) {
         FileSeparatorAndUnite test=new FileSeparatorAndUnite();
         //拆分文件
         String [] allPaths=test.separatorFile("F:\\2.jpg", 1024*10);
         //组合文件
         test.uniteFile(allPaths, "F:\\99.jpg");
	}
	
	/**
	 * @param rawFilePath   待拆分文件的路径
	 * @param perBlockSize  拆分后每份的大小
	 * @return              各部分路径的数组集合
	 */
	private String[] separatorFile(String rawFilePath,long perBlockSize){
		File rawFile=new File(rawFilePath);
		rawFileName=rawFile.getName();
		rawFileSize=rawFile.length();
		blocksNumber=getBlocksNumber(rawFileSize,perBlockSize);
		allPaths=new String[(int)blocksNumber];
		if (blocksNumber==1) {
			perBlockSize=rawFileSize;
		}
		long perPartSize=0;
		long perPartBeginPosition=0;
		String perPartPath=null;
		for (int i = 1; i <=blocksNumber; i++) {
			if (i<blocksNumber) {
				//每一块的大小就为perBlockSize
				perPartSize=perBlockSize;
			} else {
				//最后一块的大小为总大小-该块的起始位置
                perPartSize=rawFileSize-perPartBeginPosition;
			}
			//得到每一块的path
			if (blocksNumber==1) {
				perPartPath=rawFilePath+".bat";
			} else {
				perPartPath=getPerPartFilePath(rawFilePath, i);
			}
			//操作每一块
			//第一次调用时perPartBeginPosition当然为0
			System.out.println("该Block开始位置:perPartBeginPosition="+perPartBeginPosition);
			writePerPartToFile(rawFilePath, perPartPath, perPartSize, perPartBeginPosition); 
			//计算每一块的在原文件中的起始位置.
			perPartBeginPosition=perPartBeginPosition+perPartSize;
			//保存每一块的路径
			allPaths[i-1]=perPartPath;
			
			System.out.println("该Block大小:perPartSize="+perPartSize);
			
		}
		return allPaths;
		
	}
	
	/**
	 * @param rawFilePath       原文件路径
	 * @param perPartFilePath   每部分对应的路径
	 * @param blockSize         每部分的块大小
	 * @param beginPosition     每部分在原文件中的开始位置 
	 * @return
	 * 
	 * rafForReader.read(buffer, 0, everyTimeReadLen)
	 * 表示:向buffer中读入everyTimeReadLen个字节
	 */
	public boolean writePerPartToFile(String rawFilePath,String perPartFilePath,long blockSize,long beginPosition){
		RandomAccessFile rafForReader=null;
		RandomAccessFile rafForWriter=null;
		boolean isContinueReading=true;
		//每次应该读取的字节数 
		int everyTimeReadLen=0;
		byte [] buffer=new byte[1024*8];
		try {
			rafForReader=new RandomAccessFile(rawFilePath, "r");
			rafForReader.seek(beginPosition);
			File perPartFile=new File(perPartFilePath);
			rafForWriter=new RandomAccessFile(perPartFile, "rw");
			//设置文件大小
			rafForWriter.setLength(blockSize);
			int writerOff=0;
			//设置第一次read()应该读取的字节
			if (blockSize>buffer.length) {
				everyTimeReadLen=buffer.length;
			}else {
				everyTimeReadLen=(int)blockSize;
			}
			while (rafForReader.read(buffer, 0, everyTimeReadLen)!=-1&&isContinueReading){
				  rafForWriter.seek(writerOff);
				  writerOff+=everyTimeReadLen;
				  rafForWriter.write(buffer, 0, everyTimeReadLen);
				  //动态改变下次该读取的字节数
				  if (blockSize-writerOff>buffer.length) {
						everyTimeReadLen=buffer.length;
					}else {
						everyTimeReadLen=(int)blockSize-writerOff;
					}
				  //读取完毕
				  if (everyTimeReadLen==0) {
					isContinueReading=false;
				}
			}
			rafForReader.close();
			rafForWriter.close();
		} catch (Exception e) {
			return false;
		}
		return true;
	}
	
	/**
	 * @param rawFileSize   原文件大小
	 * @param perBlockSize  每块的大小
	 * @return              拆分后块数
	 */
	public long getBlocksNumber(long rawFileSize,long perBlockSize){
		if (rawFileSize<=perBlockSize) {
			return 1;
		} else {
            if (rawFileSize%perBlockSize==0) {
				return (rawFileSize/perBlockSize);
			} else {
                return (rawFileSize/perBlockSize)+1;
			}
		}
	}
	
	/**
	 * @param rawFilePath   原文件路径
	 * @param blockNumer    当前块号码
	 * @return              当前块对应的路径
	 */
	public String getPerPartFilePath(String rawFilePath,int blockNumer){
		String perPartFilePath=rawFilePath+".part"+blockNumer;
		return perPartFilePath;
	}
	
	/**
	 * @param partsPaths      各部分路径
	 * @param unitedFilePath  合并后文件路径
	 */
	public void uniteFile(String [] partsPaths,String unitedFilePath){
		try {
			File perPartFile=null;
			File unitedFile=new File(unitedFilePath);
			FileOutputStream fos=new FileOutputStream(unitedFile);
			FileInputStream fis=null;
			for (int i = 0; i < partsPaths.length; i++) {
				perPartFile=new File(partsPaths[i]);
				fis=new FileInputStream(perPartFile);
				byte [] buffer=new byte[1024*8];
				int len=0;
				while ((len=fis.read(buffer))!=-1) {
					fos.write(buffer, 0, len);
				}
			}
			fis.close();
			fos.close();
		} catch (Exception e) {
		}
	}
}


    
[2] 使用ExpandableListView——当有Group选项展开时,怎么正确获取长按的Group选项
    来源: 互联网  发布时间: 2014-02-18
使用ExpandableListView——当有Group选项展开时,如何正确获取长按的Group选项。

当我们使用ExpandableListView时,实现点击一个GroupView则展开ChidView,那么这个时候,Adapter的大小前后是有变化的。

例如:假设有20个GroupView,每个GroupView都有一个ChildView。当全部GroupView都没有被展开的时候,Adapter的size是20;而当我们展开一个GroupView,显示出一个ChildView的时候,Adapter的size就增加了1。这个必须了解的。

当我们需要添加长按每一个GroupView的时候,获取当前被长按的GroupView的对象时,使用以下方法会出现如下问题。

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.booklist_context, menu);

		ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
		
		// 获取当前长按项的下标
		final int index = ExpandableListView
				.getPackedPositionGroup(info.packedPosition.);
		//System.out.println("index----------->" + index);
		//System.out.println("Adapter的size------------->" +  expListView.getAdapter().getCount());
		mBookInfo = (BookInfoDTO) expListView.getAdapter().getitem(index);
	}

1、当所有的GroupView都没有展开的时候,能够正确获取每个GroupView的下标,通过Adapter就能得到绑定到这个GroupView中的对象。

2,、但,当有的GroupView被展开的时候,就不能使用上面的方法获取绑定在GroupView中的对象了。原因上面已经给出,因为此时的Adapter的size已经被改变。而此时获取的下标是20个GroupView的相对下标。跟Adapter中的下标所对应的对象并不一致,因为Adapter中还包含了被展开的ChildView。


使用以下的方法可以解决上面遇到的问题。

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.booklist_context, menu);

		ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
		View vin = (View)info.targetView;
		mBookInfo = (BookInfoDTO)vin.getTag();

	}

在设配器中,为每一个GroupView set 一个Tag,也就是我们需要长按时候提出的对象。

这样我们就可以在以上的方法中取出每个GroupView中 的Tag,也就是我们绑定到GroupView中的对象。

这样就不用依赖于变化的Index。

  


    
[3] 为啥在 Objective-C 中给 nil 发送消息程序不会崩溃
    来源: 互联网  发布时间: 2014-02-18
为什么在 Objective-C 中给 nil 发送消息程序不会崩溃?

我们知道在 Objective-C 中给 nil 发送消息程序不会崩溃,

Objective-C 是以 C 语言为基础的,

PC 上,在 C 语言中对空指针进行操作,

程序会由于越界访问而出现保护错进而崩溃,

但是 Objective-C 中为什么不会崩溃呢?

原因需要从源代码中寻找,

下面是 objc_msgSend 的 arm 版汇编代码片段:

在 arm 的函数调用过程中,

一般用 r0-r4 传递参数,

用 r0 传递返回值。

对应 objc_msgSend,第一个参数为 self,返回值也是 self,都放在 r0(a1)中。

/********************************************************************

 * idobjc_msgSend(idself, SELop, ...)

 * On entry: a1 is the message receiver,

 *                 a2 is the selector

 ********************************************************************/

ENTRY objc_msgSend

# check whether receiver is nil

teq     a1, #0

moveq   a2, #0

bxeq    lr

teq 指令说明:

TEQ Rn, Operand2 The TEQ instruction performs a bitwise Exclusive OR operation on the value in Rn and the value of Operand2.

测试 self 是否为空。

moveq 指令说明:

如果self为空,则将 selector 也设置为空。

bx 指令说明:

在 arm 中 bx lr 用来返回到调用子程序的地方(即:返回到调用者),此处是:如果 self 为空,就返回到调用 objc_msgSend 的地方继续执行。

总之:

如果传递给 objc_msgSend 的 self 参数是 nil,该函数不会执行有意义的操作,直接返回。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3