JAVA 内存操作流

  1. package org.iodemo;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileOutputStream;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8.   
  9. public class Copy {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) throws Exception { //所有异常抛出  
  15.         // TODO Auto-generated method stub  
  16.         if (args.length != 2){ //参数不是两个  
  17.             System.out.println("输入的参数不正确");  
  18.             System.exit(1); //系统退出  
  19.         }  
  20.           
  21.         if (args[0].equals(args[1])){  
  22.             System.out.println("输入的是同一个文件");  
  23.             System.exit(1); //系统退出  
  24.         }  
  25.           
  26.           
  27.         File file1 = new File(args[0]); //找到第一个文件的File 对象  
  28.         if (file1.exists()){  
  29.             File file2 = new File(args[1]); // 找到目标文件路径  
  30.             InputStream input = new FileInputStream(file1); //输入流  
  31.             OutputStream output = new FileOutputStream(file2); //输出流  
  32.             int temp = 0; 定义一个整数表示接收的内容  
  33.             while ((temp = input.read()) != -1 ){ //表示还有内容可以继续读  
  34.                 output.write(temp); //写入数据  
  35.             }  
  36.                         System.out.println("文件复制成功");  
  37.                         input.close();  
  38.             output.close();  
  39.         }else{  
  40.             System.out.println("文件不存在");  
  41.         }  
  42.     }  
  43.   
  44. }  



内存操作流


在之前讲解FileInputStream 和 FileOutputStream 的时候所有的操作的目标是文件,那么如果现在假设有一些临时的信息要求通过IO操作的话,那么如果将这些临时的信息保存在文件之中则肯定很不合理,因为操作的最后还要把文件再删除掉,所以此时的IO中就提供了一个内存的操作流,通过内存操作流输入和输出的目标是内存。


使用ByteArrayOutputStream 和 ByteArrayInputStream 完成内存的操作流

在内存操作流中所有的输入和输出都是以内存为操作的源头

ByteArrayOutputStream 是用于从内存向程序输出的

ByteArrayInputStream 是用于从程序向内存写入的

ByteArrayInputStream 的构造方法: public ByteArrayInputStream(byte[] buf)

表示把内容向内存之中写入

ByteArrayOutputStream来讲,其基本的作用就是与OutputStream一样,一个个的读取数据。

 

范例:使用内存操作流,完成一个字符串小写小母变为大写字每的操作


[java]  view plain copy print ?
  1. package org.bytearrarydemo;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.File;  
  6.   
  7. public class ByteArrayDemo01 {  
  8.   
  9.     /** 
  10.      * @param args 
  11.      */  
  12.     public static void main(String[] args) {  
  13.         // TODO Auto-generated method stub  
  14.         String str ="helloworld"//定义字符串,全部由小写字母组成  
  15.         ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());  //内存输入流 将内容存在内存之中  
  16.         ByteArrayOutputStream output = new ByteArrayOutputStream();     //内存输出流  
  17.         int temp = 0;   
  18.         while ((temp = input.read()) != -1){ //依次读取  
  19.             char c = (char)temp; //接收字符  
  20.             output.write(Character.toUpperCase(c)); //输出  
  21.         }  
  22.         String stra = output.toString(); //取出内存输出的内容  
  23.         System.out.println(stra);  
  24.     }  
  25.   
  26. }  


内存操作流现在在Java SE阶段是感觉不出有什么作用,但是在学习Java WEB 中的AJAX技术的时候,会结合XML解析和JavaScript、AJAX完成一些动态效果的使用


[java]  view plain copy print ?
  1. String newStr = output.toString(); //取出内存输出的内容  

管道流


管道流就是进行两个线程间通讯的。使用PipedOutputStream 和 PipedInputStream 两个类完成。但是,这两个类使用的时候基本上都跟OutputStream 和InputStream类似,唯一区别的的是在于连接管道的操作上。


[java]  view plain copy print ?
  1. public void connect(PipedInputStream snk) throws IOException  

范例:进行管道流的操作


[java]  view plain copy print ?
  1. package org.pipedinputdemo;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PipedInputStream;  
  5. import java.io.PipedOutputStream;  
  6.   
  7. class Send implements Runnable{ //发送数据的线程  
  8.     private PipedOutputStream out = null;  
  9.       
  10.     public Send(){  
  11.         this.out = new PipedOutputStream();  
  12.     }  
  13.       
  14.     public PipedOutputStream getPipedOutputStream(){  
  15.         return this.out;  
  16.     }  
  17.       
  18.     public void run(){  
  19.         String str = "Hello World"//要发送的数据  
  20.         try {  
  21.             this.out.write(str.getBytes()); //发送  
  22.         } catch (IOException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.         try {  
  27.             this.out.close();  
  28.         } catch (IOException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33.       
  34. }  
  35.   
  36. class Recives implements Runnable{ //接收数据的线程  
  37.       
  38.     private PipedInputStream input = null;  
  39.       
  40.     public Recives(){  
  41.         this.input = new PipedInputStream();  
  42.     }  
  43.       
  44.     public PipedInputStream getPipedInputStream(){  
  45.         return this.input;  
  46.     }  
  47.       
  48.     public void run(){  
  49.         byte b[] = new byte[1024]; //接收内容  
  50.         int len = 0;  
  51.         try {  
  52.             len = input.read(b); //内容读取  
  53.         } catch (IOException e) {  
  54.             // TODO Auto-generated catch block  
  55.             e.printStackTrace();  
  56.         }  
  57.         try {  
  58.             input.close();  
  59.         } catch (IOException e) {  
  60.             // TODO Auto-generated catch block  
  61.             e.printStackTrace();  
  62.         }  
  63.         System.out.println(new String(b,0,len));  
  64.     }  
  65. }  
  66.   
  67. public class PipedInputDemo {  
  68.   
  69.     /** 
  70.      * @param args 
  71.      */  
  72.     public static void main(String[] args) throws Exception {  
  73.         // TODO Auto-generated method stub  
  74.         Send send = new Send();  
  75.         Recives rec = new Recives();  
  76.         send.getPipedOutputStream().connect(rec.getPipedInputStream()); //进行管道连接  
  77.         new Thread(send).start(); //启动线程  
  78.         new Thread(rec).start(); //启动线程  
  79.     }  
  80.   
  81. }  


打印流


使用OutputStream 可以完成数据的输出,但是现在如果有一个float 型数据好输出吗?

也就是说虽然现在提供了输出流的操作类,但是这个类本身的输出的支持功能并不是十分的强大,所以,如果现在要想进行更方便的输出操作,则可以使用打印流。


打印流分两种:PrintStream、PrintWriter

观察打印流的定义:


[java]  view plain copy print ?
  1. public class PrintStream  
  2.   
  3. extends FilterOutputstream  
  4.   
  5. implements Appendable,Closeable  


PrintStream 是 OutputStream 的子类,继续观察其构造方法


[java]  view plain copy print ?
  1. public PrintStream(OutputStream out)  

在此就去中要接收OutputStream 子类的引用

实际上PrintStream 属于装饰。也就是说根据实例化 PrintStream 类对象的不同,输出的位置也不同


[java]  view plain copy print ?
  1. package org.printoutputdemo;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.PrintStream;  
  7.   
  8. public class PrintOutputDemo {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      * @throws FileNotFoundException  
  13.      */  
  14.     public static void main(String[] args) throws FileNotFoundException {  
  15.         // TODO Auto-generated method stub  
  16.         File file = new File ("D:"+File.separator+"demo.txt");  
  17.         PrintStream output = new PrintStream(new FileOutputStream(file));  
  18.         output.print("Hello");  
  19.         output.print(" World");  
  20.         output.println("abco");  
  21.         output.println(1.0);  
  22.         output.close();  
  23.     }  
  24.   
  25. }  

得出结论,使用打印流输出最为方便,所以建议以后在输出的时候就使用打印流完成

在JDK1.5之后对打印流进行了更新,可以使用格式化输出


[java]  view plain copy print ?
  1. public PrintStream printf(String format,Object .... args)  


可以设置格式和多个参数


[java]  view plain copy print ?
  1. package org.printoutputdemo;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.PrintStream;  
  7.   
  8. public class PrintStreamDemo01 {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      * @throws FileNotFoundException  
  13.      */  
  14.     public static void main(String[] args) throws FileNotFoundException {  
  15.         // TODO Auto-generated method stub  
  16.         File file = new File ("D:"+File.separator+"demo.txt");  
  17.         PrintStream output = new PrintStream(new FileOutputStream(file));  
  18.         String name = "张三";  
  19.         int age = 20;  
  20.         double score =  99.1;  
  21.         char sex ='M';  
  22.         output.printf("姓名:%s 年龄:%d 分数:%5.2f 性别:%c",name,age,score,sex);  
  23.         output.close();  
  24.     }  
  25.   
  26. }  


在打印流中一定要始终记住以下的原则:根据实例化其子类的不同,完成的打印输出也不同


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值