再论javaIO之拷贝MP3(read方法返回int的原因)

今天继续学习java 通过IO流拷贝MP3的问题.话说昨天成功通过字节流的两种方式(BufferedInputStream和FileInputStream)copy了一首歌,我们主要用了read和write方法实现了这一功能。那大家在用read方法时有没有发现一个问题,那就是为什么它返回的是一个int类型的值,而不是byte呢??下面我们通过模拟BufferedInputStream类来说明这个问题微笑

Api文档中read方法描述(InputStream类):

代码如下:

import java.io.*;
class MyBufferedInputStream//自定义BuffereedInputStream类
{
	//装饰设计模式
	private InputStream in;
	private byte[] buffer=new byte[1024];
	private	int count=0;
	private	int pos=0;
	MyBufferedInputStream(InputStream in)//构造器
	{
		this.in=in;
	}
	//模拟read方法
	public int Myread()throws IOException
	{
		if(count==0)
		{
			count=in.read(buffer);
			//计数器记录通过public int read(byte[] b)方法存
			//到数组缓冲区的数据的总字节数
			pos=0;//如果计数器为0,则位置指针归零
			if(count<0)
				return -1;
		}
		byte b=buffer[pos];
		pos++;
		count--;
		
		//return b&255;
		return b&0xff;//关键在此,为什么要返回b和0xff的与呢?
	}
	//重写close方法
	public void Myclose()throws IOException
	{
		in.close();
	}
}
class Demo
{
	//为了代码简洁,这里直接抛IO异常了,正确的做法是try,catch。
	public static void main(String[] args)throws IOException	
	{
		long start=System.currentTimeMillis();
		Copy();
		long end=System.currentTimeMillis();
		System.out.println("runtime:"+(end-start)+"ms");//获取运行时间
	}
	public static void Copy()throws IOException//拷贝功能封装在Copy方法体里面
	{
		MyBufferedInputStream mb=new MyBufferedInputStream(new FileInputStream("3.mp3"));
		BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("copy_1.mp3"));
		int ch=0;
		while((ch=mb.Myread())!=-1)
			bo.write(ch);
		bo.close();
		mb.Myclose();
	}
}

为什么myread方法返回的是b和0xff的与呢?

 read方法返回int的原因:
 首先我们知道,mp3文件全部为二进制数据组成的。这就有一个问题,如果恰好read方法读取的字节是1111-1111(即byte型的-1)怎么办?这时候返回的是-1.

那这样的话Copy方法中的while循环就会停止,也就没有复制。

解决方法:
 我们伟大的程序员采取了一个办法.那就是返回int型
 1111-1111如果变成int型的话,应该是int型的-1,即11111111-11111111-11111111-11111111,

 我们将int型的-1和0xff &一下,
     11111111-11111111-11111111-11111111
   &00000000-00000000-00000000-11111111(int型的255)
   -------------------------------------------------------------
     00000000-00000000-00000000-11111111
 这样返回的就是有效字节了,而且不会出现-1的情况。

read方法做了一个类型提升,其实write方法每次也是强转,将int型的数据再转换为byte,这样获取的还是有效字节。

 

 

 

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

就是这样啦,最后祝大家新年快乐哦大笑

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你介绍一下如何使用 Java 编写程序实现文件拷贝Java 提供了非常方便的 I/O 类来处理文件读写操作。文件拷贝的基本思路是读取源文件中的数据,然后将数据写入到目标文件中。下面是一个简单的文件拷贝程序示例: ```java import java.io.*; public class FileCopy { public static void main(String[] args) throws IOException { // 源文件路径 String srcFilePath = "C:/temp/source.txt"; // 目标文件路径 String destFilePath = "C:/temp/dest.txt"; // 创建输入流和输出流 FileInputStream fis = new FileInputStream(srcFilePath); FileOutputStream fos = new FileOutputStream(destFilePath); // 定义缓冲区,每次读取 1024 个字节 byte[] buffer = new byte[1024]; int len; // 循环读取源文件中的数据,并将数据写入到目标文件中 while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } // 关闭输入流和输出流 fis.close(); fos.close(); System.out.println("文件拷贝完成!"); } } ``` 在上面的示例中,我们首先定义了源文件路径和目标文件路径。然后创建了输入流和输出流,用于读取源文件和向目标文件写入数据。我们定义了一个缓冲区,每次从输入流中读取 1024 个字节,并将这些字节写入到输出流中。最后,我们关闭输入流和输出流,并输出一条完成信息。 需要注意的是,上面的代码中使用了 try-catch 语句来捕获可能出现的 IOException 异常。这是因为在文件读写过程中可能会出现异常,比如文件不存在、文件无法读取等等。为了保证程序的健壮性,我们需要使用 try-catch 语句来处理这些异常。 希望这个简单的示例可以帮助你了解如何使用 Java 编写文件拷贝程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值