Java基础篇笔记(一):Java IO

本文详细介绍了Java IO的相关知识,包括File类的使用,Java IO流的概念和分类,字节流和字符流的区别,输入输出流体系,Java9改进后的对象序列化机制,以及NIO的基本原理和Buffer、Channel的使用。通过实例演示了如何操作File,以及各种流的读写操作。此外,还讨论了对象序列化的应用场景和注意事项,以及NIO的高效特性。
摘要由CSDN通过智能技术生成

一、File类

File类是java.io包下与平台无关的文件和目录,即如果希望在程序中操作文件和目录,都可以通过File类来完成。File能新建、删除、重命名文件和目录,File不能访问文件内容本身。如果需要访问文件内容本身,则需要输入/输出

File类可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。

一旦创建File对象后,就可以调用File对象的方法来访问,File类提供了很多方法来操作文件和目录。下面列出一些常见方法:

1.String getName() 返回此File对象所表示文件对应的文件名。
2.String getPath() 返回此File对象所对应的路径名。
3.String getAbsolutePath() 返回此File对象的绝对路径名。
4.String getParent() 返回此File对象所对应目录的父目录名。
5.boolean renameTo(File newName) 重命名此File对象所对应的文件或目录,如果重命名成功则返回true,否则返回false。
6.long length() 返回文件内容的长度。
7.boolean delete() 删除File对象所对应的文件或路径。
8.static File createTempFile(String prefix,String suffix,File directory) 再directory所指定的目录中创建一个临时的空文件,使用给定前缀、系统生成的随机数和给定的后缀作为文件名。
9.boolean createNewFile() 当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功返回true,否则返回false。

二、理解Java的IO流

Java的IO流是实现输入/输出的基础,它可以方便地实现数据地输入/输出操作,在Java中把不同地输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。

输入流:只能从中读取数据,不能向其写入数据。主要由InputStream(字节)和Reader(字符)作为基类。
输出流:只能向其写入数据,不能从中读取数据。主要由OutputStream(字节)和Writer(字符)作为基类。
字符流和字节流的用法几乎一样,区别在于字节流和字符流所操作的数据单元不同。字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。

按照流的角色可以把流分为节点流和处理流:可以从/向一个特定的IO设备(如磁盘、网络)读写数据的流,称为节点流,节点流也被称为低级流;处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能,处理流也被称为高级流。
处理流的功能主要体现在:性能的提高——主要以增加缓冲的方式来提高输入/输出的效率;操作的边界——处理流可能提供了一系列边界的方法来一次输入/输出大批量的内容。

三、字节流和字符流

字节流和字符流的操作方式几乎完全一样,区别只是操作的数据单元不同而已。
在InputStream中包含如下三个方法:

1.int read() 从输入流读取单个字节,返回所读取的字节数据。
2.int read(byte[] b) 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数。
3.int read(byte[] b,int off,int len) 从输入流中最多读取len个字节的数据,并将其存储在字节数组b中,放入b中并不是从数组的起点开始,而是从off位置开始,返回实际读取的字节数。

实际操作一下:

public class FileInputStreamTest {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\新建文件夹\\src\\FileInputStreamTest.java");
        byte[] bbuf=new byte[1024];
        int hasRead=0;
        while((hasRead=fis.read(bbuf))>0){
            //0即从第0位开始读取
            System.out.println(new String(bbuf,0,hasRead));
        }
        fis.close();/*关闭文件输入流*/
    }
}
输出结果:
上述代码

当然,Reader中也可以有上面三种方法,不过读取的是字符。
对于代码行FileStream fis=new FileInputStream("完整路径...FileInputStreamTest.java");注意是完整路径。
与JDBC编程一样,程序里打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应当.close();手动关闭文件IO资源。
要注意使用read方法时要先创建一个数组,即“竹筒”,再创建一个hasRead来保存实际读取的字符数。

在OutputStream中包含三个方法:

void mark(int readAheadLimit) 在记录指针当前位置记录一个标记。
boolean markSupported() 判断此输入流是否支持mark()操作,即是否支持记录标记。
void reset() 将此流的记录指针重新定位到上一次记录标记的位置。
long skip(long n) 记录指针向前移动n个字节。

Writer可以用字符串来代替字符数组,故还包含两个方法:

void write(String str) 将str字符串里包含的字符输出到指定输出流中。
void write(String str,int off,int len) 将str字符串里从off位置开始,长度为len字符串输出到指定输出流中。

实际操作:

public class FileOutputSteramTest {
    public static void main(String[] args){
        try(
                FileInputStream fis=new FileInputStream("D:\\新建文件夹\\src\\FileOutputSteramTest.java");
              
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值