Java基础—IO小结(一)概述与节点流
一、File类的使用
由于file类是一个基础类,所以我们从file类开始了解。(SE有完善的中文文档,建议阅读)
构造器:
常用方法:——完整方法请参见API API API!!!
File做的是面上的事——文件的新建、删除、重命名等。有关文件内容的操作,需要流来进行,所以,它经常作为形参。
文件名:
测试文件:
测试代码:
@Test
public void test1() {
// 通过绝对路径创建File对象——对应一个文件或者文件夹
File file = new File("D:\\test\\hello.txt");
// getName()——文件或目录名
System.out.println("#getName:"+file.getName());
// getPath()——路径字符串,若是相对路径,返回相对路径字符串
System.out.println("#getPath:"+file.getPath());
// getAbsoluteFile()——绝对路径形式,返回File
System.out.println("#getAbsoluteFile() "+file.getAbsoluteFile());
// getAbsolutePath()——绝对路径字符串
System.out.println("#getAbsolutePath() "+file.getAbsolutePath());
// getParent() ——返回父目录
System.out.println("#getParent() "+file.getParent()); }
测试结果:
文件检测:
测试文件:
测试代码:
@Test
public void test2() {
File file1 = new File("D:\\test\\hello.txt"); // 文件
File file2 = new File("D:\\test\\childDir"); // 文件夹
// exists()——文件或目录是否存在
System.out.println("#exists()"+file1.exists());
// canRead() canWrite() ——是否可读可写
System.out.println("#canRead()"+file1.canRead());
System.out.println("#canWrite()"+file1.canWrite());
// isFile() isDirectory() ——是否是文件/目录
System.out.println("#isFile()"+file1.isFile());
System.out.println("#isFile()"+file2.isFile());
System.out.println("#isDirectory()"+file1.isDirectory());
System.out.println("#isDirectory()"+file2.isDirectory());
}
测试结果:
获取常规文件信息:
测试文件:上文hello.txt
测试代码:
@Test
public void test3() {
File file = new File("D:\\test\\hello.txt");
// lastModified() ——文件最后修改时间
System.out.println("lastModified() :"+ new Date(file.lastModified()));
// length()——文件长度(字节)
System.out.println("length:"+file.length());
}
测试结果:
文件操作相关:
测试代码:
@Test
public void test4() throws IOException {
File file = new File("D:\\test\\hello1.txt"); //文件不存在
// createNewFile() ——不存在时创建新文件
if (!file.exists()) {
boolean b = file.createNewFile();
System.out.println("创建空文件结果:"+ b);
}
// delete() ——文件长度(字节)
System.out.println("delete() :" + file.delete());
}
测试结果:
目录操作相关:
测试文件:
测试代码:
@Test
public void test5() throws IOException {
File file1 = new File("D:\\test\\childDir"); // 文件夹
if (!file1.exists()) {
// mkdir()——创建一个文件目录 mkdirs()——递归创建
boolean b = file1.mkdir();
System.out.println("新建文件夹结果:"+ b);
}
File file = new File("D:\\test");
// 与Linux命令的ls类似,list返回字符串,listFiles返回文件
String[] files = file.list();
for (String s : files) {
System.out.println(s);
}
}
测试结果:
二、IO流的分类
读取外部设备中到程序中,称之为 input,输入;从程序向外输出到外部,称之为 ouput,输出;
也就是,站在程序的角度来理解输入输出!
A.根据处理数据类型的不同分为:字符流和字节流
B.根据数据流向不同分为:输入流和输出流
C.按功能分:节点流(一线的,离源最近的)和处理流
都是由四个最基本的 抽象类派生而成
三、节点流的使用
请注意:由于流不是JVM的资源,不会被回收,所以:必须手动显式关闭!
1.fis与fos
FileInputStream
构造器:
方法摘要:输入流对应读的方法
read()方法:
@Test
public void testFis1() throws Exception{
// 从硬盘读取一个文件(File类与文件建立联系),将其文件内容读取到程序中
File file = new File("D:\\test\\hello.txt");
// 通过file构建一个输入流
FileInputStream fis = new FileInputStream(file);
// 调用fis的方法进行文件的操作
/*
* read():读取文件的一个字节(java中int为4字节),到结尾时返回-1
* */
// int b = fis.read();
// while (b != -1) {
// System.out.print((char)b);
// b = fis.read();
// }
int b;
while ((b = fis.read()) != -1) {
System.out.print((char)b);
}
// 必须手动关闭流!
fis.close();
}
结果:
//实际上,txt中文件为Hello World,仔细看 72便是H的ASCII值(char型转为Int型了)
若要显示英文字符,可以进行强转:
System.out.print((char)b);
当然,这里直接thorws的做法是及其不靠谱的,至少,当前面出现异常时,后续的代码(如colse())不会继续执行,也就是说,资源无法关闭!
我们稍加改进:—— IO的操作请注意写法!
@Test
public void testFis2(){
FileInputStream fis = null;
try {
// 从硬盘读取一个文件(File类与文件建立联系),将其文件内容读取到程序中
File file = new File("D:\\test\\hello.txt");
// 通过file构建一个输入流
fis = new FileInputStream(file);
// 调用fis的方法进行文件的操作 int b;
while ((b = fis.read()) != -1) {
System.out.print((char)b);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 必须手动关闭流!
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
当然,一个一个字节读,在实际中是不可能的,我们可以使用它的重载方法:
@Test
public void testFis3() {
FileInputStream fis = null;
try {
File file = new File("D:\\test\\hello.txt");
fis = new FileInputStream(file);
// 定义每次读取的字节数组,这里定义长度为5
byte[] bytes = new byte[5];
int len; // 每次读取的字节长度
while ((len = fis.read(bytes)) != -1) {
/* 这里必须注意bytes.length与len的区别,len是实际读到的长度,
bytes.length是数组长度,可能会有之前读到的老的字符,读到的字节是依次放入bytes中,
将原先数组的进行替换,若未替换完,则保留了老的字节,不能遍历!
*/
for (int i = 0; i < len; i++) {
System.out.print((char)bytes[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 手动关闭流
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//相关注意的问题请看注释!
FileOutputStream
构造器:
方法摘要:对应写的方法
测试代码:
@Test
public void testFos1() {
// 文件可以不存在,将会自动创建
File file = new File("D:\\test\\hello1.txt");
FileOutputStream fos = null;
try {
// 同样,使用文件作为构造器,关联上一个文件
fos = new FileOutputStream(file);
// 使用字节数组写入数据到文件
fos.write(new String("I love China").getBytes());
System.out.println("fos done!");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) { //增加空判断,防止空指针异常
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//稍微改进异常处理时流的关闭引发的NPE
结果:若文件存在不是追加,而是直接覆盖文件
fos与fis实现文件的复制:
测试代码:
@Test
public void testFisAndFos1() {
// 已经存在,用于输入流读取
File file1 = new File("D:\\test\\0.jpg");
// 不存在,用于输入流写出
File file2 = new File("D:\\test\\1.jpg");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file1);
fos = new FileOutputStream(file2);
int len;
byte[] bytes = new byte[5];
while ((len = fis.read(bytes)) != -1) {
// 将取到的字节写入新的文件,注意读的长度
// 考虑 fos.write(bytes);的写法的错误之处
fos.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 后续将会升级为缓冲流
测试结果:
// 无论字节或者字符,都可以使用字节流进行处理
2.fr与fw
FileReader与FileWriter处理的步骤与上述是基本一样的,不同的是字符流处理的单位稍有差异
构造器:
FileReader
测试代码:
@Test
public void testFr1() {
File file = new File("D:\\test\\hello.txt");
FileReader fr = null;
try {
// 同样的,根据文件构建一个输入流
fr = new FileReader(file);
int len;
// 实际操作请根据文件大小修改字符数组大小
char[] cbuf = new char[5];
while ((len = fr.read(cbuf)) != -1) {
String s = new String(cbuf, 0, len);
System.out.print(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
测试结果即为输出文本文件到控制台
FileReader与FileWriter进行文本文件复制与之前类似,只是数组类型不同:
@Test
public void testFrAndFw1() {
// 需要关联的文件
File file1 = new File("D:\\test\\hello.txt");
File file2 = new File("D:\\test\\hello3.txt");
FileReader fr = null;
FileWriter fw = null;
try {
// 通过文件创建流
fr = new FileReader(file1);
fw = new FileWriter(file2);
int len;
char[] cbuf = new char[5];
while ((len = fr.read(cbuf)) != -1) {
fw.write(cbuf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Java基础—IO小结(一)概述与节点流的更多相关文章
- Java基础—IO小结(二)缓冲流与其它流的使用
一.缓冲流的使用 每个字节流都有对应的缓冲流: BufferedInputStream / BufferedOutputStream 构造器: 方法摘要与对应节点流类似 使用缓冲流实现文件复制:实际中 ...
- Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter)
Java基础-IO流对象之转换流(InputStreamReader与OutoutStreamWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.转换流概述 我们之前 ...
- Java基础-IO流对象之File类
Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
随机推荐
- Oracle数据库日期格式转换操作
1. 日期转化为字符串 (以2016年10月20日为例) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') strDateTime from dual; ...
- 5.servlet 上传文件
一.maven依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>com ...
- 3.如何在Maven项目中引入自己的jar包
1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...
- 封装CIImage实现实时渲染
封装CIImage实现实时渲染 CIImage属于CoreImage里面的东东,用来渲染图片的,为什么要封装它呢?其实很简单,封装好之后使用更加方便. 如果直接使用CIImage渲染图片,使用的流程如 ...
- PHP_CodeSniffer 使用攻略
安装 PHP_CodeSniffer 安装 phpcs phpcs 是 PHP 代码规范的检测工具. # 下载 $ curl -OL https://squizlabs.github.io/PHP_C ...
- October 03rd 2017 Week 40th Tuesday
Don't make promises you can't keep. But those are the best kind. 不要许下做不到的承诺,但是我们做不到的承诺往往是最好的. The be ...
- QT导入libcurl支持HTTPS
对于我这种不会编译的人来说,必须找到已经编译好的DLL文件,以及头文件才能使用. 幸运的在这个网站https://stackoverflow.com/questions/28137379/libcur ...
- 安装VMware,Linux
不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,但是很多生产上的框架和工具都是安装在服务器上的,而且有不少 ...
- ab网站压力测试命令的参数、输出结果的中文注解
ab命令原理 Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力. ab命令对发出负载的计算机要求很低,既不会占用很 ...
- 全局唯一Id:雪花算法
雪花算法-snowflake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有 ...