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");