Java IO流之节点流与字符流的相关知识总结
作者:Namtheun 发布时间:2021-12-31 06:46:15
一、File
file是文件和目录路径名的抽象表示
1.1 File的用法
用法:
File file = new File("路径名");
//如
File file = new File("L:\\FileTestDemo\\AAA\\aaa.txt");
注意:在windows中,路径名不能使用单个的\
,单个的\
为转义字符,可以使用\\
,//
或/
1.2 File的常用方法
1.boolean createNewFile()
当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。 注意: 不能创建文件夹,只能创建文件
System.out.println(file.createNewFile()); //true or false表示是否创建成功
2.boolean delete()
删除此抽象路径名表示的文件或目录。
System.out.println(file.delete());
3.boolean exists()
测试此抽象路径名表示的文件或目录是否存在。
if(!file.exists()){
System.out.println("文件不存在,创建"+ file.createNewFile());
}
4.String getName()
返回此抽象路径名表示的文件或目录的名称。
System.out.println(file.getName());
5.long lastModified()
返回上次修改此抽象路径名表示的文件的时间。
System.out.println(new SimpleDateFormat().format(new Date(file.lastModified())));
二、IO流
File 类:
只能操作文件外部的内容,无法操作文件内部内容的读写
流:
数据以先入先出的顺序进行传输,流就是管道,就是用来 传输数据的
IO 流:
java提供了一个io包,提供了很多类,提供了很多功能能够实现数据的读写
2.1 流的概念
数据源就像水箱,流就像水管中流着的水流,程序就是我们最终的用户。 流是一个抽象、动态的概念, 是一连串连续动态的数据集合
2.2 流的分类
按流向可分为输入流(InputStream和Reader)和输出流(OutputStream和Writer)
按操作单元可分为字节流(InputStream 和 OutputStream)和字符流(Reader 和 Writer)
按功能可分为节点流(可以直接从数据源或目的地读写数据)和功能流(是处理流的流。通过对其他流的处理提高程序的性能)
2.3 IO操作步骤
在进行任何操作之前,首先要明确目的(读还是写),找准源头(读取),找准目的地(写出)
1.建立联系 :这一步骤是为了获取流,如果此时是文件,则需要将文件抽象到内存形成对象。后期也 可以是其他的数据源
2.选择流:从读写、数据单元和功能方面考虑。输入|输出,字节|字符,结点流|处理流。
3.执行操作:该读就读,该写就写。考虑是一次性完成还行需要循环。
4.释放资源:程序中打开的文件 IO 资源不属于内存中的资源,垃圾回收无法回收,需要显示关闭。
2.4 基本输入流(InputStream和Reader)
int read() -> 返回值是这一次读取到的内容(一个字节的值, 一个字符的值)
int read(byte[] car) -> 将读取到的字节临时存储到car数组中, 返回实际读取到的字节数量
int reade(char[] car) -> 将读取到的字符临时存储到car数组中, 返回实际读取到的字符数量
无论以何种方式 read(), read([]) 读取文件, -1,就意味着读取到文件末尾
字符 -> 只能操作文本,直接读取到的就是字符
字节 -> 任意数据, 但是如果操作是字符的话,还需要我们转换(麻烦)
单个字节读取
以InputStream为例,Reader同理
public class IOTest {
public static void main(String[] args) throws IOException {
//选择流,建立联系
InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt");
//无论以何种方式 read(), read([]) 读取文件, -1,就意味着读取到文件末尾
//则当result的值为-1时结束
int result = -1;
while((result = is.read()) != -1){
System.out.println((char)result);
}
//关闭
is.close();
}
}
多个字节读取
public class IOTest {
public static void main(String[] args) throws IOException {
//选择流,建立联系
InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt");
//定义运输数组
byte[] car = new byte[1024];
int len = -1;
//当result的值为-1时结束
while ((len = is.read(car)) != -1){
System.out.println(new String(car,0,len));
}
//关闭
is.close();
}
}
2.5 基本输出流(OutputStream和Writer)
以OutputStream为例,Writer同理
注意:在关闭(close)输出流前需要先清空(flush)缓存区的数据
flush()一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。
单字节写入
public class OutputStream01 {
public static void main(String[] args) throws IOException {
选择流,建立联系
OutputStream os = new FileOutputStream("L:\\FileTestDemo\\abc.txt",true);
//写入数据
os.write('a');
//刷出流
os.flush();
//关闭
os.close();
}
}
多字节输入
public class OutputStream02 {
public static void main(String[] args) throws IOException {
//构建输出流
OutputStream os = new FileOutputStream("L:\\FileTestDemo\\abc.txt");
//需要写入的数据
String str = "我好菜啊\n" +
"就这?\n" +
"\t\t\t不是吧,阿sir";
//转为字节数据存入数组
byte[] arr = str.getBytes();
//写入数据
os.write(arr);
//刷出数据
os.flush();
//关闭
os.close();
}
}
2.6 输入输出联合使用
以InputStream和OutputStream为例
public class In_Out {
public static void main(String[] args){
//提升作用域范围
InputStream is = null;
OutputStream os = null;
try {
//创建输入流
is = new FileInputStream("L:\\FileTestDemo\\aaa.txt");
os = new FileOutputStream("L:\\FileTestDemo\\abc\\bbb.txt");
//创建输入数组
byte[] arr = new byte[1024];
int len = -1;
while ((len = is.read(arr)) != -1){
//write(byte[] b, int off, int len) 将从偏移量 off开始的指定字节数组中的 len字节写入此输出流
os.write(arr,0,len);
}
//刷出
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//后打开,先关闭
//先关闭输出流
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//再关闭输入流
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2.7 异常的处理
在使用IO流的时候会出现编译时异常,可以使用抛出异常或抓取异常来处理
抛出异常
public class IOTest {
public static void main(String[] args) throws IOException {
//建立联系可能会遇到找不到文件位置(FileNotFoundException)异常
//这时候可以抛出(throw)异常
InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt");
}
}
抓取异常
public class IOTest {
public static void main(String[] args){
//通过try...carch...来抓取异常
try {
InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
2.8 字节流与字符流的区别
字节流和字符流的区别:
1.每次读写的字节数不同;
2.字符流是块读写,字节流是字节读写;
3.字符流带有缓存,字节流没有。
java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符,可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。
来源:https://blog.csdn.net/Numtheun/article/details/117931850


猜你喜欢
- 1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存。 (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节
- 报错翻译: compileSdkVersion android-24”需要JDK 1.8或更高版本编译。报错现象如下图:原因:st
- Collection遍历方式Collection集合遍历的方式有三种:迭代器foreach/增强for循环lambda表达式迭代器遍历迭代器
- Sentinel数据双向同步上面实现了Nacos单向同步配置规则到Sentinel,但是只是单向的,没有实现Sentinel向Nacos同步
- 状态活动存放在一个叫返回栈的一个集合,当重新打开一个Activity时,它就会出现在栈顶。当要销毁该活动时,调用finish()或back,
- 这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图。需求分析可以看到整个动画有几部分组成,那我们就把每个部分拆分出
- 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天
- Android 自定义imageview实现图片缩放实例详解 觉得这个自定义的imageview很好用 性能不错 所以
- 【前言】Mybatis 除了 XML 配置写法,还可以使用注解写法。首先需要引入 Mybatis 的依赖:<dependency>
- 使用Mybatis-Plus的SqlSessionFactory问题前些日子工作中出现一个问题,项目中使用了MybatisPlus,然后出现
- 一、AtomicReference 基本使用我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入 AtomicReferenc
- 写在前面“The origin server did not find a current representation for the t
- 本文实例讲述了C#实现图形位置组合转换的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.C
- string fileExt = Path.GetExtension(excelPath);string conn = "&quo
- 最近发现Java原生的Zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。Apache的ant包中的压缩
- 本文实例讲述了Java Socket实现传输压缩对象的方法。分享给大家供大家参考,具体如下:前面文章《Java Socket实现的传输对象功
- 背景公司开发框架增加了web系统license授权证书校验模块,实行一台机器一个授权证书,初步方案是增加 * 针对全局请求进行拦截校验,评估
- 关于idea2021最新激活教程,请点击此处,获取最新激活教程还有一种激活方法,点击此处获取吧 !下面看下IDEA 2021.2 启动报错问
- 本文实例为大家分享了Java实现坦克大战小游戏的具体代码,供大家参考,具体内容如下创作背景:n年前的学期末课题设计,从b站上学的,一个代码一
- Gson反序列化原理原理简述gson反序列化主要分为两个过程:根据TypeToken创建出对象根据json字符串解析数据,对对象属性赋值对象