文件为0的0和1以及1的字符串

时间:2016-09-24 20:38:15

标签: java string binary byte bits

我正在开发一个Huffman java应用程序,我差不多完成了。我有一个问题。我需要保存一些字符串:" 101011101010"到一个文件。当我用当前代码保存它时,它将其保存为每0或1占用1个字节的字符。我非常确定可以将每个0/1保存为一点。

我已经用BitSet和Integer.valueOf尝试了一些东西,但是我无法让它们工作。这是我目前的代码:

FileOutputStream fos = new FileOutputStream("encoded.bin");
fos.write(encoded.getBytes());
fos.close();

编码'是一个字符串,可以像:" 0101011101"。 如果我尝试将其保存为整数,则将删除前导0。

提前致谢!

编辑:霍夫曼是一种压缩方法,所以输出的文件应该尽可能小。

3 个答案:

答案 0 :(得分:3)

我想我找到了答案。我使用以下代码将1&0和1和0放在一个BitSet中:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.*;


public class BankRecords extends Client{
//Create objects for processing data
//private static int count;
static BankRecords[] obj=new BankRecords[600];
static List<List<String>> array = new ArrayList<List<String>>();
@Override
void readData() {
    // TODO Auto-generated method stub
    String line=" ";
    //int i=0;

    //try with resources statement
    try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){

        while((line=br.readLine()) != null) //read from file
        {   
            array.add(Arrays.asList(line.split(",")));
            //check data
            //count++;
            //System.out.println(array.get(i++));
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    processData();
}
@Override
void processData() {
    // TODO Auto-generated method stub

    int idx=0;
    for(List<String> bankData: array)
    {

        obj[idx]= new BankRecords();
        obj[idx].setId(bankData.get(0));
        obj[idx].setAge(Integer.parseInt(bankData.get(1)));
        obj[idx].setSex(bankData.get(2));
        obj[idx].setRegion(bankData.get(3));
        obj[idx].setIncome(Double.parseDouble(bankData.get(4)));
        obj[idx].setMarried(bankData.get(5));
        obj[idx].setChild(Integer.parseInt(bankData.get(6)));
        obj[idx].setCar(bankData.get(7));
        obj[idx].setSact(bankData.get(8));
        obj[idx].setCact(bankData.get(9));
        obj[idx].setMort(bankData.get(10));
        obj[idx].setPep(bankData.get(11));


        idx++;

        //System.out.println(obj[idx].getId());
        }

    printData();
}





@Override
void printData() {

    //Printing First 25 ID, age, sex, region, income and mortgage
    System.out.println("ID\t\tAGE\t\tSEX\t\tREGION\t\tINCOME\t\tMORTGAGE\n");
    for(int i=0;i<25;i++){

        String s=String.format("%s\t\t%s\t\t%s\t\t%-10s\t%8.2f\t%2s", obj[i].getId(),obj[i].getAge(),obj[i].getSex(),obj[i].getRegion(),obj[i].getIncome(),obj[i].getMort());
        System.out.println(s);
    }
}
public String getId() {
    return id;
}




public void setId(String id) {
    this.id = id;
}




public int getAge() {
    return age;
}




public void setAge(int age) {
    this.age = age;
}




public String getSex() {
    return sex;
}




public void setSex(String sex) {
    this.sex = sex;
}




public String getRegion() {
    return region;
}




public void setRegion(String region) {
    this.region = region;
}




public double getIncome() {
    return income;
}




public void setIncome(double income) {
    this.income = income;
}




public String isMarried() {
    return married;
}




public void setMarried(String married) {
    this.married = married;
}




public int getChild() {
    return child;
}




public void setChild(int child) {
    this.child = child;
}




public String getCar() {
    return car;
}




public void setCar(String car) {
    this.car = car;
}




public String getSact() {
    return sact;
}




public void setSact(String sact) {
    this.sact = sact;
}




public String getCact() {
    return cact;
}




public void setCact(String cact) {
    this.cact = cact;
}




public String getMort() {
    return mort;
}




public void setMort(String mort) {
    this.mort = mort;
}




public String getPep() {
    return pep;
}




public void setPep(String pep) {
    this.pep = pep;
}




public static void main(String[] args) {
    // TODO Auto-generated method stub
    BankRecords bnk= new BankRecords();
    bnk.readData();
}

之后我使用BitSet bitSet = new BitSet(encoded.length()); int bitcounter = 0; for(Character c : encoded.toCharArray()) { if(c.equals('1')) { bitSet.set(bitcounter); } bitcounter++; } 将其保存到文件中 当我想再次阅读时,我使用bitSet.toByteArray()将其转换回bitset。然后我循环遍历bitset:

BitSet.valueOf(bitSet.toByteArray())

感谢所有帮助过我的人。

答案 1 :(得分:0)

二进制文件仅限于以8的倍数存储位。您可以通过将字符串切换为8位块,使用Byte.parseByte(eightCharString, 2)将它们转换为字节并将它们添加到字节数组来解决此问题:

  • 通过将位串的长度除以8来计算字节数组的长度
  • 分配所需长度的字节数组
  • 运行一个循环,该循环在表示八倍
  • 倍数的位置处从字符串中获取子串
  • 解析每个块,并将结果放入相应的字节
  • 在字节数组
  • 上调用fos.write()

答案 2 :(得分:0)

试试这个。

String encoded = "0101011101";
FileOutputStream fos = new FileOutputStream("encoded.bin");
String s = encoded + "00000000".substring(encoded.length() % 8);
for (int i = 0, len = s.length(); i < len; i += 8)
    fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2));
fos.close();