JAVA简单自定义类实现与测试

本文介绍了如何在Java中创建一个自定义的InputStream类,包括类的设计、构造函数和read方法的实现。在实现过程中,针对可能出现的IO异常和逻辑错误进行了详细讨论,提出了解决方案。强调了在处理异常时应将其抛给用户,以及在测试时要关注代码逻辑和功能的准确性。总结了阅读API、正确处理异常和确保程序逻辑严谨的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        日常做项目中为避免重复性工作,我们可以把常用的类包装成自己的类,放入自己的类库中,这样通过maven或者其他引入方式,可以很方便的进行复用。

        本文不涉及Java平台的搭建,不涉及操作系统环境,不涉及Maven以及Junit用法。

        目的:实现自己的inputstream类。

        类说明:类包括一个属性path,一个构造函数,一个read方法。

                      属性path说明:属性为String类型

                      构造函数说明:传入String类型参数,为path赋值。

                      read方法说明:参数length,类型int,表示读取长度。返回为字节数组。如果流内数据足够,则返回长度为length的字节数组,如果流内数据不足,则返回最大可读取长度的字节数组。

         

        实现过程1:

       

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStream {

	private String path;
	
	public InputStream(String path){
		this.path=path;
	}
	
	/**
	 * 读取指定长度字节,并返回
	 * 如果流内字节数不足,返回最大可读长度字节
	 * @param length
	 * @return 字节数组
	 */
	public byte[] read(int length){
		
		byte[] bt=new byte[length];
		int read=0;                        //表示已读取长度
		java.io.InputStream is=null;
		try{
			is=new FileInputStream(path);      //创建流
			int i=0;                           
			while(read!=length&&i!=-1){
				i=is.read(bt, read, length-read);    
				read+=i;
			}
		}catch(IOException e){
			System.out.println(e.getMessage());
		}finally{
			try {
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				System.out.println(e.getMessage());
			}
		}
		
		
		//如果读取程度不足length,则对数组进行缩减
		if(read!=length){
			byte[] nbt=new byte[read];
			for(int j=0;j<read;j++)
				nbt[j]=bt[j];
			return nbt;
		}else{
			return bt;
		}
	}
}

         测试类如下:

       

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.Test;

public class InputStreamTest {

	@Test
	public void test() {
		InputStream is=new InputStream("test.txt"); 
		byte[] bt;
		bt = is.read(100);
		System.out.println("返回长度"+bt.length);
		for(int j=0;j<bt.length;j++)
			System.out.println(bt[j]+" ");
		
	}

}

       如果,文件存在,则测试正常,然而,文件不存在,则测试失败。

       方法过程中会出现IO异常, 方法将不能正常完成,测试流程也将无法完成。

       解决方案: 将IO异常抛出给用户,才能保证用户业务流程正确进行。

       

       实现过程2:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStream {

	private String path;
	
	public InputStream(String path){
		this.path=path;
	}
	
	/**
	 * 读取指定长度字节,并返回
	 * 如果流内字节数不足,返回最大可读长度字节
	 * @param length
	 * @return 字节数组
	 */
	public byte[] read(int length) throws IOException{
		
		byte[] bt=new byte[length];
		int read=0;                        //表示已读取长度
		java.io.InputStream is=null;
		is=new FileInputStream(path);      //创建流
		int i=0;                           
		while(read!=length&&i!=-1){
			i=is.read(bt, read, length-read);    
			read+=i;
		}
		is.close();
		
		//如果读取程度不足length,则对数组进行缩减
		if(read!=length){
			byte[] nbt=new byte[read];
			for(int j=0;j<read;j++)
				nbt[j]=bt[j];
			return nbt;
		}else{
			return bt;
		}
	}
}

          测试类如下:

         

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.Test;

public class InputStreamTest {

	@Test
	public void test() {
		InputStream is=new InputStream("test.txt"); 
		byte[] bt;
		try {
			bt = is.read(100);
			System.out.println("返回长度"+bt.length);
			for(int j=0;j<bt.length;j++)
				System.out.println(bt[j]+" ");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		}
		
		
	}

}


             测试正常,但是仔细观察输出,则发现,输出少一个字节。

             原因及解决方案,仔细检查代码,发现while体内,当文件结束时,i值为-1,此时read会加上-1。

            

             实现过程3:

           
 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class InputStream {

	private String path;
	
	public InputStream(String path){
		this.path=path;
	}
	
	/**
	 * 读取指定长度字节,并返回
	 * 如果流内字节数不足,返回最大可读长度字节
	 * @param length
	 * @return 字节数组
	 */
	public byte[] read(int length) throws IOException{
		
		byte[] bt=new byte[length];
		int read=0;                        //表示已读取长度
		java.io.InputStream is=null;
		is=new FileInputStream(path);      //创建流
		int i=0;                           
		while(read!=length&&i!=-1){
			i=is.read(bt, read, length-read);    
			if(i!=-1) read+=i;
		}
		is.close();
		
		//如果读取程度不足length,则对数组进行缩减
		if(read!=length){
			byte[] nbt=new byte[read];
			for(int j=0;j<read;j++)
				nbt[j]=bt[j];
			return nbt;
		}else{
			return bt;
		}
	}
}

            测试代码:

           

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.Test;


public class InputStreamTest {

	@Test
	public void test() {
		InputStream is=new InputStream("test.txt"); 
		byte[] bt;
		try {
			bt = is.read(100);
			System.out.println("返回长度"+bt.length);
			for(int j=0;j<bt.length;j++)
				System.out.println(bt[j]+" ");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		}
		
		
	}

}

             结果:测试正常,结果也正常。

         

             当然,笔者的测试类不能算是标准意义上的测试类,因为测试不仅仅是代码逻辑,还有代码功能,正规测试类,则可以测试出结果的正确与错误。

             基于以上简单测试,给出笔者总结:

             1.认真阅读API,尤其搞清楚输入,输出

             2.异常的处理一定要恰当。一般情况下,最好把异常抛出给最终用户。如果捕获了,就要保证有意义的返回。

             3.保证程序逻辑的严谨。而这种严谨往往还建立在对API的深入理解。比如,如何保证一定读取到指定字节。

              仅抛砖引玉,望高手指点。
         

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值