A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗宵 中级黑马   /  2012-7-20 21:32  /  2708 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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, 下载次数: 61)

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

11 个回复

倒序浏览
你把字节流转换为字符流以后  肯定就不能成功了撒....
回复 使用道具 举报
本帖最后由 张水荣 于 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:33
你把字节流转换为字符流以后  肯定就不能成功了撒....

InputStreamReader和OutputStreamWriter这些不是可以将字符流和字节流相互转换吗
回复 使用道具 举报
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能复制成功,但是打不开。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
InputStreamReader 和OutputStreamWriter 叫转换流  都是把字节流转换为字符流的....不能把字符流转换为字节流
回复 使用道具 举报
周恺 中级黑马 2012-7-20 21:44:11
7#

//

本帖最后由 周恺 于 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. }
复制代码
回复 使用道具 举报
字符流和字节流是不能相互转换的
当字节流转换为字符流的时候,字符流会去查一个映射表
当映射表没有对应的字符的时候,就会去一个不确定的区域替换
这样在再转回字节流的时候,就不是原来的数据了
回复 使用道具 举报
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、所以,所有的文件拷贝,都可以使用字节流来进行处理,只不过太原始了,效率不高而已。就像马路一样,
有土路、沙子路、水泥路、柏油路。铁路。。。。。都是在原始的地球表明铺了一点东西,让我们人类在上面运动的更快更有效率而已。






回复 使用道具 举报
首先楼主要明白像图片和MP3等都是一些最原始的数据,读取和写入这写输入是需要字节流的。而字符流是字节流+编码表的,楼主你觉得你在复制图片的过程中,里面的数据都给你加上编码表会出现正常的图片吗?楼主想高效复制可以选择使用BufferedInputStream再加上个字节数组就更高效了。具体代码我就不给你贴上去了,老毕视频里肯定有,还有告诉你老毕说的那四个明确你要常分析,这是学好IO流的关键,加油!
回复 使用道具 举报
首先楼主要明白像图片和MP3等都是一些最原始的数据,读取和写入这写输入是需要字节流的。而字符流是字节流+编码表的,楼主你觉得你在复制图片的过程中,里面的数据都给你加上编码表会出现正常的图片吗?楼主想高效复制可以选择使用BufferedInputStream再加上个字节数组就更高效了。具体代码我就不给你贴上去了,老毕视频里肯定有,还有告诉你老毕说的那四个明确你要常分析,这是学好IO流的关键,加油!
回复 使用道具 举报
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();
        }
}
读取文件还有图片之类的;都是使用字节流;
读取文本需要使用字符流;你好好看看老毕将的那个流的四要素;源,目的,是否是纯文本;是否需要额外功能;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马