byte [] thành tệp trong Java


327

Với Java:

Tôi có một byte[]đại diện cho một tập tin.

Làm thế nào để tôi viết điều này vào một tập tin (ví dụ. C:\myfile.pdf)

Tôi biết nó đã được thực hiện với InputStream, nhưng dường như tôi không thể giải quyết được.

Câu trả lời:


502

Sử dụng Apache Commons IO

FileUtils.writeByteArrayToFile(new File("pathname"), myByteArray)

Hoặc, nếu bạn khăng khăng làm việc cho chính mình ...

try (FileOutputStream fos = new FileOutputStream("pathname")) {
   fos.write(myByteArray);
   //fos.close(); There is no more need for this line since you had created the instance of "fos" inside the try. And this will automatically close the OutputStream
}

28
@R. Bemrose Vâng, nó có thể quản lý để làm sạch tài nguyên trong trường hợp buồn.
Tom Hawtin - tackline

1
Từ tài liệu: LƯU Ý: Kể từ v1.3, các thư mục mẹ của tệp sẽ được tạo nếu chúng không tồn tại.
bmargulies

24
Nếu viết thất bại, bạn sẽ rò rỉ luồng đầu ra. Bạn nên luôn luôn sử dụng try {} finally {}để đảm bảo dọn dẹp tài nguyên thích hợp.
Steven Schlansker

3
câu lệnh fos.close () là không cần thiết vì bạn đang sử dụng tài nguyên try-with-tự động đóng luồng, ngay cả khi viết không thành công.
Tihomir Meščić

4
Tại sao tôi lại sử dụng apache commons IO khi nó là 2 dòng với Java thông thường
GabrielBB

185

Không có bất kỳ thư viện:

try (FileOutputStream stream = new FileOutputStream(path)) {
    stream.write(bytes);
}

Với Google ổi :

Files.write(bytes, new File(path));

Với Apache Commons :

FileUtils.writeByteArrayToFile(new File(path), bytes);

Tất cả các chiến lược này đều yêu cầu bạn cũng bắt được IOException.


118

Một giải pháp khác sử dụng java.nio.file:

byte[] bytes = ...;
Path path = Paths.get("C:\\myfile.pdf");
Files.write(path, bytes);

1
chỉ dành cho Andorid O (8.0) +
kangear

2
Tôi không nghĩ rằng C:\myfile.pdfdù sao cũng sẽ hoạt động trên Android ...;)
TBieniek

37

Cũng kể từ Java 7, một dòng với java.nio.file.Files:

Files.write(new File(filePath).toPath(), data);

Trong đó dữ liệu là byte của bạn [] và filePath là một Chuỗi. Bạn cũng có thể thêm nhiều tùy chọn mở tệp với lớp StandardOpenOptions. Thêm ném hoặc bao quanh với thử / bắt.


6
Bạn có thể sử dụng Paths.get(filePath);thay vìnew File(filePath).toPath()
Tim Büthe

@Halil Tôi không nghĩ điều đó đúng. Theo javadocs, có một đối số thứ 3 tùy chọn cho các tùy chọn mở và "Nếu không có tùy chọn nào thì phương thức này hoạt động như thể có các tùy chọn CREATE, TRUNCATE_EXISTING và WRITE. Nói cách khác, nó mở tệp để viết, tạo tệp nếu nó không tồn tại hoặc ban đầu cắt một tệp thông thường hiện có đến kích thước 0. "
Kevin Sadler

19

Từ Java 7 trở đi, bạn có thể sử dụng câu lệnh try-with-resource để tránh rò rỉ tài nguyên và làm cho mã của bạn dễ đọc hơn. Thêm về điều đó ở đây .

Để viết của bạn byteArrayvào một tập tin bạn sẽ làm:

try (FileOutputStream fos = new FileOutputStream("fullPathToFile")) {
    fos.write(byteArray);
} catch (IOException ioe) {
    ioe.printStackTrace();
}

Tôi đã thử sử dụng cái này và nó đã gây ra vấn đề với các byte không phải là ký tự UTF-8, vì vậy tôi sẽ cẩn thận với cái này nếu bạn đang cố gắng viết từng byte để tạo một tệp chẳng hạn.
pdrum



1
File f = new File(fileName);    
byte[] fileContent = msg.getByteSequenceContent();    

Path path = Paths.get(f.getAbsolutePath());
try {
    Files.write(path, fileContent);
} catch (IOException ex) {
    Logger.getLogger(Agent2.class.getName()).log(Level.SEVERE, null, ex);
}

1

//////////////////////////// 1] Tập tin vào Byte [] /////////////////// //

Path path = Paths.get(p);
                    byte[] data = null;                         
                    try {
                        data = Files.readAllBytes(path);
                    } catch (IOException ex) {
                        Logger.getLogger(Agent1.class.getName()).log(Level.SEVERE, null, ex);
                    }

/////////////////////// 2] Byte [] thành tập tin ///////////////////// ///////

 File f = new File(fileName);
 byte[] fileContent = msg.getByteSequenceContent();
Path path = Paths.get(f.getAbsolutePath());
                            try {
                                Files.write(path, fileContent);
                            } catch (IOException ex) {
                                Logger.getLogger(Agent2.class.getName()).log(Level.SEVERE, null, ex);
                            }

Cảm ơn câu trả lời..nhưng tôi có nhầm lẫn về "fileName" tôi có nghĩa là loại tệp bạn đang lưu dữ liệu là gì? bạn có thể vui lòng giải thích?
SRam

1
Xin chào SRam, điều đó chỉ phụ thuộc vào ứng dụng của bạn tại sao bạn thực hiện chuyển đổi và ở định dạng nào bạn muốn đầu ra, tôi khuyên bạn nên sử dụng định dạng .txt (ví dụ: - myconvertedfilename.txt) nhưng lại là lựa chọn của bạn.
Piyush Rumao

0

Ví dụ cơ bản:

String fileName = "file.test";

BufferedOutputStream bs = null;

try {

    FileOutputStream fs = new FileOutputStream(new File(fileName));
    bs = new BufferedOutputStream(fs);
    bs.write(byte_array);
    bs.close();
    bs = null;

} catch (Exception e) {
    e.printStackTrace()
}

if (bs != null) try { bs.close(); } catch (Exception e) {}

0

Đây là chương trình mà chúng tôi đang đọc và in mảng byte bù và độ dài bằng cách sử dụng String Builder và Viết mảng byte có độ dài bù cho tệp mới.

` Nhập mã vào đây

import java.io.File;   
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;        

//*This is a program where we are reading and printing array of bytes offset and length using StringBuilder and Writing the array of bytes offset length to the new file*//     

public class ReadandWriteAByte {
    public void readandWriteBytesToFile(){
        File file = new File("count.char"); //(abcdefghijk)
        File bfile = new File("bytefile.txt");//(New File)
        byte[] b;
        FileInputStream fis = null;              
        FileOutputStream fos = null;          

        try{               
            fis = new FileInputStream (file);           
            fos = new FileOutputStream (bfile);             
            b = new byte [1024];              
            int i;              
            StringBuilder sb = new StringBuilder();

            while ((i = fis.read(b))!=-1){                  
                sb.append(new String(b,5,5));               
                fos.write(b, 2, 5);               
            }               

            System.out.println(sb.toString());               
        }catch (IOException e) {                    
            e.printStackTrace();                
        }finally {               
            try {              
                if(fis != null);           
                    fis.close();    //This helps to close the stream          
            }catch (IOException e){           
                e.printStackTrace();              
            }            
        }               
    }               

    public static void main (String args[]){              
        ReadandWriteAByte rb = new ReadandWriteAByte();              
        rb.readandWriteBytesToFile();              
    }                 
}                

O / P trong bảng điều khiển: fghij

O / P trong tệp mới: cdefg


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.