最近做android的时候,同事说用一个URL获取一张图片太慢了,看能不能发字节过来,我就测试了一下,把一个File的文件转化为一个byte[]数组字节,下面是代码:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; /** * 把一个文件转化为byte[]数据,然后把字节写入一个新文件里面 * @author spring sky *<br> Email:vipa1888@163.com *<br> QQ:840950105 * */ public class FileToByte { public static void main(String[] args) throws Exception { File file = new File("d:/a.png"); byte[] b = getByte(file); /*** * 打印出字节 * 每一行10个字节 */ for (int i = 0; i < b.length; i++) { System.out.print(b[i]); if(i%10==0&&i!=0) { System.out.print("\n"); } } /** * 把得到的字节写到一个新的文件里面 */ File newFile = new File("e:/我的新图片.png"); OutputStream os = new FileOutputStream(newFile); os.write(b); //把流一次性写入一个文件里面 os.flush(); os.close(); } /** * 把一个文件转化为字节 * @param file * @return byte[] * @throws Exception */ public static byte[] getByte(File file) throws Exception { byte[] bytes = null; if(file!=null) { InputStream is = new FileInputStream(file); int length = (int) file.length(); if(length>Integer.MAX_VALUE) //当文件的长度超过了int的最大值 { System.out.println("this file is max "); return null; } bytes = new byte[length]; int offset = 0; int numRead = 0; while(offset<bytes.length&&(numRead=is.read(bytes,offset,bytes.length-offset))>=0) { offset+=numRead; } //如果得到的字节长度和file实际的长度不一致就可能出错了 if(offset<bytes.length) { System.out.println("file length is error"); return null; } is.close(); } return bytes; } }
上面的getByte方法就可以得到了字节,同时我把字节转化为文件也是没有问题的! 这种方式主要是用把文件包装在xml或者json中传送,不过,我个人觉得服务器端还是一样给发送流,但是这种方式存在弊端,比如文件过大,那么字节肯定会多了,这样如果客户端突然因为某些原因而连接不上了服务器,将会导致文件传送的失败!我不推荐这种方式,个人觉得还是使用url获取,这样还可以加入断点续传的功能,排除了很多异常的问题! 这样比较好!同时我也希望大家不要考虑用这种方式给客户端传送文件!