知识点
文本文件与二进制文件
文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等,二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
文本文件是字符的序列构成的,二进制文件是由位的序列构成的。例如,十进制整数199在文本文件中是以三个字符序列‘1’、‘9’、‘9’来存储的,而在二进制文件中它是以byte类型的值C7存储的。
文本文件依赖于主机所使用的编码系统,所以将一个文本文件从一台机器转到另一台机器上时,如果两台机器的编码不同,可能会出现错误
当字节序列按某种编码时,如果这个时候想把字节序列转换为字符串,则也得用这种编码,否则则会乱码。文本文件,就是字节序列,可以是任意编码的字节序列。在中文机器上直接创建文本文件,该文本文件只认识ansi编码。但文本文件本身可以放各种编码。 ##代码
public class Textfile {
public void out(String name)throws IOException
{
File file=new File(name);
if(!file.exists())
file.createNewFile();
FileOutputStream out=new FileOutputStream(file);
OutputStreamWriter o=new OutputStreamWriter(out,"utf-8");
System.out.println("将字符串以默认编码存入文本文件成功");
String st="1234567890";
o.write(st, 0, st.length());
o.close();
}
public void into(File file1)throws IOException
{
if(!file1.exists())
throw new IllegalArgumentException("文件不存在
");
if(!file1.isFile())
throw new IllegalArgumentException("不是文件
");
FileInputStream in=new FileInputStream(file1);
byte[]bytes=new byte[20];
in.read(bytes);
String s=new String(bytes);
System.out.println("将字符串从文本文件中读取,显示(字符串)" );
System.out.println(s);
}
public static void log(Object... obs){
for(Object o: obs){
System.out.print(o);
System.out.print(" ");
}
System.out.print("
");
}
public void intoBinary(File file1) throws IOException{
if(!file1.exists())
throw new IllegalArgumentException("文件不存在
");
if(!file1.isFile())
throw new IllegalArgumentException("不是文件
");
FileInputStream inn=new FileInputStream(file1);
InputStreamReader in=new InputStreamReader(inn);
char[]chars=new char[20];
int b=in.read(chars,0,chars.length);
String s=String.valueOf(chars,0,b);
Integer ss=Integer.parseInt(s);
int a=ss;
System.out.println("将字符串从文本文件读出,转化为数字(int)");
System.out.println(a);
Textfile textfile=new Textfile();
textfile.outBinary(a);
}
public void outBinary(int c)throws IOException
{
File file=new File("hello2.txt");
if(!file.exists())
file.createNewFile();
DataOutputStream d=new DataOutputStream(new FileOutputStream(file));
System.out.println("将数字(int)写入二进制文件中");
d.writeInt(c);
DataInputStream r=new DataInputStream(new FileInputStream(file));
int t=r.readInt();
System.out.println(t);
System.out.println("将读到的数字1234567890转换为字符串");
String s=String.valueOf(t);
System.out.println(t);
System.out.println("写入到文本文件中");
Textfile textfile=new Textfile();
textfile.out("hello3.txt");
}
public static void main (String[] args) throws IOException{
Textfile input=new Textfile();
input.out("hello1.txt");
input.into(new File("hello1.txt"));
input.intoBinary(new File("hello1.txt"));
}
}
运行结果
问题解决
定义了一个字符串数组,它默认情况下会是/u000..一些奇怪的东西,这时候如果如果转化为字符串的时候,这些东西也会同时加在字符串后面,而.trim()只能去掉末尾的空格。然后这时候如果再使用Integer.parseInt(s)时则会报错。
解决方案一:
char[]chars=new char[20];
int b=in.read(chars,0,chars.length);
String s=String.valueOf(chars,0,b);
Integer ss=Integer.parseInt(s);
解决方案二:
将字符串中冗余的那部分像替代空格一样掉替代。
现在还存在的问题
虽然百度了,看完百度。但是在一些问题的理解上依然存在问题。
- 我发现我如果将1234567890以整型的形式存入,然后可以使用readInt方式读取,但是我如果以字符串的形式存入,这时候再用readInt读取的话则会是乱码,反过来也是。存在的疑惑是,不是同样都是存在.txt文件中吗,那应该也是byte byte byte形式,那读的时候为什么会不一样
- 在将1234567890以整型的形式存入.txt中,打开.txt文件发现里面是乱码,但是我用readInt读的话可以读到这个数,这是什么原因
- 虽然百度了文本文件与二进制文件的区别,也有了理解,但是不懂的是,把一个数据存到文本文件与存到二进制文件中,最后不是都是一个.txt文件,不是都有编码吗?
- 直观上理解文本文件与二进制文件的区别
- 熟悉了字符流与字节流
- 并在中途调试的过程中注意到了一些小细节