黑马程序员技术交流社区

标题: io复制图片 [打印本页]

作者: 罗宵    时间: 2012-7-20 21:32
标题: io复制图片
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Copy {
        public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("d:\\照片\\a.jpg")));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\b.jpg")));
        String line=null;
        while((line=br.readLine())!=null){
                bw.write(line);
        }
        bw.close();
        br.close();
        }
}
为什么用InputStreamReader和OutputStreamWriter转换之后,复制图片总是不成功。

@@6Q7[O4X~{S7{Y~~~D)6GD.jpg (7.72 KB, 下载次数: 62)

@@6Q7[O4X~{S7{Y~~~D)6GD.jpg

作者: 蒋映辉    时间: 2012-7-20 21:33
你把字节流转换为字符流以后  肯定就不能成功了撒....
作者: 张水荣    时间: 2012-7-20 21:37
本帖最后由 张水荣 于 2012-7-20 22:16 编辑

BufferedReader与BufferedWriter不是这样子用的!BufferedReader与BufferedWriter在这里用不了,
但下面的用法可以:
  1. import java.io.*;


  2. public class Test {

  3.         public static void main(String[] args) throws IOException {
  4.                 byte [] buf = new byte[1024*1024];
  5.                 InputStream is = new FileInputStream("d:\\a.png");
  6.                 DataInputStream dis = new DataInputStream(is);
  7.                 OutputStream os = new FileOutputStream("d:\\b.png");
  8.                 DataOutputStream dos = new DataOutputStream(os);
  9.                 int len = dis.read(buf);
  10.                 while(len != -1) {
  11.                         dos.write(buf, 0, len);
  12.                        
  13. len = dis.read(buf);
  14.                 }
  15.         }
  16.         
  17. }
复制代码

作者: 罗宵    时间: 2012-7-20 21:38
蒋映辉 发表于 2012-7-20 21:33
你把字节流转换为字符流以后  肯定就不能成功了撒....

InputStreamReader和OutputStreamWriter这些不是可以将字符流和字节流相互转换吗
作者: 黑马高明辉    时间: 2012-7-20 21:41
public class CopyImg {
public static void main(String[] args)throws Exception {
  FileInputStream fi=new FileInputStream("e:/1.jpg");
  BufferedInputStream in=new BufferedInputStream(fi);
  FileOutputStream fo=new FileOutputStream("e:/2.jpg");
  BufferedOutputStream out=new BufferedOutputStream(fo);
  
  byte[] buf=new byte[1024];
  int len=in.read(buf);//读文件,将读到的内容放入到buf数组中,返回的是读到的长度
  while(len!=-1){
   out.write(buf, 0, len);
   len=in.read(buf);
  }

  out.close();
  fo.close();
  in.close();
  fi.close();
}
}
读取文本文件可以用BufferedReader,二进制的文件是不可以的。也就是说BufferedReader这种方式不能对音频文件、视频文件和图片进行操作,只能对文档文件。而图片是二进制文件,得用inputStream读写。FileInputStream 从文件系统中的某个文件中获得输入字节。你应该用FileInputStream 这个。用BufferedReader能复制成功,但是打不开。
作者: 蒋映辉    时间: 2012-7-20 21:44
InputStreamReader 和OutputStreamWriter 叫转换流  都是把字节流转换为字符流的....不能把字符流转换为字节流
作者: 周恺    时间: 2012-7-20 21:44
标题: //
本帖最后由 周恺 于 2012-7-20 21:45 编辑

BufferedReader,BufferedWriter是带缓冲区的字符IO流,怎么可以用来复制图片呢?图片文件是由字节文件.你使用字符io流来操作,其中还经过编码和解码的过程,这个过程是会造成字节丢失的.补要用BufferedRead和BufferedWrite.把他们换成BufferedInputStream,和BufferedOutputStream就可以了
  1. public class Copy {
  2.         public static void main(String[] args) throws IOException {
  3.         BufferedInputStream br=new BufferedReader(new InputStreamReader(new FileInputStream("d:\\照片\\a.jpg")));//输入流换成BufferedInputStream
  4.         BufferedOutputStream bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\b.jpg")));//输出流换成 BufferedOutputStream
  5.        // String line=null;
  6.           int length=-1;//设定变量,获取字节数组里的有效数据长度
  7.           byte[] buf=new byte[1024];//定义缓冲区.
  8.         while((length=br.read(buf)))!=null){//这里也改一下
  9.                 bw.write(byte,0,length);
  10.         }
  11.         bw.close();
  12.         br.close();
  13.         }
  14. }
复制代码

作者: 王龙彪    时间: 2012-7-20 21:46
字符流和字节流是不能相互转换的
当字节流转换为字符流的时候,字符流会去查一个映射表
当映射表没有对应的字符的时候,就会去一个不确定的区域替换
这样在再转回字节流的时候,就不是原来的数据了
作者: 张世威    时间: 2012-7-20 22:33
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Copy {
        public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("d:\\照片\\a.jpg")));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\b.jpg")));
        String line=null;
        while((line=br.readLine())!=null){
                bw.write(line);
        }
        bw.close();
        br.close();
        }
}
为什么用InputStreamReader和OutputStreamWriter转换之后,复制图片总是不成功。

1、文本文件的存储:
     ①文本文件的内容是一行一行的存储进去的,每一行结束都有一个换行控制符,整个文件最后还有一个文件结束符-1
       你按照文本文件的方式读取字节流(二级制)文件,读的过程中可能很多与换行控制符一样的二进制会被丢弃,导致文件内容不完整,你又将读到的内容以字符流的方式往文件里面存储,又会丢弃很多不符合要求的二进制。
②你看看你拷贝后的文件变小了多少?

2、归根结底的来说,所有的这些流,本质上都是字节流,在底层,里面走的都是一个个字节(8位二进制),
      ①为了满足不同的需要,又在字节流的上面添加字符处理功能,称为字符流;
      ②在流上面添加缓冲功能,流又变成了缓冲流
      ③还有、对象流、数据流、打印流、连接流、转换流.....
           都是在已有流的基础上添加新功能的,内部包装的都还是字节流

3、所以,所有的文件拷贝,都可以使用字节流来进行处理,只不过太原始了,效率不高而已。就像马路一样,
有土路、沙子路、水泥路、柏油路。铁路。。。。。都是在原始的地球表明铺了一点东西,让我们人类在上面运动的更快更有效率而已。







作者: 吴立杰    时间: 2012-7-20 22:45
首先楼主要明白像图片和MP3等都是一些最原始的数据,读取和写入这写输入是需要字节流的。而字符流是字节流+编码表的,楼主你觉得你在复制图片的过程中,里面的数据都给你加上编码表会出现正常的图片吗?楼主想高效复制可以选择使用BufferedInputStream再加上个字节数组就更高效了。具体代码我就不给你贴上去了,老毕视频里肯定有,还有告诉你老毕说的那四个明确你要常分析,这是学好IO流的关键,加油!
作者: 吴立杰    时间: 2012-7-20 22:45
首先楼主要明白像图片和MP3等都是一些最原始的数据,读取和写入这写输入是需要字节流的。而字符流是字节流+编码表的,楼主你觉得你在复制图片的过程中,里面的数据都给你加上编码表会出现正常的图片吗?楼主想高效复制可以选择使用BufferedInputStream再加上个字节数组就更高效了。具体代码我就不给你贴上去了,老毕视频里肯定有,还有告诉你老毕说的那四个明确你要常分析,这是学好IO流的关键,加油!
作者: 。_Smileヾ淡莣    时间: 2012-7-20 23:13
package cn.itcast;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.nio.CharBuffer;

//         io复制图片 [复制链
public class InputStreamOut {
        public static void main(String[] args) throws Exception {
                BufferedInputStream bis=new BufferedInputStream(new FileInputStream("f:\\a.png"));
                BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("f:\\b.png"));
                int str;
        while((str=bis.read())!=-1){
                bos.write( str );
//                需要刷新;字符流需要刷新;字节流不需要刷新,直接关闭流就有一次默认的刷新;
                bos.flush();
                }
        bos.close();
        bis.close();
        }
}
读取文件还有图片之类的;都是使用字节流;
读取文本需要使用字符流;你好好看看老毕将的那个流的四要素;源,目的,是否是纯文本;是否需要额外功能;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2