bytearrayoutputstream(ByteArrayOutputStream设置编码)

admin 482 0

大家好,感谢邀请,今天来为大家分享一下bytearrayoutputstream的问题,以及和ByteArrayOutputStream设置编码的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

一、关于BufferedInputStream和FileInputStream的区别

1、BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),它自己不能脱离里面那个单独存在。FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。

2、FileInputStream与BufferedInputStream区别:

3、FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;

4、FileInputStream与FileReader区别:

5、FileInputStream是字节流,FileReader是字符流,用字节流读取中文的时候,可能会出现乱码,而用字符流则不会出现乱码,而且用字符流读取的速度比字节流要快;

6、ObjectOutputStream与ByteArrayOutputStream的区别:

7、ObjectOutputStream可以将java对象写入outputstream流中(序列化),然后进行持久化,此对象必须是实现了java.io.Serializable接口;

8、ByteArrayOutputStream是将数据写入byte数组中;

9、假设一个文件的长度是100个字节,要将之读取到内存中,再假设您每次只读取10个字节,那么读完整个文件是不是读取10次的呀?

10、假设老板让你完成100件事情,老板说,你每天只完成10件就可以了,难道你非得等到第十天才完成第100件事情吗?有一天您在中午下班前就完成了10件事情,下午您不妨多干一点,那么也许在第9天的时候就完成了100件事情。

11、同理,BufferedInputStream有可能会读取比您规定的更多的东西到内存,以减少访问IO的次数,

12、总之您要记住一句话,访问IO的次数越少,性能就越高,原因就在于CPU和内存的速度》》》》远大于硬盘或其他外部设备的速度。

13、换一个不太恰当的例子来说,您和您的朋友一起去登山,你朋友太不给力了,走一会儿就要休息,而您呢,您的体力比他要好的多,根本不需要休息,所以每当他休息的时候,您得等着他,您那时候什么也干不了,这就叫堵塞,堵塞就是说您有能力干某事,但是迫于某种原因您什么也干不了,只能干等。所以您朋友休息的次数越少,你们两个到达山顶所花费的时间就越少。CPU访问硬盘的次数越少,程序就越快。BufferedInputStream在小型文件中的性能优势无法体现出来,假设您将以个2G大小的文件从D盘完全复制到E盘,性能之优势便展露无疑!

二、java ByteArrayOutputStream flush

public void flush()throws IOException

刷新此输出流并强制写出所有缓冲的输出字节。flush的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。

什么是预期的目标?比如对于输入出流FileOutputStream("1.txt"),文件"1.txt"就是它预期的目标。上体请看下面的程序。

public static void main(String args[]){

FileInputStream fis=new FileInputStream("1.pdf");

FileOutputStream fos=new FileOutputStream("2.pdf");

while((number=fis.read(b))!=-1){

//flush你也可以在这里用。但一般不提倡

//将数据先存入缓冲区有利于提高效率

fos.flush();//这里,是指将所有的数据,全部写入输出流"2.pdf"

//当然,对于ByteArrayOutputStream来说,它的目标是一个数组,将数据写入

//这个数组。当然,最后可以一次性写入一个输出流(用writeTo方法)。那么

//它的过程是:自主地将数据先写入数组,再全部写入某个输出流。那么,flush

//貌似没有意义了。因为,对于写入内存数组来说,不可能再先缓存进某个

//缓冲区(那样没什么意义)。而ByteArrayOutputStream的预期目标肯定是

//在创建对象时隐式生成的数组缓冲区,而不可能是writeTo的对象(因为这个

//对象是可变的,只有在写入时才指定)。所以,俺认为flush对于

//ByteArrayOutputStream来说,没有意义

三、请问java ByteArrayOutputStream不close会怎样

1、*Closinga<tt>ByteArrayOutputStream</tt>hasnoeffect.Themethodsin

2、*thisclasscanbecalledafterthestreamhasbeenclosedwithout

3、*generatingan<tt>IOException</tt>.

4、publicvoidclose()throwsIOException{

5、}

复制了一段源码,可以看出来这里是个空实现的方法。所以字节数组其实是关不掉的,因为不会占用什么资源,JDK里有这个方法是为了一种好的编程习惯准备的。

6、复制了一段源码,可以看出来这里是个空实现的方法。所以字节数组其实是关不掉的,因为不会占用什么资源,JDK里有这个方法是为了一种好的编程习惯准备的。

四、java 里的 ByteArrayInputStream 与ObjectInputStream

1、ByteArrayInputStream作为参数提供给 ObjectInputStream是没有问题的,你的程序唯一不对的地方是不应该将 new byte[1024];一个没有内容的byte数组做为输入参数提供给 ByteArrayInputStream,ObjectInputStream是要读取对象的,那么自然输入也应该是一个对象的字节数组,而很明显 String.getBytes并不能返回作为字符串对象的字节数组,仅是该字符串对象内容的字节数组。

2、 ByteArrayOutputStream bos= new ByteArrayOutputStream(100);

3、 ObjectOutputStream oos= new ObjectOutputStream(bos);

4、 byte [] bytes= bos.toByteArray();

5、 InputStream bais= new ByteArrayInputStream(bytes);

6、 ObjectInputStream ois= new ObjectInputStream(bais);//something wrong here

五、bytearrayoutputstream乱码如何解决

1、IO中用ByteArrayOutputStream解决乱码问题--另一种解决乱码的方法

2、IO中另外一种防止乱码的方法:使用ByteArrayOutputStream

3、在创建ByteArrayOutputStream时,会自动创建一个以自动增长的缓存区,当数据读取完后再一起统一写出来,就不会有乱码的问题了

4、import java.io.ByteArrayOutputStream;

5、import java.io.FileInputStream;

6、public class ByteArrayInputStreamTest{

7、public static void main(String[] args) throws Exception{

8、ByteArrayOutputStream out= null;

9、InputStream ins= new FileInputStream("test.txt");

10、out= new ByteArrayOutputStream();

11、//下面的read方法每次读取一个字节,并返回这个字节的int类型

12、//每次写入一个字节,out对象会自动创建一个反冲区,并自动增加大小

13、System.out.println(out.size());

14、System.out.println(out.toString());

15、每次写入时打印out对象的长度,可以看到out对象的长度每次增加1,因为每次读取一个字节,这样把所有的数据读取完后再调用toString方法转换成字符就不会出现乱码的问题了

关于bytearrayoutputstream,ByteArrayOutputStream设置编码的介绍到此结束,希望对大家有所帮助。