字节数组无法正确打印到文件

时间:2015-04-23 02:47:51

标签: java file split bytearray

我正在创建一个程序,旨在接收 n 分割数量并将文件拆分为该数量的子文件。在我的 SplitFile.java 中,我正在读取一个文件,传递一个子串数组,显示应该在每个拆​​分文件中的文本。然后我将字符串转换为字节数组并将字节数组写入拆分文件,但我正在创建的每个文件都输出只是略有不同的内容。

SplitFile.java

import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;

public class SplitFile 
{
    int numberOfSplits = 1;
    File file;
    String[] parts = new String[5];

    public SplitFile(File file,int numberOfSplits)
    {
        this.file = file;
        this.numberOfSplits = numberOfSplits;
    }

    public void FileSplitter() throws IOException
    {
        FileInputStream fis = new FileInputStream(file);
        String fileText = readFile();

        if(numberOfSplits == 2)
        {
            int mid = fileText.length() / 2;

            parts[0] = fileText.substring(0, mid);
            parts[1] = fileText.substring(mid);
        }
        else if(numberOfSplits == 3)
        {
            int third = fileText.length() / 3;
            int secondThird = third + third;

            parts[0] = fileText.substring(0, third);
            parts[1] = fileText.substring(third, secondThird);
            parts[2] = fileText.substring(secondThird);
        }

        for(int i = 1; i <= numberOfSplits; i++)
        {
            BufferedInputStream bis = new BufferedInputStream(new fileInputStream(file));
            FileOutputStream out;
            String name = file.getName();

            byte[] b = parts[i - 1].getBytes(Charset.forName("UTF-8"));
            int temp = 0;

            while((temp = bis.read(b)) > 0);
            {
                File newFile = new File(name + " " + i + ".txt");
                newFile.createNewFile();
                out = new FileOutputStream(newFile);
                out.write(b, 0, temp); // Writes to the file
                out.close();
                temp = 0;
            }

        }

    }

    public String readFile() throws IOException
    {
        BufferedReader br = new BufferedReader(new FileReader(file));

        try 
        {
            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) 
            {
                sb.append(line);
                sb.append("\n");
                line = br.readLine();
            }

            return sb.toString();
        }
        finally 
        {
            br.close();
        }
    }
}

如果我传入2作为我想要的分割量,它不会在中间分割,文件1是前半部分,文件2是后半部分,而是给出文本文件的结尾两个文件。我的问题似乎在这里:

while((temp = bis.read(b)) > 0);
{
    File newFile = new File(name + " " + i + ".txt");
    newFile.createNewFile();
    out = new FileOutputStream(newFile);
    out.write(b, 0, temp); // Writes to the file
    out.close();
    temp = 0;
}

我将在此处使用的示例文件是此文件:

MYFILE.TXT

  

ABCDEFGHIJKLMNOPQRSTUVWXYZ

它分为两个文件,如下所示:

myFile.txt 1

  

nopqrstuvqxyz

myFile.txt 2

  

opqrstuvqxyz

对问题是什么有任何想法?

1 个答案:

答案 0 :(得分:1)

  1. 在您的代码中,您在whilte循环中定义File newFile = new File(name + " " + i + ".txt");out = new FileOutputStream(newFile);,这是不正确的。
  2. while((temp = bis.read(b)) > 0);这里没有分号=。=“
  3. 您的代码中有很多错误 我将更改您的代码,如:

            File newFile = new File(name + " " + i + ".txt");
            newFile.createNewFile();
            out = new FileOutputStream(newFile);
            out.write(b); // Writes to the file
            out.flush();
            out.close();
    
  4. 如果您需要运行所需的代码,请

            for (int i = 1; i <= numberOfSplits; i++) {
                String name = file.getName();
                byte[] b = parts[i - 1].getBytes(Charset.forName("UTF-8"));
                ByteArrayInputStream bis = new ByteArrayInputStream(b);
    
                int temp = 0;
                File newFile = new File(name + " " + i + ".txt");
                newFile.createNewFile();
                FileOutputStream out = new FileOutputStream(newFile);                    
                while ((temp = bis.read()) > 0)
                {
                    out.write(temp); // Writes to the file
                }
                out.flush();
                out.close();
            }