Java I/O Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
I/O流分类 根据“流”的数据流向,可以将其划分为:输入流和输出流。
根据“流”中处理数据的单位,可以将其划分为:字节流和字符流。在java中,字节是占1个Byte,即8位;而字符是占2个Byte,即16位。而且,需要注意的是,java的字节是有符号类型,而字符是无符号类型!
文章图片
根据操作对象,可以将其划分为:
文章图片
File 类 File类是对文件系统中文件以及文件夹进行操作的类,可以通过面向对象的思想操作文件和文件夹。
文件创建操作如下,主要涉及文件创建、删除文件、获取文件描述符等。
File 直接继承于Object,实现了Serializable接口和Comparable接口。实现Serializable接口,意味着File对象支持序列化操作。而实现Comparable接口,意味着File对象之间可以比较大小;File能直接被存储在有序集合(如TreeSet、TreeMap中)。
创建一个File对象。
语法:
new File.(File parent, String child);
//从父抽象路径名和子路径名字符串创建新的 File实例。
new File.(String pathname);
//通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
new File.(String parent, String child);
//从父路径名字符串和子路径名字符串创建新的 File实例。
new File.(URI uri);
//通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。
常见方法使用
import java.io.*;
/*
File类常见方法:
1,创建。
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2,删除。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();
在程序退出时删除指定文件。
3,判断。
boolean exists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
4,获取信息。
getName():
getPath():
getParent():
getAbsolutePath()
long lastModified()
long length()
*/
class FileDemo
{
public static void main(String[] args) throws IOException
{
method_5();
}
public static void method_5()
{
File f1 = new File("c:\\Test.java");
File f2 = new File("d:\\hahah.java");
sop("rename:"+f2.renameTo(f1));
}
public static void method_4()
{
File f = new File("file.txt");
sop("path:"+f.getPath());
sop("abspath:"+f.getAbsolutePath());
//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
//如果相对路径中有上一层目录那么该目录就是返回结果。
sop("parent:"+f.getParent());
}public static void method_3()throws IOException
{
File f = new File("d:\\java1223\\day20\\file2.txt");
//f.createNewFile();
//f.mkdir();
//记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
//通过exists判断。
sop("dir:"+f.isDirectory());
sop("file:"+f.isFile());
sop(f.isAbsolute());
}
public static void method_2()
{
File f = new File("file.txt");
//sop("exists:"+f.exists());
//sop("execute:"+f.canExecute());
//创建文件夹
File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
sop("mkdir:"+dir.mkdirs());
}
public static void method_1()throws IOException
{
File f = new File("file.txt");
sop("create:"+f.createNewFile());
//sop("delete:"+f.delete());
}
//创建File对象
public static void consMethod()
{
//将a.txt封装成file对象。可以将已有的和为出现的文件或者文件夹封装成对象。
File f1 = new File("a.txt");
File f2 = new File("c:\\abc","b.txt");
File d = new File("c:\\abc");
File f3 = new File(d,"c.txt");
sop("f1:"+f1);
sop("f2:"+f2);
sop("f3:"+f3);
File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator+"a.txt");
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
基础IO类和相关方法 虽然IO类有很多,但是最基本的是四个抽象类, InputStream、 OutputStream、 Reader、 Writer。最基本的方法也就是read()和write()方法,其他流都是上面这四类流的子类,方法也是通过这两类方法衍生而成的。而且大部分的IO源码都是native标志的,也就是说源码都是C/C++写的。
这里我们先来认识一下这些流类及其方法
InputStream InputStream是一个定义了Java流式字节输入模式的抽象类。该类的所有方法在出错条件下引发一个lOException异常。
它的主要方法定义如下:
修饰符和类型 | 方法和说明 |
---|---|
int |
available() 返回的字节数的估计,可以从这个输入流读取(或跳过)没有阻塞的下一个输入流调用的方法。 |
void |
close() 关闭此输入流并释放与流关联的任何系统资源。 |
void |
mark(int readlimit) 标志着这个输入流的当前位置。 |
boolean |
markSupported() 测试如果这个输入流支持 mark 和 reset 方法。 |
abstract int |
read() 从输入流中读取下一个字节的数据。 |
int |
read(byte[] b) 从输入流中读取的字节数一些 b 并将它们存储到缓冲区数组。 |
int |
read(byte[] b, int off, int len) 读取 len 字节的数据从输入流到一个字节数组。 |
void |
reset() 复位这流位置当时 mark 方法最后呼吁这个输入流。 |
long |
skip(long n) 跳过,丢弃 n 字节的数据从这个输入流。 |
它的主要方法定义如下:
修饰符和类型 | 方法和说明 |
---|---|
void |
close() 关闭此输出流并释放与此流相关的任何系统资源。 |
void |
flush() 经过输出流并迫使任何缓冲输出字节被写入。 |
void |
write(byte[] b) 写 b.length 字节从指定字节数组输出流。 |
void |
write(byte[] b, int off, int len) 写 len 字节从指定字节数组开始抵消 off 输出流。 |
abstract void |
write(int b) 将指定的字节写入此输出流。 |
它的主要方法定义如下:
修饰符和类型 | 方法和说明 |
---|---|
abstract void |
close() 关闭流并释放与之关联的任何系统资源。 |
void |
mark(int readAheadLimit) 标记流中的当前位置。 |
boolean |
markSupported() 告诉这流是否支持马克()操作。 |
int |
read() 读取单个字符。 |
int |
read(char[] cbuf) 将字符读入数组。 |
abstract int |
read(char[] cbuf, int off, int len) 将字符读入数组的一部分。 |
int |
read(CharBuffer target) 试图字符读入指定的字符缓冲区。 |
boolean |
ready() 告诉这个流是否准备好读。 |
void |
reset() 重置。 |
long |
skip(long n) 跳过字符。 |
它的主要方法定义如下:
修饰符和类型 | 方法和说明 |
---|---|
Writer |
append(char c) 附加的指定字符的作家。 |
Writer |
append(CharSequence csq) 附加这个作者指定的字符序列。 |
Writer |
append(CharSequence csq, int start, int end) 附加一个指定的字符序列的子序列对这个作家。 |
abstract void |
close() 关闭流,先冲洗它。 |
abstract void |
flush() 刷新流。 |
void |
write(char[] cbuf) 写一个字符数组。 |
abstract void |
write(char[] cbuf, int off, int len) 写字符数组的一部分。 |
void |
write(int c) 写一个字符。 |
void |
write(String str) 写一个字符串。 |
void |
write(String str, int off, int len) 写一个字符串的一部分。 |
ByteArrayInputStream 字节数组输入流: 把内存中的一个缓冲区作为 InputStream使用。
PipedInputStream 管道输入流: 实现了pipe管道的概念,主要在线程中使用。
【Java|Java I/O】SequencelnputStream 顺序输入流: 把多个 InputStream合并为一个InputStream。
FilterInputstream 过滤输入流: 其他输入流的包装。
ObjectInputStream 反序列化输入流: 将之前使用 ObjectOutputStream序列化的原始数据恢复为对象,以流的方式读取对象。
DataInputStream 数据输入流: 允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型。
PushbackInputStream 推回输入流: 缓冲的一个新颖的用法是实现推回。Pushback用于输入流允许字节被读取然后返回到流。
OutputStream及其子类 FileOutputStream 文件输出流: 该类实现了一个输出流,其数据写入文件。
ByteArrayOutputStream 字节数组输出流: 该类实现了一个输出流,其数据被写入由byte数组充当的缓冲区,缓冲区会随着数据的不断写入而自动增长。
PipedOutputStream 管道输出流: 管道的输出流,是管道的发送端。
ObjectOutputStream 基本类型输出流: 该类将实现了序列化的对象序列化后写入指定地方。
FilterOutputStream 过滤输出流: 其他输出流的包装。
PrintStream 打印流: 通过 PrintStream可以将文字打印到文件或者网络中去。
DataOutputStream: 数据输出流允许应用程序以与机器无关方式向底层输出流中写入基本Java数据类型。
Reader及其子类 FileReader 文件字符输入流: 把文件转换为字符流读入。
CharArrayReader 字符数组输入流: 是一个把字符数组作为源的输入流的实现。
BufferedReader 缓冲区输入流: BufferedReader类从字符输入流中读取文本并缓冲字符,以便有效地读取字符,数组和行。
PushbackReader: PushbackReader类允许一个或多个字符被送回输入流。
PipedReader 管道输入流: 主要用途也是在线程间通讯,不过这个可以用来传输字符。
Writer及其子类 FileWriter 字符输出流: FileWriter创建一个可以写文件的 Writer类。
CharArrayWriter 字符数组输出流: ChararrayWriter实现了以数组作为目标的输出流。
BufferedWriter 缓冲区输出流: BufferedWriter是一个增加了方法的 flush()方法可以用来确保数据缓冲器确实被写到实际的输出流。
PrintWriter: PrintWriter本质上是 PrintStream的字符形式的版本。
PipedWriter 管道输出流: 主要用途也是在线程间通讯,不过这个可以用来传输字符。
Java的输入输出的流式接口为复杂而繁重的任务提供了一个简洁的抽象。过滤流类的组合允许你动态建立客户端流式接口来配合数据传输要求。继承高级流类 InputStream、 InputStream、 Reader和 Writer类的Java程序在将来(即使创建了新的和改进的具体类)也能得到合理运用。
推荐阅读
- ★My|业界呼吁Java源代码尽早开放 Sun犹豫不决
- java|java学习路线
- java|监视器java_Java监视器绑定的超人
- 图片|图片 上传 java_java web原始的图片上传示例
- java|java web 上传文件到数据_JAVA WEB文件上传步骤
- 文件上传|文件上传 java web_JavaWeb:实现文件上传
- Java/C|C语言指针初阶
- mall学习教程|再见 Xshell ,这款开源的终端工具逼格更高~
- math.h|手撕前端面试代码题大全