【Java高级编程】IO流学习笔记
IO流
I(input)O(output)。
流的分类:
- 按照读写方向,分为输入流和输出流。(在程序角度分析)
- 按照读写内容单位而言,分为字节流和字符流
- 按照流的功能不同,分为节点流和处理流
- 字节流:直接连接在文件上
- 处理流:嵌套在其它流上
流的家族体系
| - | 输入 | 输出 |
|---|---|---|
| 字节流 | InputStream | OutputStream |
| 字符流 | Reader | Writer |
上面四个都是抽象类
对应文件流:
- 文件字节输入流 FileInputStream
- 文本字节输出流FileOutputStream
- 字符输入流:FileReader
- 字符输入流:FileWriter
File类
表示操作系统中的文件或者文件夹。
- 文件路径
- 绝对路径
- 相对路径
文件/文件夹基础操作
package eg01_file;
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
boolean result = false;
File file = new File("test01.txt"); // 该文件可有可无
try {
result = file.createNewFile();//create a file. create file not folder
System.out.println("文件创建"+ (result ?"成功":"失败"));
System.out.println(file.getParent());// 拿到上一级文件夹路径
System.out.println(file.getParentFile());//拿到上一级文件夹的文件对象
file.mkdir();//创建单个文件夹。
file.mkdirs();//支持同时创建多级目录
result = file.renameTo(new File("test01_change.txt"));
System.out.println("文件修改名称"+ (result ?"成功":"失败"));
//查看相关
System.out.println(file.exists());//文件是否存在
System.out.println(file.isAbsolute());//是否是绝对路径
System.out.println(file.isDirectory());//是否是文件夹
System.out.println(file.isFile());//是否是文件夹
System.out.println(file.length());//查看文件大小
} catch (IOException e) {
e.printStackTrace();//查看文件是否存在
}
}
}
创建文件的完整步骤
package eg01_file;
import java.io.File;
public class Test2 {
public static void main(String[] args) {
try{
File file = new File("abc/test2.txt");
//判断上层文件夹是否存在
File parentFile = file.getParentFile();
if(!parentFile.exists()){
//上层文件夹不存在,先创建
parentFile.mkdirs();
}
//创建文件
file.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
}
}
IO流 - 节点流
读入文件一个字节(一个字节)
不能读取中文。中文是2个字节一个字
package eg02_io;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestFileInputStream {
public static void main(String[] args) {
//创建流
try {
InputStream fis = new FileInputStream("test01.txt");
//----------------------------------------------
int result = fis.read();//读出来的是字符ASCII码
System.out.println((char) result);//强制转换
//----------------------------------------------
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileInputStream]字节数组的方式读取(读取全部内容)
package eg02_io;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestFileInputStream {
public static void main(String[] args) {
//创建流
try {
InputStream fis = new FileInputStream("test01.txt");
byte[] bs = new byte[1024];//一次读kb
int len = fis.read(bs);//读出来的是字节数组。返回值为读取的字节数量。
System.out.println(new String(bs, 0, len));//字节数组转为字符
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileInputStream]读取文件最重要的一套写法
package eg02_io;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestFileInputStream {
public static void main(String[] args) {
//创建流
try {
InputStream fis = new FileInputStream("test01.txt");
byte[] bs = new byte[1024];//一次读kb
int len = 0;
while ((len = fis.read(bs)) != -1) {// 不等于-1表示没读完,便继续读取。
//该写法仅限于IO流使用,其他地方不要用。
String s = new String(bs, 0, len);
System.out.println(s);
}
//关流
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileoutputStream]向文件写入内容
package eg02_io;
import java.io.File;
import java.io.FileOutputStream;
public class TestFileOutputStream {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream(new File("test01.txt"), true);//true追加。则不会清空原有数据
fos.write("牛啊牛啊,醉酒的向日狼".getBytes());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileReader]读入文件一个字符(两个字节)
package eg02_io;
import java.io.File;
import java.io.FileReader;
public class TestFileReader {
public static void main(String[] args) {
try {
FileReader fr = new FileReader(new File("test01.txt"));
int i = fr.read();//以字符为单位。
System.out.println((char) i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileReader]读入文件所有字符
package eg02_io;
import java.io.File;
import java.io.FileReader;
public class TestFileReader {
public static void main(String[] args) {
try {
FileReader fr = new FileReader(new File("test01.txt"));
char[] cs = new char[1024];
int len = fr.read(cs);
System.out.println(new String(cs, 0, len));
} catch (Exception e) {
e.printStackTrace();
}
}
}
对于存在大量内容需要读取时的写法
package eg02_io;
import java.io.File;
import java.io.FileReader;
public class TestFileReader {
public static void main(String[] args) {
try {
FileReader fr = new FileReader(new File("test01.txt"));
char[] cs = new char[1024];
int len = 0;
while ((len = fr.read(cs)) != -1) {
System.out.println(new String(cs, 0, len));
}
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
[FileWriter]向文件写入内容
package eg02_io;
import java.io.File;
import java.io.FileWriter;
public class TestFileWriter {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter(new File("test01.txt"), true);//追写则true
fw.write("刑啊,太刑了。");
fw.flush();
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如何选择流?
字节流:常用于读取非文本文件
字符流:常用于读取文件中的文字信息
IO流练习:复制图片操作
选择的流:字节流
package eg03_copypic;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class test3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(new File("1.jpg"));
FileOutputStream fos = new FileOutputStream(new File("2.jpg"),true);
byte[] bs = new byte[1024];
int len = 0;
while ((len = fis.read(bs))!=-1){
fos.write(bs,0,len);
}
fis.close();
fos.flush();
fos.close();
}
}
如果不是复制,而是剪切
package eg03_copypic;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class test3 {
public static void main(String[] args) throws IOException {
File file = new File("2.jpg");
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File("3.jpg"),true);
byte[] bs = new byte[1024];
int len = 0;
while ((len = fis.read(bs))!=-1){
fos.write(bs,0,len);
}
fis.close();
fos.flush();
fos.close();
file.delete();
}
}
IO流 - 处理流
缓冲流
缓冲流:带有缓冲区的数据流
重点是BufferedReader ,这是读取文本文件最好的方式
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWirter
package eg04.buffer;
import java.io.*;
public class test04 {
public static void main(String[] args) throws IOException {
// BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("test01.txt"))); //一般不用
BufferedReader br = new BufferedReader(new FileReader(new File("test01.txt")));
// System.out.println(br.readLine()); //读取文本文件最好用的方法。
// System.out.println(br.readLine());
String str = "";
while ((str= br.readLine())!=null){
//读取内容
System.out.println(str);
}
br.close();
}
}
转换流
字节流 ==> 字符流 :
- [输入] InputStreamReader
- [输出] OutputStreamWriter
package eg05_convert;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class test_out {
public static void main(String[] args) throws IOException {
// System.out.println();
Writer writer = new OutputStreamWriter(System.out);
writer.write("abc路人甲");
writer.flush();
//writer.close();//有时候流不可以关,如果这里关了,后面的 System.out.println(); 也不会输出。
System.out.println("关闭了流");
}
}
对象流
- ObjectInputStream
- ObjectOutputStream
[对象] Person.java
package eg06_obj;
public class Person {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
[测试] test06.java
package eg06_obj;
import java.io.*;
public class test06 {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("person.data")));
Person p = new Person(1,"萌狼蓝天",18);
oos.writeObject(p);
oos.flush();
oos.close();
}
}
[运行结果]报错

序列化:把一个对象转化为字节的过程
反序列化:把字节转化成对象
解决方案:在Java中只需要给类添加一个实现,Serialable。这样这个类就可以被序列化了。过程是全自动的。(实质:让数据可以进行序列化)
更改 Person.java
package eg06_obj;
import java.io.Serializable;
public class Person implements Serializable {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
此时运行,便不会报错。
那么如何读取呢?(反序列化)
package eg06_obj;
import java.io.*;
public class Test07 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("person.data")));
Object obj = ois.readObject();
Person p = (Person) obj;
System.out.println(p.getName());
}
}
文件修改操作
思路:偷梁换柱。逐行读取文件内容,将内容进行替换,将替换结果记录在一个新文件中,直到数据写入完毕,把源文件删除。
把新文件的名字改成源文件的名字
代码如下
package eg07_update;
import java.io.*;
import java.nio.Buffer;
public class test7 {
public static void main(String[] args) throws Exception {
File res = new File("test.txt");
//没有test.txt需要先手动创建,内容如下
/**
* 记录生活的博客:萌狼蓝天の小世界 - 萌狼蓝天 (mllt.cc)
*
* 记录学习笔记的博客:萌狼蓝天 - 博客园 (cnblogs.com)
*
* 分享信息技术相关内容的哔哩哔哩账号:萌狼蓝天的个人空间_哔哩哔哩_bilibili
*
* 分享个人生活的哔哩哔哩账号:醉酒的向日狼的个人空间_哔哩哔哩_bilibili
*
* 这四个网站是我主要活跃的网站
*
* 其中,mllt.cc这个网站是搭建在我自己服务器的,也许我会因为续费不起服务器而在2023年的时候关闭这个网站。
*
* 如果你想获取我的学习笔记,应该去看我的博客园
*
* 如果你想观看我录制的计算机相关知识视频,应该去看萌狼蓝天的个人空间_哔哩哔哩_bilibili
*/
File new_res = new File("副本_test.txt");
BufferedReader br = new BufferedReader(new FileReader(res));
BufferedWriter bw = new BufferedWriter(new FileWriter(new_res));
String line = "";
while((line = br.readLine())!=null){
line = line.replace("萌狼蓝天","易水千");
bw.write(line);
bw.newLine();//另起一行(换行)
}
br.close();
bw.flush();
bw.close();
//删除源文件
res.delete();
//重命名新文件
new_res.renameTo(res);
}
}
[运行结果]

【Java高级编程】IO流学习笔记的更多相关文章
- JAVA.IO流学习笔记
一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...
- Java中的io流学习(了解四大基类和基本步骤)
Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...
- IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo
在之前的学习笔记(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter与FileReader的Demo使用的中 ...
- Java基础之IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 关于java读取文件IO流学习总结(一)
IO流的分类: 1.根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Outpu ...
- java高级之Io流
1.1,什么是io流? 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 ...
- IO流学习笔记(一)之FileWriter与FileReader
IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按照操作数据分为两种:字节流和字符流 流按流向分为:输入流和输出流 输入流和输出流是相对于 ...
- 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
- java中File IO流的笔记
1.File文件的属性和操作 boolean exists( ) 判断文件或目录是否存在boolean isFile( ) 判断是否是文件boolean isDirectory( ) 判断是否是目 ...
- 《Java并发编程实战》学习笔记
第2章 线程安全性 正确性: 某个类的行为与其规范完全一致. 2.1线程安全: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或 ...
随机推荐
- USB协议详解第8讲(USB描述符-字符串和语言ID描述符)
1.字符串描述符相关概念 字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字.产品名字.产品序列号.各个配置名字.各个 ...
- 【ARMv8】异常级别的定义EL0、EL1、EL2、EL3
Exception levels ARMv8-A系列定义了一系列的异常等级,从EL0到EL3,下面具体说明其含义: ELn中,随着n的增加,软件的执行权限也相应的增加: EL0被称为无特权执行: EL ...
- 数据库周刊29│2020数据库研究报告;Oracle取消今年技术大会;腾讯云DBbridge发布支持一键迁库;饿了么迁至阿里云;PG数组查询;Oracle被比特币勒索;DM8 安全管理…
摘要:墨天轮数据库周刊第29期发布啦,每周1次推送本周数据库相关热门资讯.精选文章.干货文档. 热门资讯 1.快讯:2020年Oracle OOW大会因疫情取消 系近20年首度[摘要]Oracle ...
- logback.xml文件
<?xml version = "1.0" encoding="UTF-8"?> <configuration debug = "f ...
- Kali Linux 各版本开启ssh 服务
Kali Linux 各版本开启ssh 服务 2019版kali Linux SSH链接办法 修改kali关于SSH服务默认配置并重启SSH服务,步骤如下: 打开sshd_config文件 leafp ...
- grafana配置告警
首先,进入grafana控制面板,选择需要监控指标的区域,然后点击编辑 此时进入Alert页面会发现提示 Template variables are not supported in alert q ...
- Blazor 调用 Clipboard API 读写剪贴板数据
目录 简介 使用JS互操作 使用ClipLazor库 创建项目 使用方法 简单测试 参考链接 简介 Clipboard API 是一种允许网页读取剪贴板数据或向其中写入数据的API,主要有两个方法: ...
- Cut the Sequence(单调队列DP+set)
题面 大意:一段长度为n的序列,分成若干段,每段值的总和不能超过m,求各段中最大值加起来的最小值. 其实最朴素的DP还是很好想的,以f[i]表示i及i以前已经分好所需的最小值,a[i]表示i点的值,那 ...
- OpenSSH9.3p1升级实践
安装Telnet服务 为了避免升级OpenSSH导致服务器不可连接.需要先下载安装Telnet组件.升级期间使用Telnet作为升级期间的服务器连接方式. 先查询telnet是否安装 rpm -qa ...
- 技术前沿:AI大模型在自动化测试中的应用实例
哈喽,大家好,我是六哥!今天咱们来聊一聊如何用AI大模型(比如GPT-3.5)来做自动化测试,别看这东西听起来高大上,但也没那么神,跟着我咱们一步一步来,保证你也能轻松搞定,学会了保准让你在工作中老省 ...