【问题标题】:keeping the outcome file in a byte array in java将结果文件保存在java中的字节数组中
【发布时间】:2015-06-23 16:51:24
【问题描述】:

我有下面的 java 代码,在其中我将文件名 abc.csv 传递给调用方法,以便它将其转换为 xls 扩展名让我们说下面的代码最初是代码

File file = new File("C:\\abc.csv");
        String filename = file.getName();
         s = getFileExtension(file) ;
         if (s.equalsIgnoreCase(".csv"))
                 {
             convertcsvtoexcel(filename);
                 }
                 FileInputStream fin = null;
        fin = new FileInputStream(file);
    HSSFWorkbook workbook = new HSSFWorkbook(fin); 

现在因为有一个 csv 文件正在被传递,所以它会调用方法将 csv 转换为 excel

现在请告知我想在下面自定义这种转换方法,以便它应该将转换后的文件返回为字节数组,然后我可以将相同的字节数组传递给代码的后期阶段,特别是从现在仪式开始的 HSSFWorkbook 构造函数发生了什么它从我的 c: 读取 csv 文件并生成另一个 .xls 转换后的输出文件并将其保存在我的 C: 驱动器中,稍后我的代码再次从我的 c: 读取转换后的输出文件,所以我想跳过这些重复的步骤我想按顺序附加这个文件,首先从我的 c: 中读取文件,然后转换为 xls,然后将相同的 .xls 文件传递​​给后面的代码,请告知如何实现这一点

  public static  void  convertcsvtoexcel(String filepath) throws Exception {

              ArrayList arList=null;
                ArrayList al=null;
                //String fName = file.getName();
                String thisLine; 
                int count=0; 
                FileInputStream file1 = null ;
                file1   = new FileInputStream(new File(filepath)); 

                 DataInputStream myInput = new DataInputStream(file1);
                int i=0;
                arList = new ArrayList();
                while ((thisLine = myInput.readLine()) != null)
                {
                 al = new ArrayList();
                 String strar[] = thisLine.split(",");
                 for(int j=0;j<strar.length;j++)
                 {
                 al.add(strar[j]);
                 }
                 arList.add(al);
                 System.out.println();
                 i++;
                } 

                try
                {
                 HSSFWorkbook hwb = new HSSFWorkbook();
                 HSSFSheet sheet = hwb.createSheet("new sheet");
                  for(int k=0;k<arList.size();k++)
                  {
                   ArrayList ardata = (ArrayList)arList.get(k);
                   HSSFRow row = sheet.createRow((short) 0+k);
                   for(int p=0;p<ardata.size();p++)
                   {
                    HSSFCell cell = row.createCell((short) p);
                    String data = ardata.get(p).toString();
                    if(data.startsWith("=")){
                     cell.setCellType(Cell.CELL_TYPE_STRING);
                     data=data.replaceAll("\"", "");
                     data=data.replaceAll("=", "");
                     cell.setCellValue(data);
                    }else if(data.startsWith("\"")){
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(data);
                    }else{
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                        cell.setCellValue(data);
                    }
                    //*/
                 //   cell.setCellValue(ardata.get(p).toString());
                   }
                   //System.out.println();
                  } 
                 FileOutputStream fileOut = new FileOutputStream("C:\\Brokerage\\outputabc.xls");
                 hwb.write(fileOut);
                 fileOut.close();
                // System.out.println("Your excel file has been generated");
                } catch ( Exception ex ) {
                     ex.printStackTrace();
                } //main method end

            }

请大家告诉我如何将文件存储在字节数组中 好吧,我不希望将转换后的文件 .xls 保存在我的本地计算机 C 驱动器上直接

【问题讨论】:

  • 所以您想将文件写入 RAM 而不是磁盘?你可以用 ByteArrayOutputStream
  • @SpiderPig 非常感谢您明白了这一点,请您详细解释一下,请您更正我的上述代码并进行更改,这将有助于我掌握这些更改

标签: java file bytearray


【解决方案1】:

您可以使用 ByteArrayOutputStream 将数据保存到字节数组中,然后使用 ByteArrayInputStream 将该数据传递给 HSSFWorkbook 构造函数。

例如

public static byte[] convertcsvtoexcel(String filepath) throws IOException {
  ...
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  hwb.write(out);
  return out.toByteArray();
}

byte[] xlsData = convertcsvtoexcel(filename);
HSSFWorkbook workbook = new HSSFWorkbook(new ByteArrayInputStream(xlsData));

但也许你甚至不需要这样做。相反,convertcsvtoexcel 方法可以只返回 hwb。为什么要将hwb 工作簿转换为字节数组然后再转换回来?似乎没有必要。

【讨论】:

  • @SPiferPIg 的回答很好我不希望将转换后的文件 .xls 保存在我的本地计算机 C 驱动器上动态文件直接传递给文件输入流本身
猜你喜欢
  • 2021-07-24
  • 2011-12-20
  • 1970-01-01
  • 2021-05-25
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多