2012-05-17 34 views
7

Tôi đã tìm kiếm một câu trả lời cho điều này, nhưng thực sự không thể tìm thấy bất cứ điều gì về nó. Trước đó ngày hôm nay, tôi hỏi làm thế nào tôi có thể làm cho một tập tin vào một chuỗi thông qua một mảng byte, và sau đó trở lại một lần nữa, để thu hồi sau đó.BufferedInputStream vào byte [] để được gửi qua một Socket đến một cơ sở dữ liệu

Những gì mọi người nói với tôi, là tôi phải lưu trữ mảng byte, để tránh các sự cố mã hóa khó chịu. Vì vậy, bây giờ tôi đã bắt đầu làm việc trên đó, nhưng bây giờ tôi đã đánh một bức tường.

Về cơ bản, tôi đã sử dụng các luồng chưa được lọc trước đây, để chuyển một tệp thành một mảng byte. Điều này làm việc tốt trong lý thuyết, nhưng nó chiếm rất nhiều bộ nhớ mà cuối cùng sẽ đúc ngoại lệ kích thước heap. Tôi nên sử dụng các luồng đệm thay vì (hoặc vì vậy tôi đã nói), và vấn đề tôi có bây giờ, là đi từ một BufferedInputStream đến một byte []. Tôi đã cố gắng để sao chép và sử dụng những phương pháp tìm thấy trong tài liệu này

http://docs.guava-libraries.googlecode.com/git/javadoc/index.html?com/google/common/io/package-summary.html

Nơi tôi trao đổi suối unbuffered cho suối đệm. Vấn đề duy nhất, là tôi không thể trực tiếp chuyển một luồng đầu ra được đệm thành một mảng byte, như tôi có thể với một luồng không bị chặn.

Trợ giúp? :)

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

public final class BufferedByteStream { 

    private static final int BUF_SIZE = 1024000; 

    public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while(true) { 
      int r = from.read(buf); 
      if(r == -1) { 
       break; 
      } 
      to.write(buf, 0, r); 
      total += r; 
     } 
     return total; 
    } 

    public static byte[] toByteArray(BufferedInputStream in) throws IOException { 
     BufferedOutputStream out = new BufferedOutputStream(new ByteArrayOutputStream()); 
     copy(in, out); 
     return out. // <--- Problem is here 
    } 
} 

EDIT:

tôi vẫn nhận được Heap lỗi Space. Vì vậy, bây giờ tôi sẽ gửi tất cả các mã:

main.java

import java.io.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import jserver.io.BufferedByteStream; 
/** 
* 
* @author Vipar 
*/ 
public class main { 
    public static void main(String[] args) { 
    File f = new File("<doesn't matter>"); 
     try { 
      byte[] buf; 
      try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) { 
       buf = BufferedByteStream.toByteArray(bis); 
       bis.close(); 
      } 
      File f2 = new File("<doesn't matter>"); 
      try (FileOutputStream fos = new FileOutputStream(f2)) { 
       fos.write(buf); 
       fos.close(); 
      } 
     } catch (FileNotFoundException ex) { 
      Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

BufferedByteStream.java

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

public final class BufferedByteStream { 

    private static final int BUF_SIZE = 1024000; 

    public static long copy(BufferedInputStream from, BufferedOutputStream to) throws IOException { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while(true) { 
      int r = from.read(buf); 
      if(r == -1) { 
       break; 
      } 
      to.write(buf, 0, r); 
      total += r; 
     } 
     return total; 
    } 

    public static byte[] toByteArray(BufferedInputStream in) throws IOException { 
     ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); 
     BufferedOutputStream out = new BufferedOutputStream(bytesOut); 
     copy(in, out); 
     return bytesOut.toByteArray(); 
    } 
} 
+0

Tại sao bạn không cho chúng tôi biết bạn đang cố giải quyết vấn đề gì, thay vì hỏi có gì sai với một nửa giải pháp? – EJP

+0

Tôi nên có ban đầu tôi nhận ra bây giờ, nhưng tôi sẽ làm điều đó trong một câu hỏi thích hợp, nơi tôi chỉ đơn giản là đưa ra những gì tôi muốn đạt được. – OmniOwl

Trả lời

9

Có một cái nhìn tại ByteArrayOutputStream: Java 7 API java.io.ByteArrayOutputStream

bytesOut = new ByteArrayOutputStream(); 
byte[] bytes = bytesOut.toByteArray(); 

Cập nhật: Nếu bạn nhấn mạnh vào làm những gì bạn đang làm, bạn chỉ có thể gán ByteArrayOutputStream trung gian cho một biến và được giữ của theo cách đó:

ByteArrayOutputStream bytesOut = new ByteArrayOutputStream() 
BufferedOutputStream out = new BufferedOutputStream(bytesOut); 
copy(in, out); 
return bytesOut.toByteArray(); 

Cập nhật 2: Câu hỏi thực sự có vẻ phải làm thế nào để sao chép một tập tin mà không đọc tất cả vào bộ nhớ đầu tiên:

1) Bằng tay:

byte[] buff = new byte[64*1024]; //or some size, can try out different sizes for performance 
    BufferedInputStream in = new BufferedInputStream(new FileInputStream("fromFile")); 
    BufferedOutputStream out = new BufferedOutputStream(new FileoutputStream("toFile")); 
    int n = 0; 
    while ((n = in.read(buff)) >= 0) { 
     out.write(buff, 0, n); 
    } 
    in.close(); 
    out.close(); 

2) hiệu quả của hệ điều hành và không vv loop:

FileChannel from = new FileInputStream(sourceFile).getChannel(); 
FileChanngel to = new FileOutputStream(destFile).getChannel(); 
to.transferFrom(from, 0, from.size()); 
//or from.transferTo(0, from.size(), to); 
from.close(); 
to.close(); 

3) Nếu bạn có Java 7, bạn có thể đơn giản hóa ngoại lệ và đóng luồng hoặc chỉ sao chép tệp bằng API mới i trong java 7:

java.nio.file.Files.copy(...); 

see java.nio.file.Files

+0

Để hiểu biết của tôi, đó không phải là đệm ... – OmniOwl

+0

Bạn không cần thêm bất kỳ bộ đệm nào ... Nó đang xây dựng một mảng trong bộ nhớ. Nó không nhận được nhiều đệm hơn thế. –

+0

Tuy nhiên nếu bạn không tin tưởng tôi (bạn nên tự đo mình), bạn có thể chỉ cần sử dụng nó anyway nhưng gán nó vào biến riêng của nó ở giữa. Tôi sẽ cập nhật ví dụ. –

Các vấn đề liên quan