outputstream.write怎么转换成InputStream

彻底攻克java流 - coach - ITeye技术网站
博客分类:
IO分两种流
字节流 InputStream OutputStream
字符流 Reader& Writer
他们都是抽象类
字节流 FileInputStream& FileOutputStream
字符流 FileReader&&& FileWriter
字节流转换成字符流可以用 InputSteamReader& OutputStreamWriter
转换成BufferdReader& BufferedWriter 他们具有缓冲区
例如:读取文件 从字节流输入到字符流输入
定义一个字节流:
FileInputStream fileInputStream = new FileInputStream("d:/text.txt");
// 定义一个指向D:/TEXT.TXT 的字节流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
//字节流转换成InputStreamReader
BufferedReader bufferedReader = new BufferedReader(inputSteamReader);
//InputStreamReader 转换成带缓存的bufferedReader
可以把读出来的内容赋值给字符
String ss = new String();
while((s = bufferedReader.readLine())!=null){
}
例如:写入文件& 从字节流输出到字符流输出
FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定义一个指向D:/TEXT.TXT文件
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(s);
bufferedWriter.close();
outputStreamWriter.close();
fileOutputStream.close();
上面这个图向我们传达了这个信息:链接流链接流对象接收一个原始流对象或者另外一个链接流对象作为流源;另一方面他们对流源的内部工作方法做了相应的改变,这种改变是装饰模式所要达到的目的。比如:
  BufferedInputStream“装饰”了InputStream的内部工作方式,使得流的读入操作使用了缓冲机制。在使用了缓冲机制后,不会对每一次的流读入操作都产生一个物理的读盘动作,从而提高了程序的效率,在汲及到物理流的读入时,都应当使用这个装饰流类。
  LineNumberInputStream和PushbackInputStream也同样“装饰”了InputStream的内部工作方式,前者使得程序能够按照行号读入数据;后者能够使程序读入的过程中,退后一个字符。
  DataInputStream子类读入各种不同的原始数据类型以及String类型的数据,这一点可以从它提供的各种read方法看出来,如:readByte(),readInt(),readFloat()等。
使用基本原则:
根接口是InputStream/OutputStream
充当数据源的IO类有FileInputStream/FileOutputStream,ByteArrayInputStream& / ByteArrayOutputStream& 等,
充当装饰功能的IO类有BufferedInputStream& /&& BufferedOutputStream,DataInputStream&& /&& DataOutputStream等,
它们都是继承装饰接口FilterInputStream/FilterOutputStream。
使用IO时,首先创建一个数据源IO,然后根据需要的功能创建装饰类IO,其构造函数的参数为已创建的数据源IO
常用类举例说明:
FileInputStream和FileOutputStream
&&& 简单略
ObjectOutputStream和ObjectInputStream
&&& 这个流的作用是,直接将一个对象转换为字节流,对象必须implements Serializable
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
public class ObjectStreamTest
public static void main(String[] args)
T t = new T();
FileOutputStream fos = new FileOutputStream("d:/333.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(t);
fos.close();
oos.close();
catch (IOException e)
e.printStackTrace();
FileInputStream fis = new FileInputStream("d:/333.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
T t2 = (T) ois.readObject();
System.out.println(t2.i);
System.out.println(t2.k);
System.out.println(t2.s);
System.out.println(t2.j);
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
catch (ClassNotFoundException e)
e.printStackTrace();
@SuppressWarnings("all")
class T implements Serializable
int i = 20;
short j = 10;
String s = "hello";
int k = 100;
DataInputStream和DataOutputStream
&&& 这个是数据流.给我们直接处理基本数据类型的接口,举个最基本的例子,如果我们要将一个float类型的数据写入文件,我们需要先转换成String类型,然后转换成字节数组,这样才能存入..现在我们可以直接用DataInputStream和DataOutputStream来解决这个问题
import java.io.ByteArrayInputS
import java.io.ByteArrayOutputS
import java.io.DataInputS
import java.io.DataOutputS
import java.io.IOE
public class DataStreamTest
public static void main(String[] args)
//ByteArrayOutputStream可以临时缓存一个对象的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeChar('d');
dos.writeInt(10);
dos.writeShort(50);
catch (IOException e)
e.printStackTrace();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());//ByteArrayOutputStream的用法
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.available());
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readShort());
catch (IOException e)
e.printStackTrace();
dos.close();
dis.close();
catch (IOException e)
e.printStackTrace();
BufferedInputStream和BufferedOutputStream
&&& BufferedInputStream当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中提取数据。
&&& BufferedOutputStream当使用write()方法写入数据时实际上会先将数据写到buf中,当buf已满时才会实现给定的OutputStream对象的write()方法,将buf数据写到目的地,而不是每次都对目的地作写入的动作
import java.io.BufferedInputS
import java.io.BufferedOutputS
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
public class BufferedStreamDemo
public static final void copy(File srcFile, File distFile) throws IOException
FileInputStream fin =
BufferedInputStream bis =
FileOutputStream fout =
BufferedOutputStream bos =
if (distFile.exists())
distFile.delete();
byte[] data = new byte[1024];
fin = new FileInputStream(srcFile);
bis = new BufferedInputStream(fin);
fout = new FileOutputStream(distFile);
bos = new BufferedOutputStream(fout);
int readCount = 0;
while ((readCount = bis.read(data)) != -1)
bos.write(data, 0, readCount);
// 将缓冲区中的数据全部写出
bos.flush();
if (bos != null)
bos.close();
catch (IOException e)
if (bis != null)
bis.close();
catch (IOException e)
if (fin != null)
fin.close();
catch (IOException e)
if (fout != null)
fout.close();
catch (IOException e)
public static void main(String[] args)
BufferedStreamDemo.copy(new File("c:\\test1.abs"), new File("c:\\test2.abs"));
catch (IOException e)
e.printStackTrace();
InputStreamReader和OutputStreamWriter:字符流和字节流之间的转换
&&& Reader 输入流对应于不同的数据源:
&&& FileReader 用于从文件输入;
&&& CharArrayReader 用于从程序中的字符数组输入;
&&& StringReader 用于从程序中的字符串输入;
&& InputStreamReader从一个数据源读取字节,并自动将其转换成Unicode字符
&&& OutputStreamWriter将字符的Unicode编码写到字节输出流
import java.io.BufferedR
import java.io.BufferedW
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.io.InputStreamR
import java.io.OutputStreamW
public class InputStreamReaderTest
public static void main(String[] args)
FileInputStream fis = new FileInputStream("d:/222.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);// 这里又用BufferedReader封装起来,其实就是为了可以使用它的ReadLine方法
FileOutputStream fos = new FileOutputStream("d:/555.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);// 这里同样的用BufferedWriter封装起来,就是为了可以使用它的writer(String )方法..可以看API,其他的都只能write Int类型的数据或者byte类型的
String s2 =
while ((s2 = br.readLine()) != null)
bw.write(s2);
bw.newLine();
bw.close();
br.close();
catch (IOException e)
e.printStackTrace();
疑问:
1、ByteArrayOutputStream和BufferedOutputStream区别
&&& 本来这2个没法比较的,非得比较可以为:
(1)、构造方法不一样;
(2)、byte[]转换为InputStream流:InputStream sbs = new ByteArrayInputStream(byte[] buf);
(3)、InputStream转换为byte[]数组
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) & 0) {
swapStream.write(buff, 0, rc);
byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果
2、ArrayList一个基础问题,关于 transient
ArrayList 里面定义:
&&& private transient Object[] elementD&&
&&& 这里是ArrayList.elementData定义的地方,而elementData是用来存储实际内容的数组, 而transient字是表明域不能序列化,而我在这里能打印出 a b c,这个对transient怎么理解?
import java.io.ByteArrayInputS
import java.io.ByteArrayOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.util.ArrayL
public class WriteObject
public static void main(String[] args)
ArrayList&String& al = new java.util.ArrayList&String&();
al.add("a");
al.add("b");
al.add("c");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(stream);
out.writeObject(al);
byte[] alBytes = stream.toByteArray();
ArrayList&String& all = (ArrayList&String&) new ObjectInputStream(new ByteArrayInputStream(alBytes)).readObject();
for (String s : all)
System.out.println(s);
catch (IOException e)
e.printStackTrace();
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
序列化有2种方式:
A、只是实现了Serializable接口。
& 序列化时,调用java.io.ObjectOutputStream的defaultWriteObject方法,将对象序列化。
注意:此时transient修饰的字段,不会被序列化。
B、实现了Serializable接口,同时提供了writeObject方法。
& 序列化时,会调用该类的writeObject方法。而不是java.io.ObjectOutputStream的defaultWriteObject方法。
注意:此时transient修饰的字段,是否会被序列化,取决于writeObject。
浏览: 164132 次
来自: 印度
可以看看这篇文章,这个是struts教程网上一个简单的例子,构 ...
菜鸟不再菜 写道楼主很明显没有说明守护线程到底是怎么服务Use ...
要搞个executor和nio的结合,差不多
纠正楼主一个问题‘如果四个队员都在忙时,再有新的任务,这个小组 ...
&div class=&quote_title ...通过ByteArrayOutputStream将inputStream转变为outputStream-android100学习网
通过ByteArrayOutputStream将inputStream转变为outputStream
通过ByteArrayOutputStream将inputStream转变为outputStream
1.首先,先编写一个获取文件输入流的方法 ops()。 2. 之后在调
通过ByteArrayOutputStream将inputStream转变为outputStream
1.首先,先编写一个获取文件输入流的方法 ops()。
2. 之后在调用此方法获得输入流,并通过 castToBAOStream(Object obj,int bufferSize)进行转化。
3.最后,写出 转化成功的 输出流。
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
&Java代码&
public class Stream {&&&
&&& public static final int StreamFlushBufferSzie=100;//buffer size= 1K&&&
&&&&& public static ByteArrayOutputStream castToBAOStream(Object obj,int bufferSize){&&&
&&&&&&&&&&&&&&&
//&&&&&&&&& Log logger = LogFactory.getLog(CommonUtil.class);&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&& ByteArrayOutputStream baos=new ByteArrayOutputStream();&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&& if(obj.getClass().isInstance(baos)){&&&
&&&&&&&&&&&&&&& return (ByteArrayOutputStream)&&&
&&&&&&&&&&& }else{&&&
&&&&&&&&&&&&&&& InputS&&&
&&&&&&&&&&&&&&& try{&&&
&&&&&&&&&&&&&&&&&&& fis=(FileInputStream)&&&
&&&&&&&&&&&&&&&&&&& try{&&&
&&&&&&&&&&&&&&&&&&&&&&& BufferedInputStream bis=new BufferedInputStream(fis);&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& baos=new ByteArrayOutputStream();&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& BufferedOutputStream bos=new BufferedOutputStream(baos);&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& int i=0;&&&
&&&&&&&&&&&&&&&&&&&&&&& while((ch=bis.read())!=-1){&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& bos.write(ch);&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(i++==bufferSize){&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& bos.flush();&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& i=0;&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& bos.flush();&&& //提交文件流,很关键&&&
&&&&&&&&&&&&&&&&&&&&&&& bis.close();&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }catch(ClassCastException e){&&&
//&&&&&&&&&&&&&&&&&&&&& ("Stream object not a ByteArrayOutputStream or a FileInputStream:",e);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }catch(Exception e){&&&
//&&&&&&&&&&&&&&&&&&&&& ("baos is null:",e);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&& }catch(ClassCastException e){&&&
&&&&&&&&&&&&&&&&&&& fis=(InflaterInputStream)&&&
&&&&&&&&&&&&&&&&&&& try{&&&
&&&&&&&&&&&&&&&&&&&&&&& baos=new ByteArrayOutputStream();&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& BufferedOutputStream bos=new BufferedOutputStream(baos);&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& int i=0;&&&
//&&&&&&&&&&&&&&&&&&&&& ii.read(b, off, len)&&&
&&&&&&&&&&&&&&&&&&&&&&& byte[] by = new byte[2048];&&&
&&&&&&&&&&&&&&&&&&&&&&& while((ch=fis.read(by))!=-1){&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& bos.write(by,0,ch);&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(i++==bufferSize){&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& bos.flush();&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& i=0;&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& bos.flush();&&& //提交文件流,很关键&&&
&&&&&&&&&&&&&&&&&&&&&&& fis.close();&&&&&&
//&&&&&&&&&&&&&&&&&&&&& ZipUtil.getZipName().close();&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }catch(ClassCastException e1){&&&
//&&&&&&&&&&&&&&&&&&&&& ("Stream object not a ByteArrayOutputStream or a FileInputStream:",e1);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }catch(Exception e1){&&&
//&&&&&&&&&&&&&&&&&&&&& ("baos is null:",e1);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&&&
&&&&&&& }&&&
&&&& //产生一个文件输入流&&&
&&&& public static InputStream ops() throws FileNotFoundException {&&&
&&&&&&&& File file = new File("d://lin.txt");&&&&&&
&&&&&&&& FileInputStream fileInputStream = new FileInputStream(file);&&&
&&&&&&&& return fileInputS&&&
&&&& public static void main(String[] args) throws IOException {&&&
&&&&&&&&&&&
&&&&&&&& try {&&&
//&&&&&&&&& OutputStream outputStream = ops();&&&
&&&&&&&&&&& InputStream inputStream = ops();&&&&
&&&&&&&&&&& ByteArrayOutputStream baos = castToBAOStream(inputStream,StreamFlushBufferSzie);&&&
&&&&&&&&&&&&&&& InputStream is = new ByteArrayInputStream(baos.toByteArray());&&&
&&&&&&&&&&&&&&& File file=new File("d://new.txt");&&&
&&&&&&&&&&&&&&& FileOutputStream outb=new FileOutputStream(file);&&&
&&&&&&&&&&&&&&&&&&& int bytesR&&&
&&&&&&&&&&&&&&&&&&& byte[] buf = new byte[4 * 1024];&&&
&&&&&&&&&&&&&&&&&&&&&&&&&& while((bytesRead = is.read(buf))!=-1){&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& outb.write(buf,0,bytesRead);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&
&&&&&&&&&&&&&&&&&&&&&&&&&& outb.flush();&&&
&&&&&&&&&&&&&&&&&&&&&&&&&& outb.close();&&&
&&&&&&&&&&&&&&&&&&&&&&&&&& is.close();&&&
&&&&&&&&&&&& System.out.println(inputStream);&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&& } catch (FileNotFoundException e) {&&&
&&&&&&&&&&& // TODO Auto-generated catch block&&&
&&&&&&&&&&& e.printStackTrace();&&&
&&&&&&& }&&&
&&&&&&&&&&&&
作者“zhujianjia”将InputStream/OutputStream转换成string - haiker - ITeye技术网站
博客分类:
这里需要用到一个特殊的类ByteArrayOutputStream,利用他,我们可以将输出流在内存中直接转换成String类型。
具体代码如下:
首先从输入流中将数据读出来写入ByteArrayOutputStream,然后再将其转换成String.
InputStream in = urlconn.getInputStream();//获取输入流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//读取缓存
byte[] buffer = new byte[2048];
int length = 0;
while((length = in.read(buffer)) != -1) {
bos.write(buffer, 0, length);//写入输出流
in.close();//读取完毕,关闭输入流
// 根据输出流创建字符串对象
new String(bos.toByteArray(), "UTF-8");
//bos.toString("UTF-8");
根据同样的原理,我们可以将outputstream直接转换成String对象。
浏览: 126889 次
楼主有没有研究过cloudera flume和apache f ...
网上装svn的资源太多了,这个挺好的,说的挺全的。
看你上面那样,点击换图片的时候总有点小问题,后来改成这样就好了 ...java中如何将OutputStream转换为InputStream
java中如何将OutputStream转换为InputStream
  如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要从输入流读取数据的类。
  你很快会被问道,“java中如何将OutputStream转换为InputStream?”
  方法一:使用字节数组缓存数据
  最简单的方法是用字节数组缓存数据。代码如下:
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  class1.putDataOnOutputStream(out);
  class2.processDataFromInputStream(
  new ByteArrayInputStream(out.toByteArray())
  于是,OutputStream就被转换为InputStream了。
  方法二:使用管道
  第一种方法的问题是你必须有足够的内存缓存所有数据。你可以使用文件系统缓存更多数据,但无论如何可处理数据的大小还是受到限制。
  解决方法是创建一个线程产生数据到PipedOutputStream。当前线程可从中读取数据。
  PipedInputStream in = new PipedInputStream();
  PipedOUtputStream out = new PipedOutputStream(in);
  new Thread(
  new Runnable(){
  public void run(){
  class1.putDataOnOutputStream(out);
  ).start();
  class2.processDataFromInputStream(in);
  方法三:使用循环缓存区
  方法二中的两个管道流,实际上管理着一个隐藏的循环缓存区。使用一个显式的循环缓存区更易于理解。CircularBuffers 有如下优点:
  一个CircularBuffers类而不是两个管道类。
  较于缓存所有数据和额外线程的方法更容易使用。
  你可以更改缓存大小而不必受限于管道缓存区1K的固定缓存大小。
  多线程情形:
  CircularByteBuffer cbb = new CircularByteBuffer();
  new Thread(
  new Runnable(){
  public void run(){
  class1.putDataOnOutputStream(cbb.getOutputStream());
  ).start();
  class2.processDataFromInputStream(cbb.getInputStream());
  单线程情形:
  // buffer all data in a circular buffer of infinite size
  CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);
  class1.putDataOnOutputStream(cbb.getOutputStream());
  class2.processDataFromInputStream(cbb.getInputStream());
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 dataoutputstream 的文章

 

随机推荐