byte(字节)为最小单位. 故也是字节流char来读写: 字符流charReader和Writer本质上是一个能自动编码的InputStream和OutputStreamReader更方便一些File对象, 即使传入的文件和目录不存在, 代码也不会出错.. 只有调用某些方法才会出错.isFile()判断是否为一个文件isDirectory()判断是否为一个目录boolean canRead(): 是否可读boolean canWrite(): 是否可写boolean canExecute(): 是否可执行long length(): 文件字节大小如果当前File表示文件
createNewFile()创建文件delete()删除文件createTempFile()创建临时文件deleteOnExit(): JVM退出时自动删除文件如果当前File表示目录
list()和listFiles()列出目录下的文件和子目录名listFiles()提供一系列重载方法, 可以过滤不想要的文件和目录listFiles(), 可以接受一个Filter对象, 筛选名称boolean mkdir()创建当前File表示文件所在的目录boolean mkdirs(): 不存在的父目录也创建出来boolean delete: 删除目录 Path p1 = Paths.get(".", "project", "study");
System.out.println(p1);
Path p2 = p1.toAbsolutePath(); // 转换为绝对路径
System.out.println(p2);
Path p3 = p2.normalize(); // 转换为规范化路径
System.out.println(p3);
File f = p3.toFile(); // 转换为File对象
System.out.println(f);
for (Path p : Paths.get("..").toAbsolutePath()) { // 直接遍历Path
System.out.println(p);
}
read(): 读取输入流的下一个字节, 返回字节表示的int值.-1表示不能再读取了close()关闭, 释放底层资源, 避免资源浪费.I/O代码, 需要处理IOExceptiontry(resource)自动加入 `finally { resource.close() }resource是否实现AutoCloseable接口int read(byte[] b): 读取若干字节到byte[]数组, 返回读取的字节数.int read(byte[] b, int off, int len): 指定byte[]数组的偏移量和最大填充数.byte[]数组作为缓存区, read()尽可能多的读取字节到缓冲区, 并返回读取了多少个字节. 没有更多数据, 返回-1read()方法时阻塞的, 必须等到返回后, 才能继续执行FileInputStream可以从文件中获取输入流.ByteArrayInputStream可以在内存中模拟一个InputStream, 多作为测试使用InputStream抽象类型, 而不是具体的FileInputStreamvoid write(int b), 写入一个字节到输入流, 只写入int最低8位表示字节部分(相当于b&0xff)close()关闭输出流, 释放资源flush()强制将缓冲区的内容真正输出到目的地OutputStream自动调用close()关闭前, 自动调用InputStream也有缓冲区, 例如读取第一个字节, 操作系统一次性读取若干个字节到缓冲区OutputStream中的write方法也是阻塞的ByteArrayOutputStream可以在内存中模拟一个OutputStreamInputStream根据来源可以分为:
FileInputStream, 从文件中读取, 是最终数据源ServletInputStream: 从HTTP请求读取数据, 是最终数据源Socket.getInputStream(): 从TCP链接读取数据, 是最终数据源如果给FileInputStream添加很多功能, 至少需要3个子类
三种功能的组合又需要更多子类
为了解决依赖继承导致的子类数量失控问题
首先分为: 直接提供数据的基础InputStream, 和提供额外功能的InputStream
1 确定数据来源: InputStream file = new FileInputStream("test.txt")
2 提供特定的功能, 例如缓存功能: InputStream buffered = new BufferedInputStream(file)
3 再包装一层解压: InputStream gzip = new GZIPInputStream(buffered)
┌─────────────────────────┐
│GZIPInputStream │
│┌───────────────────────┐│
││BufferedFileInputStream││
││┌─────────────────────┐││
│││ FileInputStream │││
││└─────────────────────┘││
│└───────────────────────┘│
└─────────────────────────┘
OutputStream也以这种模式来提供各种功能FilterInputStream, 以叠加到任何一个InputStream中InputStream, 当最外层的InputStream关闭时, 内层的close自动调用ZipInputStream是一种FilterInputStream, 可以直接读取zip内容jar包就是zip包, 只是增加了一些特定的文件JarInputStream从ZipInputStream派生, 读取MANIFEST.MFZipInputStream, 传入一个FileInputStream作为数据源getNextEntry()直到返回null, 表示zip流结束Entry表示一个文件或者目录, 如果是文件, 就用read()方法不断读取, 直到返回-1 try (ZipInputStream zip = new ZipInputStream(new FileInputStream("...."))) {
ZipEntry entry = null;
while((entry = zip.getNextEntry()) != null) {
String name = entry.getName();
if (!entry.isDirectory()) {
int n;
while((n = zip.read()) != -1) {
// ...
}
}
}
}
ZipOutputStream是一种FilterOutputStream, 可以直接些人内容到zip包ZipOutputStream, 通常是包装一个FileOutputStreamputNextEntry(), 然后用write()写入byte[]数据closeEntry结束这个文件的打包 try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("..."))) {
File[] files = ...;
for (File file : files) {
zip.putNextEntry(new ZipEntry(file.getName()));
zip.write(getFileDataAsBytes(file));
zip.close();
}
}
new ZipEntry(name)传入name相对路径.class的目录或者jar包也可以包含其他类型的文件
.properties: 配置文件.jpg: 图片文件.txt, .csv: 文本文件classpath读取文件, 可以避免不同环境下文件路径不一致问题classpath中的资源文件, 路径总是以/开头, 先获取当前的Class对象getResourceAsStream()可以直接从classpath读取任意的资源文件nullbyte[]数组byte[]保存在文件中, 或者通过网络传输到远程byte[]变化Java对象java.io.Serializable接口Serializable空接口, 标记接口.ObjectOutputStream, 把java对象写入一个字节流ObjectOutputStream既可以写入基本类型, 如int, boolean, 也可以写入String, 还可以写入实现了Serializable接口的ObjectObject时, 需要大量的类型信息, 所有写入的内容很多ObjectInputStream负责从一个字节流读取Java对象String类型, readObject()可以直接返回一个Object对象. 然后就可以强制转换了readObject()可能抛出的异常:
ClassNotFoundException: 没有找到对应的ClassInvalidClassException: Class不匹配seriaVersionUID的静态变量, 用于标识Java类的序列化版本.byte[]数组被反序列化后可以执行特定的Java代码, 导致安全漏洞Reader是另一个输入流接口
InputStream是字节流
Reader是字符流
InputStream:
byte为单位int read()int read(byte[] b)Reader
char为单位int read()int read(char[] c)所有字符流的超类, 返回int(0 ~ 65535), 读到末尾返回-1
try进行关闭char[]数组的方法: public int read(char[] c) throws IOExceptionReader.CharArrayReader一样Reader基于InputStream构造Reader需要从InputStream中读入字节流(byte). 根据编码设置, 再转换char.InputStreamReader可以转成然后InputStream为Reader. 需要指定编码 try (Reader reader = new InputStreamReader(new FileInputStream("src/readme.txt", "UTF-8"))) {
// todo..
}
Writer: char转成byte输出
对比:
OutputStream
byte为单位void write(int b)void write(byte[] b)String方法Writer
char为单位void write(int c)void write(char[] c)void write(String s)所有字符输出流的超类
Writer.Writer, 作为一个缓冲区, 可以写入char, 然后得到写入的char[]数组Writer, 和CharArrayWriter类似StringBuffer接口, 并对外提供了Writer接口OutputStream转换为WriterPrintStream是一种FilterOutStreambyte数据OutputStream的接口上, 提供一些写入各种数据的方法
print(int)print(boolean)print(String)print(Object)println()方法, 自动加上换行符System.out是系统默认提供的PrintStreamSystem.err系统默认提供的标准错误输出IOExceptionWriter接口print()/println()最终输出的是char数据原文:https://www.cnblogs.com/zhangrunhao/p/12759224.html