zoukankan      html  css  js  c++  java
  • 基础知识之----------IO流(2)

    1、字符字节流的转换

        public static void main(String[] args) throws IOException {
            InputStream in=System.in;
            InputStreamReader isr=new InputStreamReader(in);
            //字符流
            BufferedReader br=new BufferedReader(isr);
            String line=null;
            while ((line=br.readLine())!=null){
                if("over".equals(line))
                    break;
                System.out.println(line.toUpperCase());
            }
        }
    View Code

    OutputStreamWriter的子类有FileWriter。FileWriter操作文本文件。

    键盘录入的简写

    BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
           BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
           BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
           String line=null;
            while ((line=bufr.readLine())!=null){
                if("over".equals(line))
                    break;
                bufw.write(line.toUpperCase());
                bufw.newLine();
                bufw.flush();

     System的in和out对象只有一个。如果关闭就无法再打开。而且in和out会随着系统的关闭而关闭,所以不需要手动的去关闭这两个对象。

      字符本身来自于字节,而由于字符全都是文本因此转换为字符流比较好操作。  

      需求:将键盘录入的数据写入到一个文件中。

     代码:

      

        public static void main(String[] args) throws IOException {
           BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
           BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d://dem.txt")));
           String line=null;
            while ((line=bufr.readLine())!=null){
                if("over".equals(line))
                    break;
                bufw.write(line.toUpperCase());
                bufw.newLine();
                bufw.flush();
            }
    View Code

      需求2:将文本文件内容输出到控制台

      

        public static void main(String[] args) throws IOException {
           BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("d://dem.txt")));
           BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
           String line=null;
            while ((line=bufr.readLine())!=null){
                if("over".equals(line))
                    break;
                bufw.write(line.toUpperCase());
                bufw.newLine();
                bufw.flush();
            }
        }

     以上是为了感受流的规律。

      

    2、流操作的基本规律

      InputStreamReader:字节到字符的桥梁。解码

      OutputStreamWriter:字符到字节的桥梁。编码

     流的操作规律:

      之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。

      如果想知道开发使用那些对象,需要知道四个明确。

    (1)明确源和目的(汇)

        源:InputStream       Reader

        目的:OutputStream   Writer

    (2)明确数据是否是纯文本数据

        源:是纯文本:Reader

          否:InputStream

        目的:是纯文本Writer

          否:OutputStream

      到这里,就可以明确需求中具体要使用哪个体系。

    (3)明确具体的设备

        源设备:

            硬盘:File

            键盘:System.in

            内存:数组

            网络:Socket流

        目的设备:

            硬盘:File

            控制台:System.out

            内存:数组

            网络:Socket流

    (4)是否需要其他额外功能

        1,是否需要高效(缓冲区)

          是,加buffer

    3、转换流的编码解码

      需求:将一个中文字符串数据按照指定的编码表写入到一个文本文件中。

      字符串默认使用的是系统的系统语言文本。

      一个中文两个字节,任何java识别的字符数据都是UNICODE码表,但是字符串是GBK本地默认码表。

      UTF-8国际标准规范的码表。

      FileWriter使用系统默认的码表。

      OutputStreamWriter可以使用指定的字符集,将要写入流中的字符编码成字节。

      

    OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("dem.txt"));

    等同于

      

    FileWriter fw=new FileWriter("");  //封装的就是OutputStreamWriter

    指定编码表

      

     OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("dem1.txt"),"UTF-8");

      FileWriter其实就是转换流指定了本机默认码表的体现。而且这个转换流的子类对象,可以方便操作文本文件。

      简单说就是  操作文件的字节流+本机默认的编码表。

      这是按照默认码表来操作文件的便捷类。

      

        public static void main(String[] args) throws IOException {
    
            //如果操作文本文件需要明确具体的编码。FileWriter就不行了,必须使用转换流。
            //UTF-8对于中文来讲是使用了三个字节来表示的,GBK是两个字节,当读取一个UTF-8的文本文件就会只去读文字的前两个字节去查码表。
    
            InputStreamReader isr=new InputStreamReader(new FileInputStream("dem.txt"),"utf-8");
            char[] buf=new char[10];
    
            int len=isr.read(buf);
    
            String str=new String(buf,0,len);
    
            System.out.println(str);
    
            isr.close();
            }

      一般出现中文乱码都是其他编码的使用了gbk来解码了。

      如果gbk文本文件使用utf-8来解码,就会出现??未知的乱码。

    1         /**既然需求中已经明确了指定编码表的动作。
    2          * 那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表
    3          * 只能使用其父类。outputStreamWriter
    4          * outputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该对象应该是FileOutputStream
    5          * 什么时候使用转换流呢?
    6          * 1、源或者目的对应的设备是字节流,但是操作的是文本数据,可以使用转换作为桥梁
    7          * 提高对文本操作的便捷
    8          * 2、一旦操作文本设计到具体的指定编码表时,必须使用转换流。
    9         */

    4、File类构造函数&字段

      io流只能操作设备上的数据,不能操作文件夹、文件名和修改文件属性。

      操作这些需要一个特殊的对象。File文件对象。

      File

      (1)将文件或者文件夹封装成对象。

      (2)方便对文件与文件夹的属性信息进行操作。

      (3)File对象可以作为参数传递给流的构造函数。

      File类是用来封装文件或者文件夹的,所以File在new的时候必须给到一个文件或者文件夹的名称。

      File的构造函数三种

      

        public static void constructorDemo() {
            //可以将一个已存在的,或者不存在的文件或者目录封装成File对象
            File file=new File("d:\a.txt");
            //
            File file1=new File("d:\","b.txt");
    
            File f=new File("d:\");
    
            File file2=new File(f,"c.txt");
        }

    系统分割符

            File file=new File("d:"+System.getProperty("file.separator")+"cs.txt");
            File file1=new File("d:"+File.separator+"a.txt");

      pathSeparatorChar与系统路径有关的路径分隔符。在WINDOWS系统上是";"不是冒号噢

    File对象常见功能-----获取

      常用功能

        public static void main(String[] args) {
            /*
             * File对象的常见方法
             * 1、获取。
             *       1.1 获取文件名称
             *       1.2 获取文件路径
             *       1.3 获取文件大小
             *       1.4 获取文件的修改时间
             */
            getDemo();
    
        }
    
        public static void getDemo() {
            File file = new File("a.txt");
    
            String name = file.getName();
    
            String path = file.getPath();
    
            String realPath=file.getAbsolutePath();
    
            long len=file.length();
    
            long time = file.lastModified();
    
            Date date=new Date(time);
    
            DateFormat dateFormat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
    
            String str_time=dateFormat.format(date);
    
            System.out.println(len);
            System.out.println(str_time);
        }
    View Code

    File对象常见功能-----创建和删除

      

     /*
            * 和输出流不一样,如果文件不存在,则创建,如果文件存在,则不创建
            */
            File file = new File("d:\file1");
    
    /*//        boolean b = file.createNewFile();
    //
    //        System.out.println("b="+b);*/
            //创建文件夹
    //        boolean b = file.mkdir();
            
            System.out.println("b="+b);

    mkdirs创建多级目录。

      

    File常见功能----判断

      (1)判断文件是否存在

      file.exists();

      (2)是否是文件

    file.isFile()

       (3)是否是文件夹

    file.isDirectory()

      

    系统根目录和容量获取

      遍历系统根目录

      

            File[] files = File.listRoots();
    
            for (File file : files) {
    
                System.out.println(file);

      获取磁盘空间

      

            File file=new File("d:\");
            //磁盘剩余空间
            System.out.println(file.getFreeSpace());
            //磁盘总空间
            System.out.println(file.getTotalSpace());
            //返回此抽象路径名指定的分区上可用于虚拟机的字节数
            System.out.println(file.getUsableSpace());

    File常见功能----获取目录内容

      遍历d盘 当前目录下所有的文件和文件夹名称,并包含着系统隐藏文件名称。调用list方法的file对象中,封装的必须是目录否则会发生空指针异常。

      如果访问的 系统级目录也会发生空指针异常。

      如果目录存在但是没有内容,会返回一个数组,但是长度为0

            File file=new File("d:\");
            String[] list = file.list();
            for(String name:list){
                System.out.println(name);
            }

      

    File常见功能----过滤器

      例如:只需要某个目录下以.txt结尾的文件。

      list(FilenameFilter filter)

       

    public class FilterByJava implements FilenameFilter {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".txt");
        }
        public  static void listDemo2(){
    
            File dir=new File("c:\");
            //底层,先list将所有内容都取出来到数组。然后遍历数组看是否符合创建的FilenameFilter.accept(dir,name); dir是目录,name是名称
    //        只要返回的是true就存起来到names数组中
            String[] names=dir.list(new FilterByJava());
    
            for(String name:names){
                System.out.println(name);
            }
        }

      file的list方法只能获取目录下的文件名称。而listFiles()方法可以拿到当前目录下所有文件对象。

       

    public class FilterByHidden implements FileFilter {
    
    
        @Override
        public boolean accept(File pathname) {
    
            return pathname.isHidden();
        }
    }
        public static void listDemo3() {
    
            File dir=new File("c:\");
    
            File [] files=dir.listFiles(new FilterByHidden());
    
            for(File file:files ){
                System.out.println(file);
            }
        }

     后缀

    public class SuffixFilter implements FilenameFilter {
    
        private String suffix;
    
        public SuffixFilter(String suffix){
            super();
            this.suffix=suffix;
        }
    
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(suffix);
        }
    }
        public  static void listDemo2(){
    
            File dir=new File("c:\");
            //底层,先list将所有内容都取出来到数组。然后遍历数组看是否符合创建的FilenameFilter.accept(dir,name); dir是目录,name是名称
    //        只要返回的是true就存起来到names数组中
            String[] names=dir.list(new SuffixFilter(".txt"));
    
            for(String name:names){
                System.out.println(name);
            }
        }

      

    坚持就是胜利
  • 相关阅读:
    List<int>转化为逗号链接的字符串
    分页的总页数算法
    高性能SQLServer分页语句
    webconfig中的&符号问题解决
    检测SQLServer复制订阅进度
    jQuery自定义数组操作类(类似于List集合的增删改查)
    解决jquery绑定click事件出现点击一次执行两次问题
    IdentityServer4登陆中心
    AES加密解密通用版Object-C / C# / JAVA
    T-SQL 基本语法
  • 原文地址:https://www.cnblogs.com/xiaotieblog/p/8471831.html
Copyright © 2011-2022 走看看