JAVA基础学习--IO流总结<二>
2012-09-18 10:08
881 查看
自定义readLine方法,模拟实现其功能
[code]classMyBufferedReader
[/code]
自定义字节读取流缓冲区,模拟实现BufferedInputStream功能
用自定义的BufferedInputStream来实现复制mp3的操作
关于为什么b要与255
/*
*全文结束后返回的标志-1,你函数定义的返回值类型是什么,-1就是什么类型的,
*像这里,函数定义为int,那么全文结束标志-1返回的二进制形式就是32个1
*那么为什么返回值用int而不是byte呢?
关于返回的intb占用的是32个二进制位,而mp3里的字节文件为8个二进制位
为什么不直接返回byte呢?因为循环读数时可能会从mp3字节中连续读到了8个1,
(11111111),那么b=-1;复制就结束了,但这个-1不是结尾标志值-1
所以b&一个int类型的数255,当读到8个1时,他提升为了255,就不会返回-1了,穿上了一层伪装
不用担心写的时候出错,因为write方法写出的时候,自动给它脱衣服,变回原来的8个1
这样读完全文,返回一个int类型的-1,否则中途不会有见到8个1就返回的时候。
*/
[code]importjava.io.*;
[/code]
Properties(hashtable)子类,为集合与IO相结合的类
用于存放配置信息,键值对信息
P.setProperty(a1,a2),a1自动视为键;a2自动视为值
FileInputStreamfis=newFileInputStream(关联配置文件)
P.load(fis)=把配置文件内容装载到Properties集合中
P.list(System.out)列出集合目录
打印流PrintStream
可直接操作文件、流(字节输出流)、字符串
最常用的字符打印流PrintWriter,可直接操作file、outputstream、writer
importjava.io.*;
[code]classMyBufferedReader
{
privateFileReaderr;
//构造函数接受一个文件读取流对象传给本类
MyBufferedReader(FileReaderr)
{
this.r=r;
}
publicStringmyReadLine()throwsIOException
{
//新建一个字符容器用于存放读取到的单个字符
StringBuildersb=newStringBuilder();
intch=0;
//以全文是否结束为停止读取的条件
while((ch=r.read())!=-1)
{
if(ch=='\r')
continue;
//读取到文本中的回车符时,表示一行读取完毕,将容器内的字符转成字符串返回给调用者
if(ch=='\n')
returnsb.toString();
//只要没到行末尾,就不停的把读取到的字符加入容器中
else
sb.append((char)ch);
}
//到了最后一行时,只要读到的行不为空,就把所有内容返回
if(sb.length()!=0)
returnsb.toString();
//若最后一行为空,则返回空。
returnnull;
}
//关流,要写在外面,因为写在里面若前面return后就执行不到了
publicfinalvoidmyClose()throwsIOException
{
r.close();
}
}
classMyBufferedReaderDemo2
{
publicstaticvoidmain(String[]args)throwsIOException
{
//建立流关联要读取的文件
FileReaderfr=newFileReader("F:\\1.txt");
MyBufferedReadermybf=newMyBufferedReader(fr);
Stringline=null;
//把返回来的一行字符串赋给line,只要返回来的行值不为空就打印返回行内容。
while((line=mybf.myReadLine())!=null)
{
System.out.println(line);
}
mybf.myClose();
}
}
[/code]
自定义字节读取流缓冲区,模拟实现BufferedInputStream功能
用自定义的BufferedInputStream来实现复制mp3的操作
关于为什么b要与255
/*
*全文结束后返回的标志-1,你函数定义的返回值类型是什么,-1就是什么类型的,
*像这里,函数定义为int,那么全文结束标志-1返回的二进制形式就是32个1
*那么为什么返回值用int而不是byte呢?
关于返回的intb占用的是32个二进制位,而mp3里的字节文件为8个二进制位
为什么不直接返回byte呢?因为循环读数时可能会从mp3字节中连续读到了8个1,
(11111111),那么b=-1;复制就结束了,但这个-1不是结尾标志值-1
所以b&一个int类型的数255,当读到8个1时,他提升为了255,就不会返回-1了,穿上了一层伪装
不用担心写的时候出错,因为write方法写出的时候,自动给它脱衣服,变回原来的8个1
这样读完全文,返回一个int类型的-1,否则中途不会有见到8个1就返回的时候。
*/
packageItcast.com;
[code]importjava.io.*;
/**自定义字节流读取缓冲区
*@authorshantui*
*/
publicclassMyBufferedInput
{
privateFileInputStreamin;
privatebyte[]buf=newbyte[1024];
privateintpos=0;
privateintcount=0;
//自定义读取流缓冲,传入已关联音频文件的流对象,将其传给本类
MyBufferedInput(FileInputStreamin)
{
this.in=in;
}
//自定义往自己缓冲区里读入字节的方式,注意这里返回值类型是int,而不是byte,原因在函数末尾
publicintmyRead()throwsIOException
{
//初始时count肯定是0
if(count==0)
{
//往字符数组buf里读入一批字节,记住读了多少个
count=in.read(buf);
//每抓一批新字节进数组前,指针都归零
pos=0;
//将字节数组中第pos个字符赋给b
byteb=buf[pos];
//赋值一次pos前移一位,计算读取个数的计数器减一
count--;
pos++;
//如过最后抓了空值进来,那么这里就结束了,count=-1了,把结束标记返回。
if(count<0)
return-1;
//只要不是空值,就把读到的b返回。
else
//返回第一个字符b
returnb&255;
}
//以上主要是为了判断结尾,一边返回结束符,下面才是读取的主体:返回下一个字符b
elseif(count>0)
{
//按照指针的移动,读取相应的字符
byteb=buf[pos];
count--;
pos++;
returnb&255;
}
return-1;
}
publicvoidMyClose()throwsIOException
{
in.close();
}
publicstaticvoidmain(String[]args)throwsIOException
{
MyBufferedInputbufis=newMyBufferedInput(newFileInputStream("F:\\Listen.mp3"));
BufferedOutputStreambufos=newBufferedOutputStream(newFileOutputStream("D:\\yes.mp3"));
intbytes=0;
//只要没读到结束标志字符,就循环的往下读取
try
{
while((bytes=bufis.myRead())!=-1)
{
//读一个就写到缓存里一个
bufos.write(bytes);
}
}
catch(IOExceptione)
{
thrownewRuntimeException("复制音频失败");
}
finally
{
try
{
if(bufis!=null)
{
bufis.MyClose();
}
}
catch(IOExceptione)
{
thrownewRuntimeException("读音频失败");
}
try
{
if(bufos!=null)
{
bufos.close();
}
}
catch(IOExceptione)
{
thrownewRuntimeException("写音频失败");
}
}
}
}
[/code]
Properties(hashtable)子类,为集合与IO相结合的类
用于存放配置信息,键值对信息
P.setProperty(a1,a2),a1自动视为键;a2自动视为值
FileInputStreamfis=newFileInputStream(关联配置文件)
P.load(fis)=把配置文件内容装载到Properties集合中
P.list(System.out)列出集合目录
打印流PrintStream
可直接操作文件、流(字节输出流)、字符串
最常用的字符打印流PrintWriter,可直接操作file、outputstream、writer
PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。与其他输出流不同,
PrintStream永远不会抛出
IOException;而是,异常情况仅设置可通过
checkError方法测试的内部标志。另外,为了自动刷新,可以创建一个
PrintStream;这意味着可在写入byte数组之后自动调用
flush方法,可调用其中一个
println方法,或写入一个换行符或字节(
'\n')。
相关文章推荐
- java 从零开始,学习笔记之基础入门<IO流>(十八)
- JAVA基础学习--IO流总结<一>
- 黑马程序员-----java基础IO流<二>
- java基础学习总结四(控制语句<顺序、选择、循环>、方法)
- JAVA基础学习--网络编程<二>
- android基础学习<二>--->Activity的来龙去脉
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<数据库连接配置>(二十八)
- 前端学习基础总结<一>
- java 从零开始,学习笔记之基础入门<数据类型的转换>(五)
- java 从零开始,学习笔记之基础入门<JDBC>(二十四)
- java 从零开始,学习笔记之基础入门<运算符表达式和流程控制>(六)
- 201521123027 <java程序设计>第11周学习总结
- java基础学习总结之IO流和equal()方法
- 黑马程序员java学习<基础加强>—反射
- 基础入门:关于JavaIO流学习总结
- java 从零开始,学习笔记之基础入门<Oracle_基础>(三十三)
- linux基础学习<二>
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<JDBC>(二十四)
- 201521123025<<java程序设计>>第9周学习总结
- Java基础之(三十五)输入输出<二>