首页 > 编程语言 >JAVA文件IO流

JAVA文件IO流

时间:2024-07-02 23:53:28浏览次数:18  
标签:文件 JAVA 字节 字符 int void 写入 IO public

基本的目录、文件操作,常用的IO输入输出流类介绍和使用。

一、目录及文件操作

Java中File类(文件类)以抽象的方式代表文件名和目录路径名,File对象则代表了磁盘中实际存在的文件和目录。

  File类不仅仅提供灵活的构造方法,同时还可以用于文件和目录的创建、文件的查找和文件的删除。

//构造方法
File(File parent, String child)   //根据parent抽象路径名和child路径名字符串创建一个新File实例。
File(String pathName)   //通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
File(URI uri)   //通过将给定的URI转换为一个抽象路径名来创建一个新的File实例。
//创建方法
createNewFile()   //在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false。
mkdir()   //在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。
mkdirs()   //在指定位置创建目录,这会创建路径中所有不存在的目录。
//判断方法
exists()   //文件或文件夹是否存在。
isFile()   //是否是一个文件,如果不存在,则始终为false。
isDirectory()   //是否是一个目录,如果不存在,则始终为false。
//获取方法
String getName()   //获取文件或文件夹的名称,不包含上级路径。
String getPath()   //返回绝对路径,可以是相对路径,但是目录要指定。
String[] list()   //返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。
File[] listFiles()   //返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。

二、JAVA中IO流

JAVA中IO流是对数据流向的概括,是数据传输的通道。通过JAVA来调用操作系统IO,实现对磁盘文件的读写操作。

  流是个抽象的概念,是对输入输出设备的抽象。根据输入还是输出可以分为输入流和输出流,输入流可以看作一个输入通道,输出流可以看作一个输出通道。输入流是相对程序而言的,外部传入数据给程序需要借助输入流。而程序把数据传输到外部需要借助输出流。

  根据传输单位的不同,流又可以分为字节流和字符流。字节流在传输过程中,传输数据的最基本单位是字节。而字符流传输数据的最基本单位是字符。通常字符编码不同,一个字符使用的字节数也不同。在传输方面,计算机的传输本质都是字节。一个字符由多个字节组成,转成字节之前先要去查表转成字节,所以字符流传输时有时候会使用缓冲区。

三、JAVA字节流

字节输入流:

InputStream:是一个抽象类,也是所有基于字节的输入流的超类,抽象了Java的字节输入模型。

int read()   //读取一个字节
int read(byte b[])   //最多读取 b.length 长度的字节,并储存到数组 b 中,返回实际读取长度,利用 read() 实现
int read(byte b[], int off, int len)   //同上,最多读取 len 个字节,从 off 开始保存
int available()   //返回可以读取的字节数目,不受阻塞
long skip(long n)   //跳过n个字节
void close()   //关闭输入流,并释放与此流有关的所有资源,未实现,方法体为空
synchronized void mark(int readlimit)   //标记当前位置,以便可以使用 reset() 方法复位到该标记的位置
synchronized void reset()   //将当前位置复位到上次使用 mark() 方法标记的位置,未实现,调用抛出IO异常
boolean markSupported()   //判断次输入流是否支持 mark() 和 reset() 方法

SequenceInputStream:表示其他输入流的逻辑串联。从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

// 构造方法
public SequenceInputStream(Enumeration<? extends InputStream> e)
public SequenceInputStream(InputStream s1, InputStream s2)
// 该类中的方法
final void nextStream()
public int available()
public int read()
public int read(byte b[], int off, int len)
public void close() 

ByteArrayInputStream:表示字节数组输入流,在内存中创建一个字节数组缓冲区,而字节数组输入流则可以读取该缓冲区的字节数据。

// 构造方法
public ByteArrayInputStream(byte[] a)
public ByteArrayInputStream(byte[] a, int off, int len)
// 操作方法
public int available()
public int read()
public int read(byte b[], int off, int len)
public void mark(int read)
public long skip(long n)

FileInputStream:文件字节输入流,从文件系统中的某个文件中获得输入字节。指对文件数据以字节的形式进行读取操作。

//构造方法
public FileInputStream(File file) 
public FileInputStream(String name)   //文件通过文件系统路径名指定
//其余读取方法和InputStream基本一致

ObjectInputStream:表示反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象,以流的方式读取对象。一般和FileInputStream一起使用。

//构造方法
public ObjectInputStream(InputStream in)
//操作方法(其余方法多和InputStream类似)
public Object readObject()   //从ObjectInputStream读取对象

FilterInputStream:用来封装其它的输入流,并为它们提供额外的功能。本身只是简单重写那些将所有请求传递给所包含输入流的InputStream的所有方法,其子类则进一步重写方法并且提供额外功能。

BufferedInputStream:表示字节缓冲输入流,创建BufferedInputStream时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。相当于为另一个流添加缓冲功能。

//构造方法
public BufferedInputStream(InputStream in)   
public BufferedInputStream(InputStream in,int size)   //指定缓冲区大小构造缓冲输入流对象
//常用方法
public int read()   //缓冲区可能以提前写入了数据内容,读的时候则从缓冲区读入内存
public int read(byte[] b,int off,int len)

DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。也就是专门用来读各种各样的数据的。(如int、char、long)

//构造方法
public DataInputStream(InputStream in)
//常用方法(其余方法多和InputStream类似)
public final Boolean readBooolean()
public final byte readByte()
public final short readShort()
public final Int readInt()

字节输出流:

OutputStream:是一个抽象类,所有基于字节的输出流的超类。

void write(int b)   // 抽象的写入方法
void write(byte b[])   // 写入一个字节数组,利用 write(int b)实现
void write(byte b[], int off, int len)   // 写入字节数组的指定位置
void flush()   //刷新此输出流并强制写出所有缓冲的输出字节,多用于其子类有用到缓存的时候使用。
void close()

ByteArrayOutputStream:实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。

//构造方法
public ByteArrayOutputStream() 
public ByteArrayOutputStream(int size)   //创建一个新的 byte 数组输出流,具有指定大小的缓冲区容量。
//常用方法
void write(int b)   // 指定的字节写入此byte数组输出流
void write(byte b[], int off, int len)   //将指定byte数组中从偏移量off开始的len个字节写入此byte数组输出流。

FileOutputStream:文件输出流是用于将数据写入File或FileDescriptor的输出流,多写入诸如图像数据之类的原始字节的流。

//构造方法
public FileOutputStream(File file)   //创建一个向指定File对象表示的文件中写入数据的文件输出流。
public FileOutputStream(File file, boolean append)   //同样创建输出文件流,不过append参数true时,数据尾部写入。为false时,数据覆盖原文件。
public FileOutputStream(String name)   //创建一个向具有指定名称的文件中写入数据的输出文件流。
//常用方法
public void write(byte[] b)   //将b.length个字节从指定byte数组写入此文件输出流中。
public void write(int b)   //将指定字节写入此文件输出流。
public void write(byte[] b, int off, int len)   //将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。

ObjectOutputStream:表示序列化流,把对象以流的方式写入到文件中保存,实现对象的持久存储。多配合反序列化流一起使用。

//构造方法
public ObjectOutputStream(OutputStream out)   //创建写入指定 OutputStream 的 ObjectOutputStream
//常用方法(其余方法多喝OutputStream一样)
public void writeObject(Object obj)   //将指定的对象写入ObjectOutputStream

FilterOutputStream:和FilterInputStre功能一样,用来封装其它的输出流,并为它们提供额外的功能。

DataOutputStream:数据输出流允许应用程序以适当方式将基本Java数据类型写入输出流中。

//构造方法
public DataOutputStream(OutputStream out)   //创建一个新的数据输出流,将数据写入指定基础输出流
//常用方法
public void writeBoolean(boolean v)   //将一个 boolean值以1byte值形式写入基础输出流
public void writeChar(int v)   //将一个char值以2byte值形式写入基础输出流中,先写入高字节
public void writeInt(int v)   //将一个int值以4byte值形式写入基础输出流中,先写入高字节
public void flush()   // 刷新此输出流并强制写出所有缓冲的输出字节

PrintStream:为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。且永远不会抛出IOException。与DataOutputStream不同的是PrintStream打印的所有字符都使用平台的默认字符编码转换为字节。

//构造方法
public PrintStream(File file)   //创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(OutputStream out)   //创建新的打印流。
//常用方法(write方法和OutputStream基本一样)
public PrintStream append(char c)   //将指定字符添加到此输出流。
public void print(T t)   //打印t,类型可以是boolean、int、char等
public void println(T t)   //打印时会写入行分隔符字符串终止当前行。

BufferedOutputStream:该类实现缓冲的输出流。设置这种输出流,应用程序先将数据写入缓冲区,而不必针对每次字节写入调用底层系统。

//构造方法
public BufferedOutputStream(OutputStream out)   //创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
public BufferedOutputStream(OutputStream out, int size)   //创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
//常用方法
public void flush()   //刷新此缓冲的输出流
public void write(byte[] b, int off, int len)   //将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流
public void write(int b)   //将指定的字节写入此缓冲的输出流

四、JAVA字符流

字符输入流:

Reader:用于读取字符流的抽象类,子类则必须实现read(char[], int, int)和close()方法。

//构造方法
protected Reader()   //创建一个新的字符流reader,其重要部分将同步其自身的reader。
protected Reader(Object lock)   //创建一个新的字符流 reader,其重要部分将同步给定的lock对象。
//常用方法
public int read(CharBuffer target)   //试图将字符读入指定的字符缓冲区。
public int read()   //读取单个字符。
public int read(char cbuf[])   //将字符读入数组
abstract public int read(char cbuf[], int off, int len)    //将字符读入数组的某一部分
abstract public void close()   //关闭该流并释放与之关联的所有资源。

BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

//构造方法
public BufferedReader(Reader in)   //创建一个使用默认大小输入缓冲区的缓冲字符输入流
public BufferedReader(Reader in, int sz)   // 创建一个使用指定大小输入缓冲区的缓冲字符输入流
//常用方法
public String readLine()   //读取一个文本行。
public int read()
public int read(char cbuf[], int off, int len)
public void close()

InputStreamReader:是字节流通向字符流的桥梁,它使用指定的Charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 每次调用read()方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。可以和BufferedReader配合使用提高效率。

//构造方法
public InputStreamReader(InputStream in)   // 创建一个使用默认字符集的 InputStreamReader
public InputStreamReader(InputStream in, Charset cs)   //创建使用给定字符集的InputStreamReader
public InputStreamReader(InputStream in, CharsetDecoder dec)   //创建使用给定字符集解码器的InputStreamReader
//常用方法
public int read()
public int read(char cbuf[], int off, int len)
public void close()
public String getEncoding()   //返回此流使用的字符编码的名称

FileReader:用来读取字符文件的类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。底层实现由FileInputStream和InputStreamReader来完成,因此指定特殊值,可自行构造设置。

//构造方法
public FileReader(File file)   //在给定从中读取数据的File的情况下创建一个新FileReader
public FileReader(String fileName)   //在给定从中读取数据的文件名的情况下创建一个新FileReader
//其他方法和Reader基本一样

字符输出流:

Writer:用于写入字符流的抽象类,子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。字符流多用到缓存,如果写入没有调用flush()方法或者close()方法,则可能部分内容还在缓存区没写入文件,导致写入丢失问题。

//构造方法
protected Writer()   //创建一个新的字符流writer,其关键部分将同步writer自身
protected Writer(Object lock)   //创建一个新的字符流writer,其关键部分将同步给定的对象。
//常用方法
public void write(char[] cbuf)   //写入字符数组
public void write(char[] cbuf, int off, int len)   //写入字符数组的某一部分
public void write(String str)   //写入字符串
public void write(int c)   //写入单个字符。
public Writer append(char c)   //将指定字符添加到此writer,可以一直追加
public abstract void flush()   //刷新该流的缓冲
public abstract void close()   //关闭此流,一般关闭前会自动刷新

PrintWriter:向文本输出流打印对象的格式化表示形式。

//构造方法
public PrintWriter(File file)   //使用指定文件创建不具有自动行刷新的新PrintWriter
public PrintWriter(OutputStream out)   //根据现有的OutputStream创建不带自动行刷新的新PrintWriter
public PrintWriter(OutputStream out, boolean autoFlush)   //当autoFlush为true,则println、printf或format方法将刷新输出缓冲区
//常用方法
public PrintWriter format(String format, Object... args)   //使用指定格式字符串和参数将一个格式化字符串写入此writer中。
public void print(T t)   //打印t值,T的类型可以为int、long、char等
public void println()   //打印值,并终止该行

BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

//构造方法
public BufferedWriter(Writer out)   //创建一个使用默认大小输出缓冲区的缓冲字符输出流
public BufferedWriter(Writer out, int sz)   //创建一个使用给定大小输出缓冲区的新缓冲字符输出流
//常用方法
public void newLine()   //写入一个行分隔符
public void write(char[] cbuf, int off, int len)   //写入字符数组的某一部分
public void write(int c)   //写入单个字符。
public void flush()   //刷新该流的缓冲
public void close()   //关闭此流

OutputStreamWriter:是字符流通向字节流的桥梁,可使用指定的Charset将要写入流中的字符编码成字节。使用的字符集可以由名称指定或显式给定。

//构造方法
public OutputStreamWriter(OutputStream out)   //创建使用默认字符编码的OutputStreamWriter
public OutputStreamWriter(OutputStream out, Charset cs)   //创建使用给定字符集的OutputStreamWriter
//常用方法(基本和Writer一致)

FileWriter:用来写入字符文件的类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。底层由FileOutputStream加上OutputStreamWriter实现。因此也可以自行构造设置相关参数。

//构造方法
public FileWriter(File file)   //根据给定的File对象构造一个FileWriter对象
public FileWriter(String fileName)   //根据给定的文件名构造一个FileWriter对象
//常用方法(基本和Writer一致)

标签:文件,JAVA,字节,字符,int,void,写入,IO,public
From: https://www.cnblogs.com/idempotent/p/12147083.html

相关文章

  • C++ STL 优先队列 (priority_queue)
    std::priority_queue<queue>优先队列  1、第一个元素始终为最大元素。  2、有着类似于堆的特性,它可以在其中随时插入元素。  3、支持下标访问(随机访问迭代器)优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问迭代器访问,并需要支持以下操作empty()si......
  • The following untracked working tree files would be overwritten by merge/ git st
    背景给同学解决问题时,发现无法拉取远程的分支。解决他在C:\Users\用户名\路径下,建立了一个git仓库,然后在桌面上创建了一个文件夹,文件夹内部又新建了一个文件夹,导致gitstatus显示大量父级目录(多级父级)的文件。删除父级中的.git文件即可拉取前没有initgitpull用惯了......
  • FL Studio 21中文破解版,内置激活补丁安装激活使用指南
     FLStudio21在音频质量和性能上也达到了新的高度。它采用了先进的音频处理技术,确保了音频的清晰度和真实度。同时,其强大的处理能力使得用户可以同时运行多个音轨和效果器,而不会出现卡顿或延迟。此外,FLStudio21还提供了丰富的插件和扩展功能,使得用户能够更加方便地与其他......
  • esp32-s3+GC9A01基于vs code+PlatformIO+ardunio框架+Squareline UI 移植
    文章目录前言一、SquarelineStudio是什么?二、使用步骤1.创建测试的UI2.工程导出3.工程移植总结前言本节描述了使用SquarelineStudio创建简单UI,导出文件后如何与LVGL集成并在PlatformIO环境中进行编译和下载过程。环境如下:platform=espressif32board=esp32-s......
  • 学习java第一百一十八天
    @Component和@Bean的区别是什么?@Component注解作用于类,而@Bean注解作用于方法。@Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用@ComponentScan注解定义要扫描的路径从中找出标识了需要装配的类自动装配到Spring的bean容器中)。@B......
  • java的序列化和反序列化
    一、概念序列化是将对象的常态存储到特定的存储介质中的过程。反序列化是将特定的存储介质中的数据重新构建对象的过程。问题为每个对象属性——编写读写代码,过程很繁琐且非常容易出错,如何解决? 二、使用ObjectOutputStream类实现序列化a.序列化的对象所属类必须为可......
  • 文献阅读-Distributed Constrained Combinatorial Optimization leveraging Hypergra
    DistributedConstrainedCombinatorialOptimizationleveragingHypergraphNeuralNetworks  AbstractScalableaddressingofhighdimensionalconstrainedcombinatorialoptimizationproblemsisachallengethatarisesinseveralscienceandengineering......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • 【VMware vSAN】vSAN Data Protection Part 1:安装部署。
    VMwarevSAN8U3中新引入了基于vSANESA的全新vSANDataProtection功能,借助vSANDataProtection功能,您可以使用在vSAN集群本地存储的本机快照,快速从操作故障或勒索软件攻击中恢复虚拟机。它使用本机vSAN 快照来捕获虚拟机的当前状态。可以使用vSAN快照将虚拟机还......
  • java07
    数组数组的声明和创建dataType[]=arrayRefVar创建数组dataType[]arrayRefVar=newdataType[array.length];数组长度arrays.length内存堆:1,存放new的对象和数组2,栈:1,存放基本的变量类型2,引用对象的变量数组的注意事项1.数组一旦被创建,长度就是确定的2.其元素必须......