文本处理
一个文件在计算机内是以二进制的形式储存的。打开一个文件时,计算机会根据文件的类型对文件就行解析,最后得到了我们所看到的文字,图片,视频等。于是我就想,能不能在一个文件中随意加入一个字节使解析程序因这个字节的干扰而得不到正确的结果,甚至无法解析,来达到即使别人得到了文件也打不开的效果。
1.读取二进制数据流
为了能实现上面的目的,我于是打算先读取文件的二进制数据流。
public static byte[] fileToByte(String filepath) throws IOException
{
byte[] bytes = null;
FileInputStream fis = null;
try{
File file = new File(filepath);
fis = new FileInputStream(file);
bytes = new byte[(int) file.length()];
fis.read(bytes);
}catch(IOException e){
e.printStackTrace();
throw e;
}finally{
fis.close();
}
return bytes;
}
2.二进制文本打印
直接在main函数中用fileToByte,遍历打印返回值
public static void main(String args[]) throws IOException{
byte b[]=fileToByte("/storage/sdcard1/test.txt");
for(int i=0;i<b.length;i++)
{
System.out.println(b[i]);
}
}
可是
test.txt中内容:
你好!hi
__打印内容:
-28
-67
-96
-27
-91
-67
-17
-68
-127
104
105
10
__
发现英文部分可以显示字母十进制的ASCII码,但中文部分却是负数,原来是因为java中的byte范围是从-127到128,而中文字符的编码大于128。
要转为正数需要对字节进行0xff运算,0xff的二进制就是1111 1111,与正数运算保持不变,因为负数在计算机中保存的是补码,所以与0xff运算后就可以得到对应的正数。
于是在输出部分将代码进行修改
System.out.println(0xff & b[i]);
__输出效果:
228
189
160
229
165
189
239
188
129
104
105
10
__
最后将十进制转为二进制,然后格式化输出
代码
System.out.println(String.format("%08d",Integer.parseInt(Integer.toBinaryString(0xff & b[i]))));
__结果:
11100100
10111101
10100000
11100101
10100101
10111101
11101111
10111100
10000001
01101000
01101001
00001010
__
这样就实现了文本文件转二进制文件了。