JAVA面试基础「建议收藏」

JAVA面试基础「建议收藏」JAVA面试部分重点内容目录JAVA面试部分重点内容五、输入输出流IO流  1.File类的常用方法?  2.说说IO流?  3.字节流的常用方法?  4.说说字符流?  5.说说缓冲流?  6.说说序列化和反序列化?五、输入输出流IO流  1.File类的常用方法?  java.io.File,使用该类的构造函数就可以创建文件对象,将硬盘中的一个具体的文件以Java对象的形式来表示。方法描述publicFile(Stringpathname)根据路径创建对象(是绝

大家好,又见面了,我是你们的朋友全栈君。

JAVA面试部分重点内容

五、输入输出流IO流

  1.File类的常用方法?

  java.io.File,使用该类的构造函数就可以创建文件对象,将硬盘中的一个具体的文件以 Java 对象的形式来表示。

方法 描述
public File(String pathname) 根据路径创建对象(是绝对路径)
public String getName() 获取文件名
public String getParent() 获取文件所在的目录
public File getParentFile() 获取文件所在目录对应的File对象
public String getPath() 获取文件路径
public boolean exists() 判断文件是否存在
public boolean isDirectory() 判断对象是否为目录
public boolean isFile() 判断对象是否为文件
public long length() 获取文件的大小
public boolean createNewFile() 根据当前对象创建新文件
public boolean delete() 删除对象
public boolean mkdir() 根据当前对象创建目录
public boolean renameTo(File file) 为已存在的对象重命名

  2.说说IO流?

  Input 输入流(将外部文件读入到 Java 程序中)

  Output 输出流(将 Java 程序中的数据输出到外部)

在这里插入图片描述

  Java 中的流有很多种不同的分类。

  • 按照方向分,输入流输出流
  • 按照单位分,可以分为字节流和 字符流(字节流是指每次处理数据以字节为单位,字符流是指每次处理数据以字符为单位)
  • 按照功能分,可以分为节点流(字节流)处理流(对节点流进行处理,生成其他类型的流)

  方法定义时的异常如果直接继承自 Exception,实际调用的时候需要手动处理(捕获异常/丢给虚拟机去处理);方法定义时的异常如果继承自 RuntimeException,调用的时候不需要处理。

  3.字节流的常用方法?

  InputStream 的常用方法

方法 描述
int read() 以字节为单位读取数据
int read(byte b[]) 将数据存入 byte 类型的数组中,返回数组中有效数据的长度
int read(byte b[],int off,int len) 将数据存入 byte 数组的指定区间内,返回数组长度
byte[ ] readAllBytes() 将所有数据存入 byte 数组并返回
int available() 返回当前数据流未读取的数据个数
void close() 关闭数据流

  FileInputStream是抽象类InputStream的实现类,构造函数可以接受File实例对象,但要保证文件存在。

  OutputStream的常用方法

方法 描述
void write(int b) 以字节为单位输出数据
void write(byte b[ ]) 将byte数组中的数据输出
void write(byte b[ ],int off,int len) 将byte数组中指定区间的数据输出
void close() 关闭数据流
void flush() 将缓冲流中的数据同步到输出流中

  FileOutputStream是抽象类OutputStream的实现类,构造方法可以接受File实例对象,文件不存在时,会创建文件。

  4.说说字符流?

  字节流是单位时间内处理一个字节的数据(输入+输出)

  字符流是单位时间内处理一个字符的数据(输入+输出)

  字符流:

  • 输入字符流 Reader
  • 输出字符流 Writer

   Reader是一个抽象类
在这里插入图片描述

  Closeable接口的作用:及时关闭资源,而不是让GC回收

  Readable 接口的作用:可以将数据以字符的形式读入到缓冲区
  InputStream(字节输入流) —> Reader(字符输入流)
在这里插入图片描述

  InputStreamReader 的功能是将字节输入流转换为字符输入流,是处理流

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;

public class Test { 
   
    public static void main(String[] args) throws Exception { 
   
        //字符流
        Reader reader = new FileReader("/Users/southwind/Desktop/test.txt");
        int temp = 0;
        System.out.println("*******字符流读取********");
        while ((temp = reader.read())!=-1){ 
   
            System.out.println(temp);
        }
        reader.close();

        //字节流
        InputStream inputStream = new FileInputStream("/Users/southwind/Desktop/test.txt");
        temp = 0;
        System.out.println("*******字节流读取********");
        while ((temp = inputStream.read())!=-1){ 
   
            System.out.println(temp);
        }
        inputStream.close();
    }
}
import java.io.FileReader;
import java.io.Reader;

public class Test2 { 
   
    public static void main(String[] args) throws Exception { 
   
        Reader reader = new FileReader("/Users/southwind/Desktop/test.txt");
        char[] chars = new char[8];
        int length = reader.read(chars);
        System.out.println("数据流的长度是"+length);
        System.out.println("遍历数组");
        for (char aChar : chars) { 
   
            System.out.println(aChar);
        }

    }
}

read() 返回的是 int ,直接将字符转成字节(1-1,1-3),每次读一个字节。

read(char[ ] chars) 返回的是 char 数组,直接就返回字符个数,不会转成字节的。

read(char[ ] chars, int off, int len):读len个字符,放到chars数组中off处。

  5.说说缓冲流?

  论是字节流还是字符流,使用的时候都会频繁访问硬盘,对硬盘是一种损伤,同时效率不高,如何解决?
  可以使用缓冲流,缓冲流自带缓冲区,可以一次性从硬盘中读取部分数据存入缓冲区,再写入内存,这样就可以有效减少对硬盘的直接访问。
在这里插入图片描述
  缓冲流属于处理流,如何来区分节点流和处理流?

  1、节点流使用的时候可以直接对接到文件对象 File

  2、处理流使用的时候不可以直接对接到文件对象 File,必须要建立在字节流的基础上才能创建。
在这里插入图片描述
  缓冲流又可以分为字节缓冲流和字符缓冲流,按照方向再细分,又可以分为字节输入缓冲流和字节输出缓冲流,以及字符输入缓冲流和字符输出缓冲流。
在这里插入图片描述
  字节输⼊缓冲流

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class Test { 
   
    public static void main(String[] args) throws Exception { 
   
        //1、创建节点流
        InputStream inputStream = new FileInputStream("/Users/southwind/Desktop/test.txt");
        //2、创建缓冲流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
// int temp = 0;
// while ((temp = bufferedInputStream.read())!=-1){ 
   
// System.out.println(temp);
// }

        byte[] bytes = new byte[1024];
        int length = bufferedInputStream.read(bytes,10,10);
        System.out.println(length);
        for (byte aByte : bytes) { 
   
            System.out.println(aByte);
        }

        bufferedInputStream.close();
        inputStream.close();
    }
}

  字符输⼊缓冲流
  readLine ⽅法

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;字节输出缓冲流
public class Test2 { 
   
 public static void main(String[] args) throws
Exception { 
   
 //1、创建字符流(节点流)
 Reader reader = new
FileReader("/Users/southwind/Desktop/test.txt");
 //2、创建缓冲流(处理流)
 BufferedReader bufferedReader = new
BufferedReader(reader);
 String str = null;
 int num = 0;
 System.out.println("***start***");
 while ((str =
bufferedReader.readLine())!=null){ 
   
 System.out.println(str);
 num++;
 }
 System.out.println("***end***,共读取
了"+num+"次");
 bufferedReader.close();
 reader.close();
 }
}

  字节输出缓冲流

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;字符输出缓冲流
public class Test { 
   
 public static void main(String[] args) throws
Exception { 
   
 OutputStream outputStream = new
FileOutputStream("/Users/southwind/Desktop/test2.txt
");
 BufferedOutputStream bufferedOutputStream =
new BufferedOutputStream(outputStream);
 String str = "由于在开发Oak语⾔时,尚且不存在运⾏
字节码的硬件平台,所以为了在开发时可以对这种语⾔进⾏实验研究,
他们就在已有的硬件和软件平台基础上,按照⾃⼰所指定的规范,⽤软
件建设了⼀个运⾏平台,整个系统除了⽐C++更加简单之外,没有什么
⼤的区别。";
 byte[] bytes = str.getBytes();
// for (byte aByte : bytes) { 
   
// bufferedOutputStream.write(aByte);
// }
 bufferedOutputStream.write(bytes,9,9);
 bufferedOutputStream.flush();
 bufferedOutputStream.close();
 outputStream.close();
 }
}

  字符节输出缓冲流

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;
public class Test2 { 
   输⼊流没有 flush ⽅法,但不代表它没有缓冲流,输出流是有 flush
⽅法的,实际开发中在关闭输出缓冲流之前,需要调⽤ flush ⽅
法。
序列化和反序列化
序列化就是将内存中的对象输出到硬盘⽂件中保存。
反序列化就是相反的操作,从⽂件中读取数据并还原成内存中的对
象。
序列化
 public static void main(String[] args) throws
Exception { 
   
 Writer writer = new
FileWriter("/Users/southwind/Desktop/test2.txt");
 BufferedWriter bufferedWriter = new
BufferedWriter(writer);
// String str = "由于在开发语⾔时尚且不存在运⾏字节
码的硬件平台,所以为了在开发时可以对这种语⾔进⾏实验研究,他们
就在已有的硬件和软件平台基础上,按照⾃⼰所指定的规范,⽤软件建
设了⼀个运⾏平台,整个系统除了⽐C++更加简单之外,没有什么⼤的
区别。";
// bufferedWriter.write(str,5,10);
 char[] chars = { 
   'J','a','v','a'};
// bufferedWriter.write(chars,2,1);
 bufferedWriter.write(22902);
 bufferedWriter.flush();
 bufferedWriter.close();
 writer.close();
 }
}

  输入流没有 flush 方法,但不代表它没有缓冲流,输出流是有 flush 方法的,实际开发中在关闭输出缓冲流之前,需要调用 flush 方法。

  6.说说序列化和反序列化?

  • 序列化就是将内存中的对象输出到硬盘文件中保存。

  • 反序列化就是相反的操作,从文件中读取数据并还原成内存中的对象。

  1、实体类需要实现序列化接口,Serializable

import java.io.Serializable;

public class User implements Serializable { 
   
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() { 
   
        return id;
    }

    public void setId(Integer id) { 
   
        this.id = id;
    }

    public String getName() { 
   
        return name;
    }

    public void setName(String name) { 
   
        this.name = name;
    }

    public Integer getAge() { 
   
        return age;
    }

    public void setAge(Integer age) { 
   
        this.age = age;
    }

    @Override
    public String toString() { 
   
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public User(Integer id, String name, Integer age) { 
   
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

  2、实体类对象进行序列化处理,通过数据流写入到文件中,ObjectOutputStream。

import com.southwind.entity.User;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

public class Test { 
   
    public static void main(String[] args) throws Exception { 
   
        User user = new User(1,"张三",22);
        OutputStream outputStream = new FileOutputStream("/Users/southwind/Desktop/obj.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(user);
        objectOutputStream.flush();
        objectOutputStream.close();
        outputStream.close();
    }
}

  3、反序列化

import com.southwind.entity.User;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class Test2 { 
   
    public static void main(String[] args) throws Exception { 
   
        InputStream inputStream = new FileInputStream("/Users/southwind/Desktop/obj.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        User user = (User) objectInputStream.readObject();
        System.out.println(user);
        objectInputStream.close();
        inputStream.close();
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156507.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月7日 上午6:00
下一篇 2022年7月7日 上午6:16


相关推荐

  • 如何windows中cmd命令行下怎么切换目录

    如何windows中cmd命令行下怎么切换目录1 首先打开 CMD 之后 发现默认是在 C Users SILVER 这个文件夹 2 这里输入 E 即可切换到 E 盘 3 输入 dir 可以查看当前目录下的文件 4 输入 cd 文件夹名可以进入子文件夹 比如这里输入 cdGame 即进入了 E Game5 另外 使用 cd 可以返回上一级目录 参考连接 http xinzhi wenda so com a 15185

    2026年3月18日
    1
  • Ubuntu 18.04 浏览器安装flash[通俗易懂]

    flash官网(注意下载和系统浏览器相对应的包)PPAPI:供Opera(15以上)、Chromium(开源谷歌)浏览器使用NPAPI:适用于FireFox(火狐)、Safari(苹果)、Opera(欧朋,12.17版以下)然后解压:tar-zxvfflash_player_npapi_linux.x86_64.tar.gz复制:sudocplibflashplay…

    2022年4月12日
    68
  • 重大版四年级上册信息技术教案_走进计算机教案

    重大版四年级上册信息技术教案_走进计算机教案辽师大版信息技术四下第一单元第6课《最炫民族风》教案3.docx文档编号:536849文档页数:6上传时间:2019-01-13文档级别:文档类型:docx文档大小:13.25KB第6课最炫民族风教学目标设计知识与技能目标通过学习使学生掌握word里“页面设置”里“页边距”和“纸张”的使用和操作方法。在掌握以前学习有关知识的基础上,能够较灵活的应用该设置对页面进行调…

    2026年2月16日
    4
  • 深入Redis持久化

    深入Redis持久化

    2021年11月3日
    39
  • ClientToScreen 和ScreenToClient 用法

    ClientToScreen 和ScreenToClient 用法ClientToScre 是把窗口坐标转换为屏幕坐标 ScreenToClie 是把屏幕坐标转换为窗口坐标屏幕坐标是相对于屏幕左上角的 而窗口坐标是相对于窗口用户区左上角的 VC 下 有些函数使用窗口坐标 有些使用屏幕坐标 使用时要分清 一个窗体分为两部分 系统区和客户区象标题和菜单之类的是系统区 由系统来控制 客户区就是你的地盘喽 Width He

    2026年3月19日
    2
  • C语言FLOAT类型

    C语言FLOAT类型摘录自 CSDN 论坛 点击打开链接问题 1 C 语言规定了 FLOAT 类型 6 7 位的有效数字 取值范围 3 4e 38 至 3 4e38 这个取值范围是从 0 000000000000 至 000000000000 那 1 0 不在这个范围内 不能用 float 定义 2 而且同为 32 位 float 类型比 longint 类型 0 429

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号