知识点

文本文件与二进制文件

文本文件是基于字符编码的文件,常见的编码有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("文件不存在\n");
    if(!file1.isFile())
        throw new IllegalArgumentException("不是文件\n");
    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("\n");
}
public void intoBinary(File file1) throws IOException{

    if(!file1.exists())
        throw new IllegalArgumentException("文件不存在\n");
    if(!file1.isFile())
        throw new IllegalArgumentException("不是文件\n");
    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文件,不是都有编码吗?
##收获
  • 直观上理解文本文件与二进制文件的区别
  • 熟悉了字符流与字节流
  • 并在中途调试的过程中注意到了一些小细节