• 输入输出练习


    知识点

    文本文件与二进制文件

    文本文件是基于字符编码的文件,常见的编码有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文件,不是都有编码吗?
    ##收获
    • 直观上理解文本文件与二进制文件的区别
    • 熟悉了字符流与字节流
    • 并在中途调试的过程中注意到了一些小细节
  • 相关阅读:
    使用Navicat for Oracle新建表空间、用户及权限赋予---来自烂泥
    NonAction与ChildActionOnly
    C# Monitor的Wait和Pulse方法使用详解
    机械键盘简介
    【转载】 中小型研发团队架构实践
    BinaryReader 自己写序列化
    显式接口实现
    AssemblyVersion和AssemblyFileVersion的区别
    自定义设置程序集版本重定向和程序集位置的信息
    单例模式中的属性实现
  • 原文地址:https://www.cnblogs.com/crystallin/p/5407827.html
Copyright © 2020-2023  润新知