0 0

InputStream 到 string 再到 OutputStream 问题5

写了一段代码 大体是 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格式的文档由问题吗?
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;
		}
	}


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

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

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



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

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

0 0

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

2014年3月28日 13:43
0 0

找到问题了:
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
0 0

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

2011年9月22日 08:21
0 0

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

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;
		}
	}


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

2011年9月21日 16:15

相关推荐

    将输出流OutputStream转化为输入流InputStream的方法

    在这种情况下,可能需要先将`OutputStream`的内容刷新到目标(例如文件),然后再创建一个新的`InputStream`来读取该目标。 在实际开发中,`PipedOutputStream`和`PipedInputStream`也可以用来实现输出流和输入流...

    java 中InputStream,String,File之间的相互转化对比

    将InputStream转化为String,一般使用BufferedReader读取InputStream中的每一行并拼接到StringBuffer中,最后返回其toString()的结果。另外,也可以通过ByteArrayOutputStream来读取InputStream,然后将其转换为...

    java 文件存储 Inputstream outputstream reader writer的用法

    通过以上的实例,你可以了解到Java中如何使用`InputStream`、`OutputStream`、`Reader`和`Writer`进行文件读写操作。不断实践这些基本的IO操作,将有助于你更好地理解和掌握Java的文件处理能力。

    java io InputStream and outputStream

    适合初学者的一些代码,public static void main(String[] args) { File file1 = new File("c:\\aaa.txt");// 定位文件 if (!file1.exists()) { System.out.println("文件不存在...."); } else { try { ...

    文件转换(inputString)

    在实际开发中,我们还需要考虑编码问题,例如确保在进行String到InputStream的转换时,正确地指定字符集(如UTF-8),以防止乱码。此外,转换完成后记得关闭相关的流,避免资源泄漏。 总之,理解和掌握String与...

    android用base64实现文件与string相互转换

    1. 在处理大文件时,考虑到内存限制,可以使用`java.io.InputStream`和`java.io.OutputStream`进行分块读写,而不是一次性加载整个文件到内存。 2. 文件的原始格式可能影响编码结果,例如图片、音频等非文本文件编码...

    Java String与Byte类型转换

    这个过程包括将源代码中的字符串常量转换为字节码,这涉及到了String到Byte的转换。`input.txt`可能是一个文本文件,其内容可能需要在网络编程中读取并转换为字节流进行传输。 总之,Java中的String与Byte类型的...

    简单说说JAVA的String和byte[]的关系

    - **Java I/O操作**: 在Java中进行I/O操作时,通常涉及到`InputStream`和`OutputStream`等类,这些类通常操作的是`byte[]`。因此,在处理文本数据时,需要特别注意字符集的选择。 - **网络通信**: 在Web开发中,处理...

    java.io.Reader 和 java.io.InputStream 的区别

    此外,值得注意的是,虽然`InputStream`和`OutputStream`以及`Reader`和`Writer`之间存在类似的关系,但在设计上,`InputStream`和`OutputStream`更偏向于底层数据传输,而`Reader`和`Writer`则提供了更高级的字符...

    通过jsoup,输入流InputStream爬取图片PaQuPic.rar,有意者入

    6. **处理输入流和输出流**:在处理`InputStream`和`OutputStream`时,确保它们都被正确关闭,避免资源泄漏。这里使用了Java 7的try-with-resources语句,它会在块结束时自动关闭资源。 7. **处理PaQuPic.rar**:...

    android的assets下的文件保存到sd卡

    在Android开发中,有时我们需要将应用内部的资源文件,如图片、音频或文本,复制到外部存储设备(如SD卡)以便于后续操作,比如上传到服务器。标题"android的assets下的文件保存到sd卡"涉及到的就是这样一个场景,即...

    android 下载图片到本地Sdcard

    private static boolean saveInputStreamToFile(InputStream inputStream, String filePath) { try { File file = new File(filePath); OutputStream outputStream = new FileOutputStream(file); byte[] buffer...

    android复制asset中文件到SD卡

    在Android开发中,将资源文件从Asset目录复制到外部存储(如SD卡)是一个常见的需求。这主要适用于那些需要在应用程序运行时动态访问或者需要在设备上持久保存的非代码数据,例如音频、视频、配置文件等。下面将详细...

    mutator-io:一个小库来处理(大)数据转换

    它使用组合从源(inputStream)到目标(outputStream)的数据流 安装 npm i mutator-io 管子 Mutator I / O中“管道”的概念只是将递到 interface Pipe { name : string in : InputStream out : OutputStream ...

    android:assets下的文件复制到SD卡

    在Android开发中,有时我们需要将应用内部的资源文件,如图片、文本或配置文件等,复制到外部存储(如SD卡)以便于后续的操作,比如读取大文件以减轻内存负担,或者创建用户可访问的数据目录。`android:assets`是...

    JavaSE基础知识笔记(下)

    文件流继承自Inputstream和OutputStream,用于连接文件的“管道”,可以对文件进行读写的流。 #### 2.2 字符流 字符流的超类是java.io.Reader和java.io.Writer。字符流是以字符为单位读写数据的流,用于处理文本...

    android tcpip

    至于“4个点测试没有问题,多了没有测试”,这可能是指在测试阶段,服务器成功地与四个客户端建立了连接,并进行了数据交换,但没有进一步测试更多的连接情况。在实际部署时,确保服务器能处理大量并发连接是非常...

    Struts Updownload 源码

    import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction ...

    ios app可以从apns的反馈服务器获取无效deviceTocken

    为了解决这个问题,APNs提供了一个反馈服务,开发者可以通过这个服务获取到无效的deviceToken,以便清理推送通知列表,避免无效推送。 本文将详细介绍如何在iOS应用中实现从APNs反馈服务器获取无效deviceToken的...

    android socket通信实例程序

    在实际应用中,我们还需要考虑异常处理、多线程处理并发连接等问题。同时,Android有权限管理,所以在AndroidManifest.xml中需要添加Internet权限: ```xml ``` 以上就是Android中使用Socket进行TCP通信的基本...

Global site tag (gtag.js) - Google Analytics