您的位置:首页 > 编程语言 > Java开发

JAVA基础学习--IO流总结<二>

2012-09-18 10:08 881 查看
自定义readLine方法,模拟实现其功能

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'
)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: