[note]java中的输入输出

来源:互联网 发布:采集软件推荐 编辑:程序博客网 时间:2024/05/21 10:07

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





0 0
原创粉丝点击