java把01字符串当二进制写入文件

有一01字符串,要将它写入文件,0就当二进制的0,1就当二进制的1。我用outputstream的write方法逐个写入后发现0写的是0x00,1写的0x01。怎样将1就写为二进制的1呢,0就是二进制的0呢?
将一串“01”字符串写入二进制的文件,即每个"0"和"1"分别只占用1 bit的空间,而不是当作普通字符那样占用1 Byte。谢谢!

outputstream的write方法要求传入的时byte[]数组,如果你的01字串是String类型的的话,需要将其转换成byte[],具体办法可以看下面的例子:

public static void main( String[] args )

    {

        System.out.println( "Hello World!" );

        String text = "10101010010001100111001";

        File f = new File("/Users/hujia/Documents/test.txt");

        OutputStream os = null;

try {

os = new FileOutputStream(f);

os.write(text.getBytes());

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

os.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

        

        

    }

追问

您好!我是想写01的比特序列到一个二进制文件中去,目的不是写01字符串。谢谢您的回答!

追答public void write()  
    {  
        String fileName="c:/test.dat";  
        int value0=255;  
        int value1=0;  
        int value2=-1;  
        try  
        {  
            //将DataOutputStream与FileOutputStream连接可输出不同类型的数据  
            //FileOutputStream类的构造函数负责打开文件test.dat,如果文件不存在,  
            //则创建一个新的文件,如果文件已存在则用新创建的文件代替。然后FileOutputStream  
            //类的对象与一个DataOutputStream对象连接,DataOutputStream类具有写  
            //各种数据类型的方法。  
            DataOutputStream out=new DataOutputStream(new FileOutputStream(fileName));  
            out.writeInt(value0);  
            out.writeInt(value1);  
            out.writeInt(value2);  
            out.close();  
        } catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }

我不知道你要输出的文件格式是什么,如果是dat类型的二进制文件,可以用上面的方法输出,另外如果是要对象到二进制文件,可以让对象实现Serializable接口,然后用ObjectOutputStream将对象输出

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-15
花了40分钟专门为你写的。希望采纳

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class a {

public static void main( String[] args )
{
int i=0;
String text = "10101010010001100111001";
char num1="1".charAt(0);
int lenSrc=text.length();
int len01=lenSrc/8;
char tmp;
byte[] target=new byte[len01];
//首先,我初始化target数组,使得其所有bit均为二进制0
for( i=0;i<len01;i++){
target[i]=(byte)0;
;}
//而后我比较你写的string的每个位置的值,当这个位置是1的话,我就把其在byte数组中其对应的位置用按位或来改写成bit1
for( i=0;i<lenSrc;i++){
tmp=text.charAt(i);
if(tmp==num1){
if(i%8==0){ target[i/8]= (byte) ((int)target[i/8] | 0x80); }
if(i%8==1){ target[i/8]= (byte) ((int)target[i/8] | 0x40); }
if(i%8==2){ target[i/8]= (byte) ((int)target[i/8] | 0x20); }
if(i%8==3){ target[i/8]= (byte) ((int)target[i/8] | 0x10); }
if(i%8==4){ target[i/8]= (byte) ((int)target[i/8] | 0x8); }
if(i%8==5){ target[i/8]= (byte) ((int)target[i/8] | 0x4); }
if(i%8==6){ target[i/8]= (byte) ((int)target[i/8] | 0x2); }
if(i%8==7){ target[i/8]= (byte) ((int)target[i/8] | 0x1); }
}

};
//这样,就完成了二进制写法的string到byte[]二进制的转换.成为byte数组target
//接下来就是存储了。存储的时候你可以直接按照二进制原来的格式存储。
File f = new File("/Users/targetFile.txt");
OutputStream os = null;
try {
os = new FileOutputStream(f);
os.write(target);
} catch (Exception e) {}finally{try { os.close();} catch (IOException e) {}

}

//写入完毕
}
}追问

您好!请问i%8=1,2,3,6时报错
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
怎么解决?
发现问题了:您的text = "10101010010001100111001";字符个数不是8的倍数。修改text为8的倍数就ok~不过不是8的倍数就不行了。

追答

额。不过你要记住一点是。世界上所有的操作系统都只支持8bit,也就是一字节存储。不存在只存储1bit的情况。你要是想要8的倍数也很简单,但是要在两个方面做选择,要么在string后面补0,要么在存储的最后一字节尾部做一下补0或者补1之类的,不过相当于在string后面补0. 额。希望对你有帮助

追问

谢谢您的耐心解答~

追答

    不客气。呵呵

本回答被提问者采纳
第2个回答  2014-05-04
OutputStream.write(Integer.toBinaryString(0).getBytes());
OutputStream.write(Integer.toBinaryString(1).getBytes());

toBinaryString
public static String toBinaryString(int i)

以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
如果参数为负,该无符号整数值为参数加上 232;否则等于该参数。将该值转换为二进制(基数 2)形式的无前导 0 的 ASCII 数字字符串。如果无符号数的大小为零,则用一个零字符 '0' (’\u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。字符 '0' ('\u0030') 和 '1' ('\u0031') 被用作二进制数字。

参数:
i - 要转换为字符串的整数。
返回:
用二进制(基数 2)参数表示的无符号整数值的字符串表示形式。
从以下版本开始:
JDK1.0.2追问

您好!我需要将一串“01”的数据写入文件,即每个"0"和"1"分别只占用1 bit的空间,而不是当作普通字符那样占用1 Byte。

第3个回答  2014-05-04
package write;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

public class WriteBinary {

private Random random = new Random();
private String path = null;
private File file = null;
private OutputStream output = null;
// 需要写入的字节数
private final int MAX_LENGTH = 100;

public WriteBinary(String path) {
this.path = path;
}

private void wirteFile() {
try {
File dir = new File(path.substring(0, path.lastIndexOf("\\")));
if (!dir.exists()) {
dir.mkdirs();
}
file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
output = new FileOutputStream(file);
StringBuffer buf = new StringBuffer();
for (int i = 0; i < MAX_LENGTH; i++) {
buf.append(String.valueOf(random.nextInt(2)));
}
byte[] b = buf.toString().getBytes();
output.write(b);
output.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

public static void main(String[] args) {

new WriteBinary("D:\\documents\\1.txt").wirteFile();
}
}

有不懂欢迎追问

追问

您好!
这是创建了一个大小100的随机的01序列写入文本文件。请问如何将01的序列当比特序列写入二进制文档?

第4个回答  2014-05-04
比如你的string是“010111001”,就直接原样写入文件就好了,文件打开还是01,纯文本的话,可以用FileWriter。。。给个采纳??自学进5044群5871追问

谢谢您的回答!