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. 额。希望对你有帮助
追问谢谢您的耐心解答~
追答不客气。呵呵
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的序列当比特序列写入二进制文档?
谢谢您的回答!
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字符串当二进制写入文件的主要内容,如果未能解决你的问题,请参考以下文章