(一)这里可以先复习一下java输入输出流和文件操作---
1.File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名。判断指定文件是否存在、获取当前目录中的文件列表,创建、删除文件和目录等。
2.I/O流 根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流
(二)在JAVA里面,可以用复制语句”A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.
以下是归纳的JAVA中复制数组的方法:
1.使用FOR循环,将数组的每个元素复制或者复制指定元素,不过效率差一点
2.使用clone方法,得到数组的值,而不是引用,不能复制指定元素,灵活性差一点
3.使用System.arraycopy(src, srcPos, dest, destPos, length)方法,推荐使用
举例:
1.使用FOR循环
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
for(int i=0;i<6;i++) dest[i] = src[i];
2.使用clone
int[] src={1,3,5,6,7,8};
int[] dest;
dest=(int[]) src.clone();//使用clone创建
副本,注意clone要使用强制转换
3.使用System.arraycopy
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
System.arraycopy(src, 0, dest, 0, 6);
——————————————————————-
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制.
其函数原型是:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置;
length:复制的长度.
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,
比如:int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
(三)下面利用文件流将功能扩充一下
原来的代码只能发送字符串的文字信息。如果要传送文件呢?txt文件?zip文件之类的等等..
可能代码扩充的不是太好,甚至当网络不好的时候还会出现一些问题,但是先将补充好的代码贴一下,后面如果有完善和修正的话再修改。
package bigbang; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.ConsumerCancelledException; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.ShutdownSignalException; import com.rabbitmq.client.Connection; import java.io.File; import java.io.IOException; import java.util.Scanner; import java.util.Arrays; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import com.rabbitmq.client.Channel; class RecvThread extends Thread{ RecvThread(String name){ super(name);//调用父类带参数的构造方法 } public void run(){ final String QUEUE_NAME = "hello"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("115.159.181.204"); factory.setPort(5672); factory.setUsername("admin"); factory.setPassword("admin"); // 打开连接和创建频道,与发送端一样 Connection connection = null; try { connection = factory.newConnection(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Channel channel = null; try { channel = connection.createChannel(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列。 try { channel.queueDeclare(QUEUE_NAME, false, false, false, null); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 创建队列消费者 System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); // 指定消费队列 // 指定消费队列 QueueingConsumer consumer = new QueueingConsumer(channel); try { channel.basicConsume(QUEUE_NAME, true, consumer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while(true){ QueueingConsumer.Delivery delivery = null; try { delivery = consumer.nextDelivery(); } catch (ShutdownSignalException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ConsumerCancelledException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte[] message =delivery.getBody(); //String message = new (delivery.getBody()); try { OutputStream os=new FileOutputStream("C:/Users/cdmin/Desktop/121.zip",true); //byte[] buffer=delivery.getBody().length; try { os.write(message); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("file has been received! please scan your desktop!"); //System.out.println(" [x] Received '" + message + "'"); } } } public class zipzip { private final static String QUEUE_NAME = "hello"; private static Object message; public static void main(String[] args) throws java.io.IOException { /** * 创建连接连接到MabbitMQ */ // 设置MabbitMQ所在主机ip或者主机名 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("115.159.181.204"); factory.setPort(5672); System.out.println("input your username:"); Scanner un=new Scanner(System.in); String username=null; username=un.next(); System.out.println("input your password::"); Scanner up=new Scanner(System.in); String userpassword=null; userpassword=up.nextLine(); factory.setUsername(username); factory.setPassword(userpassword); // 创建一个连接 Connection connection = factory.newConnection(); // 创建一个频道 Channel channel = connection.createChannel(); // 指定一个队列 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 发送的消息 //String message=null; //String str=null; InputStream is =new FileInputStream("C:/Users/cdmin/Desktop/12.zip"); byte[] buffer=new byte[8192]; byte[] message=new byte[8192]; int length=0; while(-1!=(length=is.read(buffer, 0, 8192))){ //System.out.println(length); System.arraycopy(buffer,0,message,0, length); //channel.basicPublish("", QUEUE_NAME, null, message); //for(int i=0;i<length;i++) message[i] = buffer[i]; // // str=new String(buffer,0,length); } is.close(); //System.out.println(buffer); //byte[] message = str.substring(0, str.length()-1).getBytes(); //System.out.println(message); //message=str; //Scanner s=new Scanner(System.in); //message=s.nextLine(); // 往队列中发出一条消息 channel.basicPublish("", QUEUE_NAME, null, message); System.out.println(" [x] Sent '" + "12.zip"); // 关闭频道和连接 channel.close(); connection.close(); RecvThread rthread= new RecvThread("test1"); rthread.start(); } }
运行结果如下:
比如传送一个zip压缩包------
控制台运行结果:
看一下桌面:
我要发送的是12.zip 桌面应该接收到一个12.zip的压缩包 (这里为了区分我把接收到的压缩包命名为121.zip)