$$$问个文件传输问题 如何将本地图片文件,转成字节码流后然后再 转成对象 用于 网络传输呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 传输方法(文件的流,文件的扩展名);服务端和客户端分别是是什么,都是JAVA编写的么?http or soket or ftp or soap?? 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(); 有个Toolkit.creatImage()可以用字节数组实现构造图片!!不知道lz是不是这个意思!!你说的转成对象什么意思啊?? 谢谢 楼上 的兄弟 ,需求 是这样 的 客户端 需要 将 文件 传到 服务器端,是cs软件,不是bs的我现在可以将图片文件转成字节码流后然后我们有写好 的方法可以直接传对象到服务器端,所以我才想是否可以转成对象?可序列化的? 都是java写,是自己的通信机制,可以传对象,或其他,ftp方式老大 说不用没办法 只能通过字节流 转 转。 你说的是fileupload吗?这个对于bs来说应该是基于 http协议的吧我这边 可能没有这个协议,。。呵呵 ths 因为我现在 服务端跟 客户端 有现成的 对象传输的方法如果你说的那种方法,需要用socket吧。。不解 估计lz的意思是想加密吧?是吗lz 没有加密的意思,。只是想 把文件传到 服务端端,然后 还可以传回来,直接 字节流 怎么传?还是要socket或其他 协议吧楼上的 preferme 高手 这个有趣 网络传输 我还没学 不过 今天上课老师跟我们试 copy的过程就用到了这个字节流成功了而字符流 会导致失去部分编码丢失,结果打开copy后的文件说是错误的图片格式。。 客户端发送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(); }大概就是这个意思吧 socket啊 呵呵 还是回到我问题的 起点,能把 字节流转成 对象吗?然和 传对象过去,在用 objectinputstream writeobject 出来。。 为什么要把字节流转化成对象啊,按你的意思是把字节流序列化吗,这是不可能的把序列化只能Serializable或者xmlObjectOutputStream 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这也是一种方法,你查一下资料吧 小文件,直接读成字节数组,进行传输就行。楼主说,你那里已经有线程的传输框架,不知道具体传输对象,使用的是什么类。如果使用的是JDK中的ObjectOutputSteam的实现类对象的话,write方法就可以传输字节数组。在Java当中,JDK所提供的文件类,没有实现Serializable接口,是不能够序列化的,所以不能直接进行对象传输。但文件可以读取成字节数组,进行传输。小文件,可以一次性读取到内存中,然后直接调用相关方法就可以传输。大文件,要想办法实现文件的随机访问与传输。如果楼主的框架不是使用的ObjectOutputStream进行传输,那就请楼主找找,有没有类似传输字节数组的方法。如果没有,楼主可以把字节数组封装的一个实现Serializable接口的类里面,这样,传输这个对象到服务端就可以了。 问题应该是解决了,我的文件比较小,我准备用字节数组传输 写了代码,大家看看;最后利用现有的传对象的方法 将字节数组传输到服务端 存为文件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; }} 28楼的代码,其实还是可以优化一下的。比如,File对象,可以获得文件的大小(所占字节数)。然后根据文件大小,创建一个byte[],然后直接把数据读到数组里就可以了,没必要创建那个out缓冲区。 用那个ByteArrayOutputStream 不是速度快吗?难道 适得其反 BufferedOutputStream(fstream);看错了,这个buffer不是速度 快么 一次性 写入。呵呵 目前大多数人,在网络上花了大量的时间,而又没有真正的挣到应得的钱,最终还是白费力气,帮别人做嫁衣,这是为什么呢?一.是因为有些网赚项目,根本就是虚假的,利用了所有人想挣钱的心态,把他们利用,免费使用,当他达到目的后,就不给钱,不理人!强烈瞧不起这种人!二.有些网赚项目,只是他们吹的有那么神奇,说的那么有利润,但实际上操作起来,是难之又难。不是想像中的那么简单!三.现在的网赚,也都基本上是千篇一律,什么点击广告啦,帮别人推广啦,注册啦等等等等,这些项目太多了,枯燥无味,做的人多了,利润自然就低,浪费时间!四.最重要的一点,就是我们自己把网赚,把兼职想像的太好,以为很容易,很简单,但是,事实完全不是如此,什么事情都得靠自己花心思去做,才会有真正的回报。现在,我推荐大家一个真正能挣到钱,而且比较轻松,比较简单的一个挣钱方法,那就是手机充值,因为手机呢,每个人都要用,都要充值话费。都是选择买充值卡,或者跑营业厅去充值,想想看,你身边有多少人要充值呢,你的朋友,你的同事,你的同学,你的家人,他们如果都在你这里充值的话,这是多大的一个充值量。而做为你呢,即可以帮他们省去买卡,省去往营业厅跑的麻烦,而你自己又能挣到钱,利人利已,何乐不为呢。如果朋友们觉得可以的话,就到中银速充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 当你对同一文件的内容进行多次操作的时候(读取、写入),创建缓冲区,是提高效率的好方法。但是,楼主的程序,是一次性将文件全都读到内存,也就是说,楼主只对文件做一次操作,所以,使用BufferedOutputStream类,没啥提高效率可言。其实,byte[]数组,你也可以看成是一个特殊的数据缓冲区。 别用java的序列化,效率太差,直接用socket stream方式写出去就行了 过路 upupup!!!!! 呵呵,自己也写了个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(); } }}呵呵,代码写的很粗糙 楼主的问题还没有解决么?不知道现在还存在什么问题。我今天编了一下午的代码,基于另一个帖子的问题,写了一个具有传输文件功能代码。代码比较长,希望有经历的朋友可以多给我提提意见和建议。连接是:使用ObjectOutputStream或ObjectInputStream传输文件 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; 怎么获取ftp服务器上是否有某个文件存在,并且相应的大小是多少? 寻一本电子书候捷译《Java编程思想》(第二版) 我用JDBC连接的ACCESS数据库,有一个first1字段,有2000个值,我想每次去5个,改怎么做? 这么简单的都错 奇怪的DOMException 关于socket概念的理解问题! 在线等待你的佳音!大家近来看看哦! 请问应该怎样在JDK中加入数据库的驱动程序?谢谢 菜鸟问题:装上了jdk1.2,如何配置环境? 这个字符是什么? java JTextField 文本状态监听 高手请教 问题 刚学strsuts
服务端和客户端分别是是什么,都是JAVA编写的么?
http or soket or ftp or soap??
里面的方法也许有用:
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();
不知道lz是不是这个意思!!你说的转成对象什么意思啊??
我现在可以将图片文件转成字节码流后
然后我们有写好 的方法可以直接传对象到服务器端,所以我才想是否可以转成对象?可序列化的?
ftp方式老大 说不用没办法 只能通过字节流 转 转。
我这边 可能没有这个协议,。。呵呵
ths
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();
}
大概就是这个意思吧
啊 呵呵 还是回到我问题的 起点,能把 字节流转成 对象吗?然和 传对象过去,在用 objectinputstream writeobject 出来。。
序列化只能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这也是一种方法,你查一下资料吧
楼主说,你那里已经有线程的传输框架,不知道具体传输对象,使用的是什么类。
如果使用的是JDK中的ObjectOutputSteam的实现类对象的话,write方法就可以传输字节数组。
在Java当中,JDK所提供的文件类,没有实现Serializable接口,是不能够序列化的,
所以不能直接进行对象传输。但文件可以读取成字节数组,进行传输。
小文件,可以一次性读取到内存中,然后直接调用相关方法就可以传输。
大文件,要想办法实现文件的随机访问与传输。
如果楼主的框架不是使用的ObjectOutputStream进行传输,那就请楼主找找,有没有类似传输字节数组的方法。如果没有,楼主可以把字节数组封装的一个实现Serializable接口的类里面,这样,传输这个对象到服务端就可以了。
最后利用现有的传对象的方法 将字节数组传输到服务端 存为文件
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;
}}
然后根据文件大小,创建一个byte[],然后直接把数据读到数组里就可以了,没必要创建那个out缓冲区。
看错了,这个buffer不是速度 快么 一次性 写入。呵呵
但是,楼主的程序,是一次性将文件全都读到内存,也就是说,楼主只对文件做一次操作,
所以,使用BufferedOutputStream类,没啥提高效率可言。
其实,byte[]数组,你也可以看成是一个特殊的数据缓冲区。
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();
}
}
}呵呵,代码写的很粗糙
不知道现在还存在什么问题。
我今天编了一下午的代码,基于另一个帖子的问题,写了一个具有传输文件功能代码。
代码比较长,希望有经历的朋友可以多给我提提意见和建议。
连接是:使用ObjectOutputStream或ObjectInputStream传输文件
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;