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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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将对象输出

参考技术A 花了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) finallytry 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. 额。希望对你有帮助

追问

谢谢您的耐心解答~

追答

    不客气。呵呵

本回答被提问者采纳
参考技术B 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。

参考技术C 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的序列当比特序列写入二进制文档?

参考技术D 比如你的string是“010111001”,就直接原样写入文件就好了,文件打开还是01,纯文本的话,可以用FileWriter。。。给个采纳??自学进5044群5871追问

谢谢您的回答!

java读取文件:文本文件

  一般使用串行方式读出或者写入文件。总的来说,使用输入流把文件内容读入内存,使用输出流把内存中的信息写出到文件。这些类位于java.io包下。
输入和输出的类和方法往往是对应的

文本文件

先了解如何读写文本文件,然后看如何读写二进制文件。jaVa.ioReader用来读取字符,它的子类FileReader用来读取文本文件。
FileReader打开指定路径下的文件。文件的路径分隔符可以用“\\”或者“/”表示。

“\\”是Windows风格的写法,因为字符串中的特殊字符要转义,所以用两个斜线表示一个斜线。

FileReader fr = new FileReader ("c: Wautoexec.bat"); //打幵文本文件

“/”是Linux风格的路径写法,因为不需要转义,所以正斜线只需要写一个就可以了。

FileReader fr = new FileReader ("c:/autoexec.bat"); //打开文本文件

如果有一堆砖要搬,一次取不完,不会一次只拿一块砖,会尽量多拿几块。如果有很多内
容要读,不会一次只读一个字节,而是一次尽量多读一些字节到缓存。

FileReader fr = new FileReader ("c:/autoexec.bat"); //打开文本文件

 BufferedReader br = new BufferedReader (fr); //缓存读
 String line;
  while ((line = br .readLine ()) != null) { //按行读入文件
     System.out.println(line);
  }
  fr.close(); //关闭文本文件

输入流把数据从硬盘读入随机访问存储器(Random Access Memory,简称RAM)。可以
根据输入流构建BufferedReader,实现代码如下所示。

String fileName = "SDIC.txt"; //文件名
InputStream file = new FilelnputStream (new File (fileName)); //打开输入流
//缓存读入数据
BufferedReader in = new BufferedReader(new InputStreamReader(file,"GBK"));

for循环按行读入一个文件

String fileName = "SDIC.txt"; //文件名
InputStream file = new FilelnputStream (new File (fileName));"打开输入流
//缓存读入数据
BufferedReader in = new BufferedReader(new InputStreamReader(file,"GBK"));
String line = in.readLine();
while (line != null) {
System.out.println (line);
line = in.readLine();
}
in.close ();

一般来说,Writer是把内容立即写到硬盘。如果要多次调用write方法,则批量写入效率会
更高。类似于团购,团购的价格往往比单件购买的价格低。可以使用缓存加快文件写入速度。

//使用缺省的缓存大小
BufferedWriter bw - new BufferedWriter(new FileWriter(fileName));
bw.write (”Hello,China!"); //写入一个字符串
bw.write (”\n”); //写入换行符
bw.write("Hello,World!");
bw.close(); //把缓存中的内容写入文件

使用BufferedWriter写入数据时,最后需要调用BufferedWriter的close方法。如果不关闭
文件,可能导致缓存中的数据丢失,写入文件的数据不完整。

按指定编码写入文本的完整代码如下所示。

/*
     * 向文件写入字符串
     * 
     * @param content 字符串
     * 
     * @param fileName 文件名
     * 
     * @param encoding 编码
     */
    public static void writeToFile(String content, String fileName,
            String encoding) {
        try {
            FileOutputStream fos = new File0utputStream(fileName);
            OutputStreamWriter osw = new OutputStreamWriter(fos, encoding);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(content);
            bw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        }

    }

如果黑板上已经有字,可以选择抹去黑板上已有的字重新写,也可以在原来的文字后继续
写。如果一个文件已经存在,可以把新的内容追加写到最后,也可以从头写入新内容,也就是
覆盖写。FileWriter的构造方法区别于这两种写入方式。

//FileWriter 构造方法 .
FileWriter( String fileName, boolean mode) throws IOException

其中的mode = false表示覆盖写,mode = true表示追加写。为了避免冲突,在一个时刻只
能有一个线程写文件。

 

以上是关于java把01字符串当二进制写入文件的主要内容,如果未能解决你的问题,请参考以下文章

c# 将字符串以二进制形式写入文件

什么java类型可以写入BLOB类型中

C语言,字符串转成16进制或者二进制写入二进制文件

写入文本文件,二进制与 ascii

IO操作

Java中,怎样把一段文字写入一个文本文件中?