写了一段代码 大体是 InputStream读取文件到string后OutputStream到文件 
遇到的问题为TXT文件大小格式等都没有问题,但是PDF\RAR等格式的就无法打开了,重新生成的文件大小会比原文件小,代码如下。 
package com.stream;

import java.io.BufferedReader; 
import java.io.ByteArrayOutputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.Reader; 
import java.util.Arrays;

public class bytearry { 
// public static void main(String[] args) throws Exception{ 
//        String s = "中国"; 
//        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
//        DataOutputStream dos = new DataOutputStream(baos); 
//        dos.writeUTF(s);     
//        byte[] b = baos.toByteArray(); 
//        for(int i=0;i<b.length;i++){ 
//            System.out.println(Integer.toHexString(b[i])); 
//        } 
//        System.out.println(">>>"+new String(b,"UTF-8")+"<<<");        
//        System.out.println("--------------------"); 
//        byte[] b2 = s.getBytes("UTF-8"); 
//        for(int i=0;i<b2.length;i++){ 
//            System.out.println(Integer.toHexString(b2[i])); 
//        } 
//    }

// public static void main(String[] args) throws IOException { 
//   String str = "Hello world!"; 
//   // string转byte 
//   byte[] bs = str.getBytes(); 
//   System.out.println(Arrays.toString(bs)); 
//   
//   // byte转string 
//   String str2 = new String(bs); 
//   System.out.println(str2); 
//   
//   OutputStream os = new FileOutputStream("C://testCopy11.pdf");  //输出流 
//   FileInputStream fis = new FileInputStream("d://test.pdf");  //输入流 
//   //InputStreamReader     
//   Reader  inputStreamReader = new InputStreamReader(fis); 
//   BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
//   
//   String ss = new String();    
//   String s;    
//   while((s = bufferedReader.readLine())!=null){    
//           ss += s;    
//   } 
//   //System.out.println(ss); 
//   
//   byte[] buf = new byte[255]; 
//   
//   buf = ss.getBytes(); 
//   
//   
//
// 
//     int len = 0;  
//     //while ((len = buf.length) != -1) {  
//     // os.write(buf, 0, len); 
//     os.write(buf); 
//    // }  
//   
//     fis.close();  
//     os.flush();  
//     os.close(); 
//     //copy(); 
// 
// }

public static void main(String[] args) throws IOException { 
  String str = "Hello world!"; 
  // string转byte 
  byte[] bs = str.getBytes(); 
  System.out.println(Arrays.toString(bs)); 
  
  // byte转string 
  String str2 = new String(bs); 
  System.out.println(str2); 
  
  OutputStream os = new FileOutputStream("C://bytearry.java");  //输出流 
  FileInputStream fis = new FileInputStream("d://bytearry.java");  //输入流 
  //InputStreamReader     
  Reader  inputStreamReader = new InputStreamReader(fis); 
  BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  
  String ss = new String();    
  String s;    
  while((s = bufferedReader.readLine())!=null){    
          ss += s;    
  } 
  System.out.println(ss.length()); 
  
  byte[] buf = new byte[255]; 
  
  buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes(); 
  int len = 0;  
    //while ((len = buf.length) != -1) {  
    // os.write(buf, 0, len); 
    os.write(buf); 
   // }   
    fis.close();  
    os.flush();  
    os.close(); 
    //copy(); 
    System.out.println(loadAFileToStringDE2(new File("d://bytearry.java")));

}
   public static String loadAFileToStringDE2(File f) throws IOException {  
        long beginTime = System.currentTimeMillis(); 
        InputStream is = null; 
        String ret = null; 
        try { 
            is =  new FileInputStream(f) ; 
            long contentLength = f.length(); 
            byte[] ba = new byte[(int)contentLength]; 
            is.read(ba); 
            ret = new String(ba); 
        } finally { 
            if(is!=null) {try{is.close();} catch(Exception e){} } 
        } 
        long endTime = System.currentTimeMillis(); 
        System.out.println("方法2用时"+ (endTime-beginTime) + "ms"); 
        return ret;        
    } 
   
public static boolean copy() {  
   try {  
    OutputStream os = new FileOutputStream("C://test.pdf");  //输出流 
    InputStream fis = new FileInputStream("d://test.pdf");  //输入流 
  
    byte[] buf = new byte[255];  
    int len = 0;  
    while ((len = fis.read(buf)) != -1) {  
    os.write(buf, 0, len);  
    }  
  
    fis.close();  
    os.flush();  
    os.close();  
  
    return true;  
   } catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block   
    e.printStackTrace();  
    return false;  
   } catch (IOException e) {  
    // TODO Auto-generated catch block   
    e.printStackTrace();  
    return false;  
   }  
}  
}


问题补充:

chen_yongkai 写道
好乱啊,是指这段拷贝pdf格式的文档由问题吗?

  1. public static boolean copy() {
  2. try {
  3. OutputStream os = new FileOutputStream("C://test.pdf"); // 输出流
  4. InputStream fis = new FileInputStream("d://test.pdf"); // 输入流
  5. byte[] buf = new byte[255];
  6. int len = 0;
  7. while ((len = fis.read(buf)) != -1) {
  8. os.write(buf, 0, len);
  9. }
  10. fis.close();
  11. os.flush();
  12. os.close();
  13. return true;
  14. } catch (FileNotFoundException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. return false;
  18. } catch (IOException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. return false;
  22. }
  23. }

这个是按字节拷贝的,貌似没什么问题

--------------------------------------------------------- 
这段是没有问题的,但是 InputStream读取文件到string后OutputStream到文件,中间多了一个string过程。


问题补充:

chen_yongkai 写道
有问题的代码呢?重点贴出,不要混在一起

代码是可以运行的吧,下面的行就是InputStream读取文件到string 到byte[]啊。 
buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes(); 

2011年9月21日 12:30

dongni110 
20 
0 0 0
 
 
 

4个答案按时间排序按投票排序

00

请参见http://blog.csdn.net/maya2000/article/details/22394933 
inputstream 转 string 转 outputstream

2014年3月28日 13:43
aqkf-2001 
30 
0 0 0
 
00

找到问题了: 
loadAFileToStringDE2方法里 
byte[] ba = new byte[(int)contentLength]; 
            is.read(ba); 
            ret = new String(ba); //这里用的是平台默认编码

调用处: 
buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes();//用的也是平台默认编码

应该改为: 
ret = new String(ba,"ISO8859-1");

buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes("ISO8859-1");

平台默认编码有可能不包括某些字符,因而丢失了数据

2011年9月26日 09:40
chen_yongkai 
1600 
1 1 23
 
00

有问题的代码呢?重点贴出,不要混在一起

2011年9月22日 08:21
chen_yongkai 
1600 
1 1 23
 
00

好乱啊,是指这段拷贝pdf格式的文档由问题吗?

  1. public static boolean copy() {
  2. try {
  3. OutputStream os = new FileOutputStream("C://test.pdf"); // 输出流
  4. InputStream fis = new FileInputStream("d://test.pdf"); // 输入流
  5. byte[] buf = new byte[255];
  6. int len = 0;
  7. while ((len = fis.read(buf)) != -1) {
  8. os.write(buf, 0, len);
  9. }
  10. fis.close();
  11. os.flush();
  12. os.close();
  13. return true;
  14. } catch (FileNotFoundException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. return false;
  18. } catch (IOException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. return false;
  22. }
  23. }

这个是按字节拷贝的,貌似没什么问题

InputStream读取文件到string后OutputStream到文件,按String和Bytes拷贝的更多相关文章

  1. python 压缩文件为zip后删除原文件

    压缩.log 文件为zip后删除原文件 需要注意:本人作为小白,该脚本需要和.log在一起,后面有时间需要改正. #!/usr/local/python/bin/python #-*-coding=u ...

  2. IDEA中部署tomcat,运行JSP文件,编译后的JSP文件存放地点总结

    首先保证你正常部署了Tomcat,并且正常在浏览器中运行了JSP文件. 那么Tomcat编译后的JSP文件(_jsp.class 和 _jsp.java)的存放地点: (一)一般存放在你安装的Tomc ...

  3. Itext读取PDF模板文件渲染数据后创建新文件

    Maven导入依赖 <properties> <itextpdf.version>5.5.0</itextpdf.version> <itext-asian. ...

  4. Linux文件被删除后恢复

    当ext4中的文件被删除后,进行文件恢复:http://www.360doc.com/content/18/0320/08/51898798_738625260.shtml上面的博客是恢复删除的文件, ...

  5. Android下使用InputStream读取文件

    在Android下使用InputStream读取文件. 如果不是从头开始读取文件,使用skip 后 在读取文件 使用read读取的长度为-1会获取不到数据. 换成RandomAccessFile 使用 ...

  6. 关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    因为做网站的静态页缓存,所以做了这个测试 MVC项目 准备了4个Action,分两组,一组是读取本地磁盘的一个html页面文件,一组是延时2秒 public class TestController ...

  7. C# 中使用Image.FromFile(string path)后,提示该文件正在被另一进程使用XXX的问题

    C# 中使用Image.FromFile(string path)后,提示该文件正在被另一进程使用XXX的问题 C# 中使用Image.FromFile(string path)后,提示该文件正在被另 ...

  8. [Head First Python]4.读取文件datafile.txt, 去除两边空格, 存储到列表,从列表格式化(nester.py)后输出到文件man.out,other.out

    datafile.txt  #文件 Man: this is the right room for an argument. Other Man: I've told you once. Man: N ...

  9. weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP

    我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍 ...

随机推荐

  1. java学习一目了然——IO

    java学习一目了然--IO IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件.数据库等读取到内存中所 ...

  2. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  3. Train Problem II

    问题陈述: HDOJ Problem - 1023 问题解析: 卡特兰数(Catalan)的应用 基本性质: f(n) = f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2) ...

  4. 1.C语言关键字(auto break case char const swtich)

    ANSI C标准C语言共有32个关键字,分别为: auto break case char const continue default do double else enum extern floa ...

  5. 转的git

    原文链接:http://blog.csdn.NET/dengjianqiang2011/article/details/9260435 如果输入$ Git remote add origin git@ ...

  6. 一步一步学python(三) - 使用字符串

    1.基本字符串操作 序列和元组的索引.分片.乘法.判断成员资格.求长度.取最小值和最大值对字符串同样适用. 字符串是不可变的 2.字符串格式化 %左侧放字符串右侧放格式化的值.一般情况下使用元组 fo ...

  7. D、GO、Rust 谁会在未来取代 C?为什么?——Go语言的定位非常好,Rust语言非常优秀,D语言也不错

    不要管我的地位和 D 语言创造者之一的身份.我会坦诚的回答这个问题.我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里.我鼓励人们在 Rust 和 Go 社区相似身份的人,也可以提出他们诚恳的观点 ...

  8. perl tk说明

    介绍: perl/Tk(也被称为pTK) 是一个模块和代码的收集,尝试 简单的配置Tk 8 部件工具包到强大的词素文文字, 动态内存,I/O, 和面向对象,它是一种解释脚本语言 来制作部件和程序 使用 ...

  9. 能上QQ无法打开网页

    能上QQ无法上网电脑故障解决方法 Winsock协议配置故障解决方法 第1步 :单击开始菜单中的运行,并在打开的运行窗口中键入“cmd”并回车确定,打死命令提示符窗口. 第2步 :在打开的命令提示符窗 ...

  10. 网易云课堂_Linux操作系统入门(嵌入式开发零基础Ⅰ)_章节4:SHELL 环境

    课时44命令别名 命令别名 命令别名的概念: 命令别名的查看:alias 命令别名的设置:alias myls='ls -a' 课时45通配符 通配符 通配符都概念: 通配符是代表字符通用匹配的一种系 ...