如何在Java中将字节数组写入文件?

时间:2009-11-20 11:07:35

标签: java

如何用Java编写字节数组到文件?

8 个答案:

答案 0 :(得分:74)

正如Sebastian Redl指出现在最直接java.nio.file.Files.write。有关详细信息,请参阅Reading, Writing, and Creating Files tutorial


旧答案: FileOutputStream.write(byte[])将是最直接的。你想写什么数据?

tutorials for Java IO system可能对你有用。

答案 1 :(得分:38)

您可以使用IOUtils.write(byte[] data, OutputStream output)中的Apache Commons IO

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();
byte[] encoded = key.getEncoded();
FileOutputStream output = new FileOutputStream(new File("target-file"));
IOUtils.write(encoded, output);

答案 2 :(得分:33)

从Java 1.7开始,有一种新方法:java.nio.file.Files.write

import java.nio.file.Files;
import java.nio.file.Paths;

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();
byte[] encoded = key.getEncoded();
Files.write(Paths.get("target-file"), encoded);

Java 1.7还解决了Kevin所描述的尴尬:现在正在阅读文件:

byte[] data = Files.readAllBytes(Paths.get("source-file"));

答案 3 :(得分:16)

一位评论者问道“为什么要使用第三方图书馆?”答案是,自己做这件事太痛苦了。这是一个如何正确执行从文件中读取字节数组的逆操作的示例(对不起,这只是我现有的代码,而不是我希望提问者实际粘贴并使用此代码):

public static byte[] toByteArray(File file) throws IOException { 
   ByteArrayOutputStream out = new ByteArrayOutputStream(); 
   boolean threw = true; 
   InputStream in = new FileInputStream(file); 
   try { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while (true) { 
       int r = in.read(buf); 
       if (r == -1) {
         break; 
       }
       out.write(buf, 0, r); 
     } 
     threw = false; 
   } finally { 
     try { 
       in.close(); 
     } catch (IOException e) { 
       if (threw) { 
         log.warn("IOException thrown while closing", e); 
       } else {
         throw e;
       } 
     } 
   } 
   return out.toByteArray(); 
 }

每个人都应该对痛苦感到震惊。

使用好图书馆。我不出所料地推荐Guava的Files.write(byte[], File)

答案 4 :(得分:12)

要将字节数组写入文件,请使用方法

public void write(byte[] b) throws IOException

来自BufferedOutputStream类。

java.io.BufferedOutputStream实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不必为写入的每个字节调用底层系统。

对于您的示例,您需要以下内容:

String filename= "C:/SO/SOBufferedOutputStreamAnswer";
BufferedOutputStream bos = null;
try {
//create an object of FileOutputStream
FileOutputStream fos = new FileOutputStream(new File(filename));

//create an object of BufferedOutputStream
bos = new BufferedOutputStream(fos);

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
byte[] encoded = key.getEncoded();

bos.write(encoded);

} 
// catch and handle exceptions...

答案 5 :(得分:7)

Apache Commons IO UtilsFileUtils.writeByteArrayToFile()方法。请注意,如果您正在进行任何文件/ IO工作,那么Apache Commons IO库将为您做很多工作。

答案 6 :(得分:4)

不需要外部库来臃肿 - 特别是在使用Android时。这是一个本机解决方案,可以解决这个问题。这是来自应用程序的一堆代码,它将字节数组存储为图像文件。

    // Byte array with image data.
    final byte[] imageData = params[0];

    // Write bytes to tmp file.
    final File tmpImageFile = new File(ApplicationContext.getInstance().getCacheDir(), "scan.jpg");
    FileOutputStream tmpOutputStream = null;
    try {
        tmpOutputStream = new FileOutputStream(tmpImageFile);
        tmpOutputStream.write(imageData);
        Log.d(TAG, "File successfully written to tmp file");
    }
    catch (FileNotFoundException e) {
        Log.e(TAG, "FileNotFoundException: " + e);
        return null;
    }
    catch (IOException e) {
        Log.e(TAG, "IOException: " + e);
        return null;
    }
    finally {
        if(tmpOutputStream != null)
            try {
                tmpOutputStream.close();
            } catch (IOException e) {
                Log.e(TAG, "IOException: " + e);
            }
    }

答案 7 :(得分:0)

         File file = ...
         byte[] data = ...
         try{
            FileOutputStream fos = FileOutputStream(file);
            fos.write(data);
            fos.flush();
            fos.close();
         }catch(Exception e){
          }

但是,如果字节数组的长度大于1024,则应使用循环写入数据。