1. 从进程中获得输入流对象并转化为字符串

eg: 

Process process =Runtime.getRuntime().exec("ping "+ip+" -w 280 -n 1");     
//然后从process中获取cmd中的输入流
InputStream is=process.getInputStream();  //byte字节输入流
InputStreamReader isr=new InputStreamReader(is);  //将 byte stream转化为 character stream
BufferedReader br=new BufferedReader(isr); //将character stream 转化为 text stream
String line=br.readLine();  //将buffered stream 转化为 stream

2. 从打开的网络连接中或许网页内容

eg:

//打开网络连接
URL url=new URL("http://www.xxx.com");
URLConnection urlc=url.openConnection();
urlc.connect();
//然后从urlc中获取网页源代码
InputStream is=urlc.getInputStream();  //byte字节输入流
InputStreamReader isr=new InputStreamReader(is,"UTF-8");  //将 byte stream转化为 character stream,并制定charset
BufferedReader br=new BufferedReader(isr); //将character stream 转化为 text stream
String line=br.readLine();  //将buffered stream 转化为 stream


3. 常用的输入输出流, java.io.*

××××××××××××××××××××××××××××××××××××××××××

>>> 字节输入流: InputStream -> FilterInputStream->BufferedInputStream, DataInputStream

>>> 字节输出流: OutputStream -> FilterOutputStream->BufferedOutputStream, DataOutputStream


>>> 字节输入流: InputStream -> FileInputStream

>>> 字节输出流: OutputStream -> FileOutputStream


>>> 字节输入流: InputStream -> InputStream

>>> 字节输出流: OutputStream -> OutputStream


>>> 字节输入流: InputStream -> ObjectInputStream

>>> 字节输出流: OutputStream -> ObjectOutputStream

eg: ObjectInputStream ins=new ObjectInputStream(socket.getInputStream);
       String str= (String) ins.readObject();
       ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream);
       out.writeObject(str);
       out.flush();


>>> 字节输入流都是抽象类InputStream的子类,字节输出流都是抽象类 OutputStream的子类

均实现read(),close(),write(),flush()等方法


××××××××××××××××××××××××××××××××××××××××××

>>> 字符输入流: Reader -> BufferedReader

>>> 字符输出流: Writer -> BufferedWriter

eg: BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str=bf.readLine();
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(str);
        bw.flush();


>>> 字符输入流: Reader -> InputStreamReader->FileReader

>>> 字符输出流: Writer -> OutputStreamWriter->FileWriter

eg: BufferedReader br=new BufferedReader(new FileReader(new File("d:/abc","abc.txt")));

 

br.readLine();
       BufferedWriter bw=new BufferedWriter(new FileWriter(new File("d:/abc","abc.txt")));
        bw.write(str);
        bw.newLine(); /create new line


>>> 字符输出流: Writer ->PrintWriter

eg: PrintWriter write=new PrintWriter(socket.getOutputStream,true);// param true represents auto flush
       write.println("hi");
       write.flush();

>>> 字符输入流可以处理双字节,都是抽象类Reader的子类,字符输出流都是抽象类 Writer的子类


××××××××××××××××××××××××××××××××××××××××××××××

4. 处理汉字避免乱码

>>>InputStreamReader/OutputStreamWriter的构造函数可以包含charset
       InputStreamReader read=new InputStreamReader(InputStream input, "UTF-8");
       OutputStreamWriter out=new OutputStreamWriter(OutputStream output,"UTF-8");
eg: BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
       PrinterWriter write=new PrintWriter(new OutputStreamWriter(socket.getOuputStream(),"UTF-8"),true);

××××××××××××××××××××××××××××××××××××××××××××××

5.关于序列化。

 java.io包中输入输出流可以传递的对象必须实现Serializable接口,即实现序列化,并且其中的成员函数如果有对象,也需事先Serializable接口

如String对象均已实现Serializable,Image,BufferedImage对象均没有实现序列化接口,所以不能使用out.write(Image image);来传输,会报异常NotSerializableException。所以传递图片对象需要将其转化为二进制序列后再用输入输出传输。

实现序列化接口的对象,需要指定serialVersionID,serialVersionID的作用是: A和B通过网络传递对象数据C时,A会将C先序列化为二进制数据后传递给B;B反序列化二进制数据得到C。ID不同则无法相互序列化和反序列化。序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。

6. 将非序列化对象转为二进制数据传输,以image为例

>>> 输出部分
        ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());
        File imagefile=new File("d:/test.jpg"); 
        long length=imagefile.length(); 
        out.writeLong(length);  //先传输图像文件大小
        byte[] bt=new byte[(int) length]; //建立要存储图像数据的二进制字节数组
        DataInputStream input=new DataInputStream(new FileInputStream(imagefile)); //建立文件输入流
        int len=input.read(bt); //从输入流读取图像字节进入bt数组,返回数组长度
        while(len!=-1)  //将图像文件数据读入二进制字节数组bt;



     

out.write(bt);  //输出图像文件的二进制数据
         out.flush();


>>> 输入部分
        ObjectInputStream  in=new ObjectInputStream(socket.getInputStream());
        long length=in.readLong(); //读取文件大小
        byte[] bt=new byte[(int) length]; //建立存储二进制数据的字节数组
        for(int i=0;i<bt.length;i++)
                bt[i]= in.readByte();   //读入每一个字节
        Image image=ImageIcon(bt).getImage(); //从二进制字节数组数据建立图像
>>> 也可以用 ImageIO.write(bufferedimage,"jpg",out); /BufferedImage bufferedimage=ImageIO.read(in);来将BufferedImage对象传入输入输出流。但是ImageIO.write()方法不会加入终止符,所以要再加上out.write("\n\r");