如何将本地图片文件,转成字节码流后
然后再 转成对象 用于 网络传输呢?

解决方案 »

  1.   

    传输方法(文件的流,文件的扩展名);
    服务端和客户端分别是是什么,都是JAVA编写的么?
    http or soket or ftp or soap??
      

  2.   

    javax.imageio.*;
    里面的方法也许有用:
        BufferedImage bImage = new BufferedImage(image.getWidth(), image
                    .getHeight(), BufferedImage.TYPE_INT_ARGB);
     
        ByteArrayOutputStream out = new ByteArrayOutputStream();
            try {
                ImageIO.write(bImage, format, out);
            } catch (IOException e) {
                e.printStackTrace();
            }
          byte [] b = out.toByteArray();
    b传过去,再转成图像,用FileOutpurStream 就好啦
               FileOutputStream fos = new FileOutputStream(file);
                for (int i = 0; i < b.length; i++) {
                    fos.write(b[i]);
                }
                fos.flush();
      

  3.   

    有个Toolkit.creatImage()可以用字节数组实现构造图片!!
    不知道lz是不是这个意思!!你说的转成对象什么意思啊??
      

  4.   

    谢谢  楼上 的兄弟 ,需求 是这样 的 客户端 需要 将 文件 传到 服务器端,是cs软件,不是bs的
    我现在可以将图片文件转成字节码流后
    然后我们有写好 的方法可以直接传对象到服务器端,所以我才想是否可以转成对象?可序列化的?
      

  5.   

    都是java写,是自己的通信机制,可以传对象,或其他,
    ftp方式老大 说不用没办法 只能通过字节流 转 转。
      

  6.   

    你说的是fileupload吗?这个对于bs来说应该是基于 http协议的吧
    我这边 可能没有这个协议,。。呵呵 
    ths
      

  7.   

    因为我现在 服务端跟 客户端 有现成的 对象传输的方法如果你说的那种方法,需要用socket吧。。不解 
      

  8.   

    估计lz的意思是想加密吧?是吗lz
      

  9.   

    没有加密的意思,。只是想 把文件传到 服务端端,然后 还可以传回来,直接 字节流 怎么传?还是要socket或其他 协议吧楼上的 preferme 高手
      

  10.   

    这个有趣 网络传输  我还没学 不过 今天上课老师跟我们试  copy的过程就用到了这个字节流成功了而字符流 会导致失去部分编码丢失,结果打开copy后的文件说是错误的图片格式。。
      

  11.   

    客户端发送
    DataOutputStream dos=null;
                FileInputStream fis=null;
                try {
                    dos=new DataOutputStream(s.getOutputStream());
                    fis=new FileInputStream(file);
                    byte[] buf=new byte[2048]; 
                    int num=0; 
                    while((num=fis.read(buf))!=(-1)) 
                    {//是否读完所有数据 
                     dos.write(buf,0,num);//将数据写往文件 
                     dos.flush();
                    } 服务器端接收,先接收文件名,在选择路径保存图片
    JFileChooser jfc=new JFileChooser();
                        jfc.setSelectedFile(new File(jfc.getCurrentDirectory().getAbsolutePath(),name));
                        jfc.showSaveDialog(frame);
                        File f=jfc.getSelectedFile();
                        f.createNewFile();
                        dis=new DataInputStream(scoket.getInputStream());
                        RandomAccessFile raf=new RandomAccessFile(f,"rw"); 
                        byte[] buf=new byte[2048]; 
                        int num=0; 
                        while((num=dis.read(buf))!=(-1)) 
                        { 
                         raf.write(buf,0,num);
                         raf.skipBytes(num);
                        } 
                        br.close();
                        dis.close();
                        raf.close();
                    }
    大概就是这个意思吧
      

  12.   

    socket
    啊 呵呵 还是回到我问题的 起点,能把 字节流转成 对象吗?然和 传对象过去,在用 objectinputstream  writeobject 出来。。
      

  13.   

    为什么要把字节流转化成对象啊,按你的意思是把字节流序列化吗,这是不可能的把
    序列化只能Serializable或者xml
    ObjectOutputStream oos=null;
    try {
    oos=new ObjectOutputStream(s.getOutputStream());
    oos.writeObject(new File(image.jpg));
    oos.flush();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    接受的时候
    ois=new ObjectInputStream(s.getInputStream());
    File lmn=(File)ois.readObject();
    试一下吧,图像类我不太熟,好像可以直接传输像素,用到Image 和PixelGrabber这也是一种方法,你查一下资料吧
      

  14.   

    小文件,直接读成字节数组,进行传输就行。
    楼主说,你那里已经有线程的传输框架,不知道具体传输对象,使用的是什么类。
    如果使用的是JDK中的ObjectOutputSteam的实现类对象的话,write方法就可以传输字节数组。
    在Java当中,JDK所提供的文件类,没有实现Serializable接口,是不能够序列化的,
    所以不能直接进行对象传输。但文件可以读取成字节数组,进行传输。
    小文件,可以一次性读取到内存中,然后直接调用相关方法就可以传输。
    大文件,要想办法实现文件的随机访问与传输。
    如果楼主的框架不是使用的ObjectOutputStream进行传输,那就请楼主找找,有没有类似传输字节数组的方法。如果没有,楼主可以把字节数组封装的一个实现Serializable接口的类里面,这样,传输这个对象到服务端就可以了。
      

  15.   

    问题应该是解决了,我的文件比较小,我准备用字节数组传输 写了代码,大家看看;
    最后利用现有的传对象的方法 将字节数组传输到服务端 存为文件
    public class TestFile
    {    /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException
        {
            //        int byteread = 0; 
            //        File file = new File("2.GIF");
            //        InputStream is = new FileInputStream(file);
            //        byte[] buffer = new byte[1024]; 
            //        while ((byteread = is.read(buffer)) != -1) {  //一次读1444个字节放入buffer数组中
            //            System.out.println(is.read(buffer));
            //        }        File file = new File("2.GIF");
            byte[] b = getBytesFromFile(file);
            getFileFromBytes(b, "22.jpg");    }    public static byte[] getBytesFromFile(File file)
        {
            byte[] ret = null;
            try
            {
                if (file == null)
                {
                    // log.error("helper:the file is null!");  
                    return null;
                }
                FileInputStream in = new FileInputStream(file);
                ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
                byte[] b = new byte[4096];
                int n;
                while ((n = in.read(b)) != -1)
                {
                    out.write(b, 0, n);
                }
                in.close();
                out.close();
                ret = out.toByteArray();
            }
            catch (IOException e)
            {
                // log.error("helper:get bytes from file process error!");  
                e.printStackTrace();
            }
            return ret;
        }    public static File getFileFromBytes(byte[] b, String outputFile)
        {
            File ret = null;
            BufferedOutputStream stream = null;
            try
            {
                ret = new File(outputFile);
                FileOutputStream fstream = new FileOutputStream(ret);
                stream = new BufferedOutputStream(fstream);
                stream.write(b);
            }
            catch (Exception e)
            {
                // log.error("helper:get file from byte process error!");  
                e.printStackTrace();
            }
            finally
            {
                if (stream != null)
                {
                    try
                    {
                        stream.close();
                    }
                    catch (IOException e)
                    {
                        // log.error("helper:get file from byte process error!");  
                        e.printStackTrace();
                    }
                }
            }
            return ret;
        }}
      

  16.   

    28楼的代码,其实还是可以优化一下的。比如,File对象,可以获得文件的大小(所占字节数)。
    然后根据文件大小,创建一个byte[],然后直接把数据读到数组里就可以了,没必要创建那个out缓冲区。
      

  17.   

    用那个ByteArrayOutputStream 不是速度快吗?难道 适得其反
      

  18.   

    BufferedOutputStream(fstream);
    看错了,这个buffer不是速度 快么 一次性 写入。呵呵
      

  19.   

    目前大多数人,在网络上花了大量的时间,而又没有真正的挣到应得的钱,最终还是白费力气,帮别人做嫁衣,这是为什么呢?一.是因为有些网赚项目,根本就是虚假的,利用了所有人想挣钱的心态,把他们利用,免费使用,当他达到目的后,就不给钱,不理人!强烈瞧不起这种人!二.有些网赚项目,只是他们吹的有那么神奇,说的那么有利润,但实际上操作起来,是难之又难。不是想像中的那么简单!三.现在的网赚,也都基本上是千篇一律,什么点击广告啦,帮别人推广啦,注册啦等等等等,这些项目太多了,枯燥无味,做的人多了,利润自然就低,浪费时间!四.最重要的一点,就是我们自己把网赚,把兼职想像的太好,以为很容易,很简单,但是,事实完全不是如此,什么事情都得靠自己花心思去做,才会有真正的回报。现在,我推荐大家一个真正能挣到钱,而且比较轻松,比较简单的一个挣钱方法,那就是手机充值,因为手机呢,每个人都要用,都要充值话费。都是选择买充值卡,或者跑营业厅去充值,想想看,你身边有多少人要充值呢,你的朋友,你的同事,你的同学,你的家人,他们如果都在你这里充值的话,这是多大的一个充值量。而做为你呢,即可以帮他们省去买卡,省去往营业厅跑的麻烦,而你自己又能挣到钱,利人利已,何乐不为呢。如果朋友们觉得可以的话,就到中银速充WWW.46677.CN 这个手机充值平台去了解一下,平台支持全国移动,全国联通和电信的充值业务办理,都是网上在线充值,支持10元20元30元还有五十,一百的面值,挺方便的,速度也快,都是在十分钟内就充值好了。而且他们平台还有充50块钱赠送40块钱的套餐(其中50元是马上就到帐,送的40元是分月返还),这是所有人都值得办理的一个套餐,因为50块钱是当场就全部到帐,就连有些地区的营业厅都做不到这一点的。。还有充100块送220块的套餐,充200块送220块钱的套餐等等。方式很多,很齐全的。如果朋友们觉得行哦,就去注册吧,但别忘记啦,注册的时候,推荐人那一栏里面,填上小妹我的用户名哦:chenliyuan ,填上了对你没有坏处,但对我有好处的,呵呵,因为我的利润可以多了5%。谢谢哦!对了,忘记讲了,你们注册后,每充一笔套餐业务,能挣到5%-20%左右的利润,直充的利润就相对比较少啦,总之一天挣个五六十块钱,是挺简单的事。如果去介绍几个下级代理的话,利润多了5%,一天百来块钱还是会有滴,好了,就说到这吧,他们的网址是:www.46677.cn 电 话:400-777-0821转2226  客服QQ:914876028 914876502
      

  20.   

    当你对同一文件的内容进行多次操作的时候(读取、写入),创建缓冲区,是提高效率的好方法。
    但是,楼主的程序,是一次性将文件全都读到内存,也就是说,楼主只对文件做一次操作,
    所以,使用BufferedOutputStream类,没啥提高效率可言。
    其实,byte[]数组,你也可以看成是一个特殊的数据缓冲区。
      

  21.   

    别用java的序列化,效率太差,直接用socket stream方式写出去就行了
      

  22.   

    过路  upupup!!!!!
      

  23.   

    呵呵,自己也写了个import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Scanner;public class BetyArrayTest {

    public static void main(String[] args){
    try{
    ByteArrayOutputStream bao=new ByteArrayOutputStream();
    byte[] buff=new byte[1];
    BufferedInputStream bis=new BufferedInputStream(new FileInputStream("d:/1.jpg"));
    while((bis.read(buff))>0){
    bao.write(buff);
    }
    bao.close();
    bis.close();
    buff=bao.toByteArray();//将图片文件转换为字节数组
                                                         //buff数组存储的是图片1.JPG的字节码
    ByteArrayInputStream asis=new ByteArrayInputStream(buff);
    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("d:/2.jpg"));
    byte[] temp=new byte[1];
    while((asis.read(temp))>0){
    bos.write(temp);
    }
    asis.close();
    bos.flush();
    bos.close();
    }
    catch(Exception e){
    e.printStackTrace();
    }
    }
    }呵呵,代码写的很粗糙
      

  24.   

    楼主的问题还没有解决么?
    不知道现在还存在什么问题。
    我今天编了一下午的代码,基于另一个帖子的问题,写了一个具有传输文件功能代码。
    代码比较长,希望有经历的朋友可以多给我提提意见和建议。
    连接是:使用ObjectOutputStream或ObjectInputStream传输文件
      

  25.   


    byte[] buf = null;
    try {
    if (file != null) {
    FileInputStream in = new FileInputStream(file);
    buf = new byte[(int)file.length()];
    if(in.read(buf)!=buf.length){
    return null;
    }
    }
    } catch (IOException e) {
    // log.error("helper:get bytes from file process error!");
    e.printStackTrace();
    }
    return buf;