将文件转换为字节数组,反之亦然

时间:2012-11-12 22:56:34

标签: java arrays

我发现了很多将文件转换为字节数组并将字节数组写入存储文件的方法。

我想要的是将java.io.File转换为字节数组,然后将字节数组转换回java.io.File

我不想将其写入存储区,如下所示:

//convert array of bytes into file
FileOutputStream fileOuputStream = new FileOutputStream("C:\\testing2.txt"); 
fileOuputStream.write(bFile);
fileOuputStream.close();

我想以某种方式执行以下操作:

File myFile = ConvertfromByteArray(bytes);

8 个答案:

答案 0 :(得分:52)

否则试试这个:

将文件转换为字节

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


   public class Temp {

        public static void main(String[] args) {

         File file = new File("c:/EventItemBroker.java");

         byte[] b = new byte[(int) file.length()];
         try {
               FileInputStream fileInputStream = new FileInputStream(file);
               fileInputStream.read(b);
               for (int i = 0; i < b.length; i++) {
                           System.out.print((char)b[i]);
                }
          } catch (FileNotFoundException e) {
                      System.out.println("File Not Found.");
                      e.printStackTrace();
          }
          catch (IOException e1) {
                   System.out.println("Error Reading The File.");
                    e1.printStackTrace();
          }

       }
    }

将字节转换为文件

      public class WriteByteArrayToFile {

         public static void main(String[] args) {

            String strFilePath = "Your path";
            try {
                 FileOutputStream fos = new FileOutputStream(strFilePath);
                 String strContent = "Write File using Java ";

                 fos.write(strContent.getBytes());
                 fos.close();
           }
          catch(FileNotFoundException ex)   {
                 System.out.println("FileNotFoundException : " + ex);
          }
         catch(IOException ioe)  {
                 System.out.println("IOException : " + ioe);
          }

       }
     }

答案 1 :(得分:21)

我认为你误解了java.io.File班级的真正含义。它只是系统上文件的表示,即其名称,路径等。

你有没有看过java.io.File类的Javadoc?看看here 如果你检查它有的字段或方法或构造函数参数,你立即得到它的全部提示,是URL /路径的表示。

Oracle在Java File I/O tutorial中提供了相当广泛的教程,并提供了最新的NIO.2功能。

使用NIO.2,您可以使用java.nio.file.Files.readAllBytes()在一行中阅读。

类似地,您可以使用java.nio.file.Files.write()来写入字节数组中的所有字节。

<强>更新

由于问题标记为Android,更常规的方法是将FileInputStream包装在BufferedInputStream中,然后将其包装在ByteArrayInputStream中。 这将允许您阅读byte[]中的内容。同样地,OutputStream也存在对应物。

答案 2 :(得分:8)

你不能这样做。 File只是一种引用文件系统中文件的抽象方式。它本身不包含任何文件内容。

如果您正在尝试创建可以使用File对象引用的内存中文件,那么您也无法执行此操作,如{{3}中所述},this thread和许多其他地方..

答案 3 :(得分:3)

没有此类功能,但您可以File.createTempFile()使用临时文件。

File temp = File.createTempFile(prefix, suffix);
// tell system to delete it when vm terminates.
temp.deleteOnExit();

答案 4 :(得分:3)

您不能为File执行此操作,File主要是智能文件路径。你可以重构你的代码,以便它声明变量,并传递参数,使用类型OutputStream而不是FileOutputStream吗?如果是,请参阅课程java.io.ByteArrayOutputStreamjava.io.ByteArrayInputStream

OutputStream outStream = new ByteArrayOutputStream();
outStream.write(whatever);
outStream.close();
byte[] data = outStream.toByteArray();
InputStream inStream = new ByteArrayInputStream(data);
...

答案 5 :(得分:1)

1-传统方式

传统的转换方式是通过使用InputStream的read()方法如下:

public static byte[] convertUsingTraditionalWay(File file)
{
    byte[] fileBytes = new byte[(int) file.length()]; 
    try(FileInputStream inputStream = new FileInputStream(file))
    {
        inputStream.read(fileBytes);
    }
    catch (Exception ex) 
    {
        ex.printStackTrace();
    }
    return fileBytes;
}

2- Java NIO

使用Java 7,您可以使用nio包的Files实用程序类进行转换:

public static byte[] convertUsingJavaNIO(File file)
{
    byte[] fileBytes = null;
    try
    {
        fileBytes = Files.readAllBytes(file.toPath());
    }
    catch (Exception ex) 
    {
        ex.printStackTrace();
    }
    return fileBytes;
}

3- Apache Commons IO

除了JDK,您还可以使用Apache Commons IO库通过以下两种方式进行转换:

3.1。 IOUtils.toByteArray()

public static byte[] convertUsingIOUtils(File file)
{
    byte[] fileBytes = null;
    try(FileInputStream inputStream = new FileInputStream(file))
    {
        fileBytes = IOUtils.toByteArray(inputStream);
    }
    catch (Exception ex) 
    {
        ex.printStackTrace();
    }
    return fileBytes;
}

3.2。 FileUtils.readFileToByteArray()

public static byte[] convertUsingFileUtils(File file)
{
    byte[] fileBytes = null;
    try
    {
        fileBytes = FileUtils.readFileToByteArray(file);
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
    return fileBytes;
}

答案 6 :(得分:0)

服务器端

@RequestMapping("/download")
public byte[] download() throws Exception {
    File f = new File("C:\\WorkSpace\\Text\\myDoc.txt");
     byte[] byteArray = new byte[(int) f.length()];
        byteArray = FileUtils.readFileToByteArray(f);
        return byteArray;
}

客户端

private ResponseEntity<byte[]> getDownload(){
    URI end = URI.create(your url which server has exposed i.e. bla 
              bla/download);
    return rest.getForEntity(end,byte[].class);

}

public static void main(String[] args) throws Exception {


    byte[] byteArray = new TestClient().getDownload().getBody();
    FileOutputStream fos = new 
    FileOutputStream("C:\\WorkSpace\\testClient\\abc.txt");

     fos.write(byteArray);
     fos.close(); 
     System.out.println("file written successfully..");


}

答案 7 :(得分:0)

//The file that you wanna convert into byte[]
File file=new File("/storage/0CE2-EA3D/DCIM/Camera/VID_20190822_205931.mp4"); 

FileInputStream fileInputStream=new FileInputStream(file);
byte[] data=new byte[(int) file.length()];
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
bufferedInputStream.read(data,0,data.length);

//Now the bytes of the file are contain in the "byte[] data"
/*If you want to convert these bytes into a file, you have to write these bytes to a 
certain location, then it will make a new file at that location if same named file is 
not available at that location*/
FileOutputStream fileOutputStream =new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()+"/Video.mp4");
fileOutputStream.write(data);
 /* It will write or make a new file named Video.mp4 in the "Download" directory of 
    the External Storage */