注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Fly to the Sky!

很多人因为寂寞而错爱一个人,更多人因为错爱一个人而寂寞一生。

 
 
 

日志

 
 

字节、字符、串、流[转]  

2009-07-29 14:59:21|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

byte / Byte

byte :字节,一个英文字符占1个字节;一个中文汉字占2个字节。

使用InputStream抽象类的实现类FileInputStream类,根据本地磁盘E下的文件shirdrn.txt,其内容如下:

不以物喜,不以己悲。

创建一个输入流FileInputStream

?? InputStream is = new FileInputStream("E:\\shirdrn.txt");
??? byte[] buffer = new byte[99999];?// 初始化一个字节数组buffer,大小为999999

这时,一个文件输入流is已经处于打开状态,可以进行读取。

1、使用FileInputStream类的read(byte[] buffer)方法读取:

?? int lengthOfRead = is.read(buffer);
??? System.out.println("lengthOfRead = "+lengthOfRead);

输出读取字节的长度lengthOfRead:

lengthOfRead = 20

2、使用FileInputStream类的read(byte[] bbuffer,int off,int len)方法读取:

?? int lengthOfRead = is.read(buffer,0,7);
??? System.out.println("lengthOfRead = "+lengthOfRead);

输出读取字节的长度lengthOfRead:

lengthOfRead = 7

3、使用FileInputStream类的read()方法读取:

?? int lengthOfRead = is.read();
??? System.out.println("lengthOfRead = "+lengthOfRead);

输出读取字节的长度lengthOfRead:

lengthOfRead = 178

这个没有参数的read()方法,在InputStream及其FileInputStream类中都没有具体实现,为什么会返回这个数值呢?它的含义是什么呢?有知道的请解释一下,谢谢。

■ 说明:?FileInputStream的read方法有3个:

public int read(byte[] buffer)throws IOException

含义为:

根据已经构造的字节数组buffer,将创建的处于打开状态的InputStream流,读入到字节数组b中,返回实际读取字节的长度。

public int read(byte[] bbuffer,int off,int len)throws IOException
含义为:
根据已经构造的字节数组buffer,将创建的处于打开状态的InputStream流,读入从起始索引,长度为len的字节的数目,返回实际读取的字节的长度。如果len没有超过buffer的大小,返回的int型值为len。
public abstract int read()throws IOException
含义为:
帮助文档上说:在输入数据可用、检测到流的末尾、或者抛出异常之前一直“blocks”,这个bolcks是怎样的一种状态呢?有知道的请解释一下,谢谢.
 
当创建一个FileInputStream流的时候,第一个字节自动被blocks,可以继续读取的(即不被blocks的)应该是:输入流除去第一个字节以外剩下字符的长度。例如:
   int lengthOfAvailable = is.available();
??? System.out.println("lengthOfAvailable = "+lengthOfAvailable);
输出可以继续读取的字节的长度lengthOfAvailable:
lengthOfAvailable = 19
如果想在控制台上打印出从文件中读取的数据,可以使用byte[]构造一个String,然后打印出来。
1、使用String(byte[] bytes)构造String:
   InputStream is = new FileInputStream("E:\\shirdrn.txt");
??? byte[] buffer = new byte[99999];???
??? is.read(buffer);
??? String myStr = new String(buffer);
??? System.out.println("myStr = "+myStr);
这时控制台输出shirdrn.txt文件的数据内容:
myrStr = 不以物喜,不以己悲。
2、使用String(byte[] bytes, String charsetName)构造一个String:
   InputStream is = new FileInputStream("E:\\shirdrn.txt");
??? byte[] buffer = new byte[99999];???
??? is.read(buffer);
??? String myStr = new String(buffer,"gb2312");
??? System.out.println("myStr = "+myStr);
这时控制台输出shirdrn.txt文件的数据内容,并且编码方式gb2312:
myStr = 不以物喜,不以己悲。
3、使用String(byte[] bytes, int offset, int length)构造一个String:
??     InputStream is = new FileInputStream("E:\\shirdrn.txt"); 
??? byte[] buffer = new byte[99999];
??? is.read(buffer);??
??? String myStr = new String(buffer,4,12);??
??? System.out.println("myStr = "+myStr);
控制台上打印出数据:
myStr = 物喜,不以己
4、也可以同时指定字节起始索引、长度、编码方式:
String(byte[] bytes, int offset, int length, String charsetName) 
说明:
因为处理的是字节,如果索引或者长度设置有问题,会导致中文汉字的字节被截断,从而出现乱码。比如:
???    String myStr = new String(buffer,4,12); 
从第4个字节开始取,因为前面(0,1)、(2,3)正好是两个字,从第4个开始读取是第3个字的第1个字节,而我们要用12个字节来构造一个String,所以从0索引开始计数,连续12个字节,即6个中文汉字字符。
如果我们取得的字节的长度为奇数个,在构造String之后,用System.out.println()打印出来,最后面就是一个乱码,因为一个字节不是一个完整的中文汉字字符。
    String myStr = new String(buffer,4,13); 
控制台上打印出来:
myStr = 物喜,不以己?
最后面那个“?”就是一个单独的未能构成一个中文汉字字符的字节。

输入流InputStream是一个抽象类,是所有表示字节输入流的所有类的基类。

尤其是在访问底层资源的时候,必须要先构造一个输入流,因为InputStream是一个基于字节的输入流类,所以在获取到底层数据资源的时候,是通过以字节流的状态进行传输的,然后可以对获取的字节构造String,进而为我们的应用提供资源。

然而,构造一个输入流,应该首先考虑从输入流类的构造函数入手,因为只有知道了如何构造一个输入流,才可以继续接下来的其他一些处理。

InputStream是一个抽象类,它的实现提供了一些常用的关于字节流类通用的方法,具体实现该抽象类的具体实现类自动继承了这些方法,而且还可以重载这些方法,以达到满足具体实现类的实现操作字节流的特征。

InputStream类的类型继承关系很庞大:

字节、字符、串、流[转] - kuku - Fly to the Sky!

java.lang.Object
?? |__ java.io.InputStream
???????????? |__ java.io.FileInputStream

FileInputStream类是InputStream抽象类的一个直接子类,很重要的一个具体实现类。

它主要应用于从文件系统获取文件的字节,比如本地磁盘目录下的某个文件,都能被构造一个FileInputStream输入流。

构造一个FileInputStream输入流,有三种构造方式:

1、FileInputStream(String name)

通过一个路径的完全字符串描述来构造一个FileInputStream输入流,比如:

InputStream is = new FileInputStream("E:\\shirdrn.txt");

2、FileInputStream(File file)

通过构造一个File对象来构造一个FileInputStream输入流,比如:

File file = new File("E:\\shirdrn.txt");?// 通过一个路径的完全字符串描述构造一个File对象
?? try {
??? InputStream is = new FileInputStream(file);?// 根据构造的File对象,构造一个FileInputStream输入流??

?? byte[] buffer = new byte[99999];
??? String myStr = new String(buffer,0,is.read(buffer));
??? System.out.println("myStr = "+myStr);
?? } catch (Exception e) {???
??? e.printStackTrace();
?? }

测试输出如下所示:

????myStr = 不以物喜,不以己悲。

File的构造方法最常用的就是通过一个pathname字符串来构造。

3、FileInputStream(FileDescriptor fdObj)

通过一个FileDescriptor对象来构造一个FileInputStream输入流,具体用法可以查阅Java API。

关于从一个FileInputStream输入流中读取字节的操作,可以参见?字节、字符、串、流(1)?的内容。因为FileInputStream继承了InputStream类,所以read的实现是一致的。

InputStream类还有一个方法比较方便,可以跳过指定数目的字节,然后继续读取:

skip(long n)

比如:

File file = new File("E:\\shirdrn.txt");??
?? try {
??? InputStream is = new FileInputStream(file);
??? is.skip(4);?// 跳过4个字节,即2个汉字
??? byte[] buffer = new byte[99999];
??? String myStr = new String(buffer,0,is.read(buffer));
??? System.out.println("myStr = "+myStr);
?? } catch (Exception e) {???
??? e.printStackTrace();
?? }

测试结果输出如下:

myStr = 物喜,不以己悲。

java.lang.Object
|__ java.io.InputStream
?????????? |__ java.io.ByteArrayInputStream

通过ByteArrayInputStream类的构造方法可以看出,它是根据已经读入字节的缓冲区来构造一个字节流对象。它有2个构造方法:

1、ByteArrayInputStream(byte[] buf)

测试程序如下:

File file = new File("E:\\shirdrn.txt");
?? try {
??? InputStream is = new FileInputStream(file);?// 构造一个FileInputStream输入流,从本地磁盘文件读取字节
??? byte[] buffer = new byte[20];
??? is.read(buffer);?// 根据打开的字节流,将字节读入到缓冲区buffer中
??? InputStream bais = new ByteArrayInputStream(buffer);?// 根据已经读取进去字节的缓冲区buffer,构造一个ByteArrayInputStream输入流对象
??? String myStr = new String(buffer,0,bais.read(buffer));?// 通过构造的ByteArrayInputStream输入流对象构造一个String打印到控制台
??? System.out.println("myStr = "+myStr);
?? } catch (Exception e) {???
??? e.printStackTrace();
?? }

测试结果输出如下:

myStr = 不以物喜,不以己悲。

2、ByteArrayInputStream(byte[] buf, int offset, int length)

与第一个很相似,只是更详细地指定了缓冲区buf的起始索引,和字节的长度length。

ByteArrayInputStream输入流类对字节流的其他操作方法都和FileInputStream类相似。

  评论这张
 
阅读(1090)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017