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流学习笔记的更多相关文章

  1. JAVA.IO流学习笔记

    一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...

  2. Java中的io流学习(了解四大基类和基本步骤)

    Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...

  3. IO流学习笔记(二)之BufferedWriter与BufferedReader及实例Demo

    在之前的学习笔记(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter与FileReader的Demo使用的中 ...

  4. Java基础之IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  5. 关于java读取文件IO流学习总结(一)

    IO流的分类: 1.根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Outpu ...

  6. java高级之Io流

    1.1,什么是io流? 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 ...

  7. IO流学习笔记(一)之FileWriter与FileReader

    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按照操作数据分为两种:字节流和字符流 流按流向分为:输入流和输出流 输入流和输出流是相对于 ...

  8. 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

    Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...

  9. java中File IO流的笔记

    1.File文件的属性和操作 boolean exists( )  判断文件或目录是否存在boolean isFile( )  判断是否是文件boolean isDirectory( ) 判断是否是目 ...

  10. 《Java并发编程实战》学习笔记

    第2章 线程安全性 正确性: 某个类的行为与其规范完全一致. 2.1线程安全: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或 ...

随机推荐

  1. 高通pmic voter机制

    前不久在高通 SDM450 平台接触了 voter 机制(投票机制).最近终于得空,结合一个问题简单研究了一下.现将研究流程简单记录一下,由于时间有限,所以是实用为目的,没有做详细的分析,不过结合着这 ...

  2. Android复习(四)权限—>仅在默认处理程序中使用的权限

    仅在默认处理程序中使用的权限 注意:本指南主要面向准备在 Google Play 商店发布应用的 Android 应用开发者.不过,无论您在哪里发布 Android 应用,为了保护用户隐私,最好都完成 ...

  3. 干货收藏!Calico 路由反射模式权威指南

    1. 概述 作为 Kubernetes 最长使用的一种网络插件,Calico 具有很强的扩展性,较优的资源利用和较少的依赖,相较于 Flannel 插件采用 Overlay 的网络,Calico 可以 ...

  4. 不用PLC和板卡,一台电脑就可以控制伺服

    1.前言 大家好!我是付工. EtherCAT是运动控制领域使用最广泛的总线通信协议之一. 如果我们只有一台电脑,能不能直接控制EtherCAT总线伺服呢? 这个是完全可以的. 我们可以在电脑上安装实 ...

  5. transformer论文解读

    1. 相关工作 2. 模型架构 3. 如何理解 Layer Norm 4. Encoder 和 Decoder 结构 5. 从 attention 到 Scaled Dot-Product Atten ...

  6. Andrew 算法求凸包

    Andrew 算法求凸包 参考资料: 右手定则(baidu.com) 内积和外积 - OI Wiki (oi-wiki.org) \(a\) 与 \(b\) 相对位置 \(b\) 在 \(a\) 的逆 ...

  7. 部署个SSH蜜罐玩玩,又能增强安全性,又能当电子蛐蛐

    前言 最近有个旧服务器的 SSL 证书过期了,每次都申请 SSL 证书太麻烦了,我直接把 swag 方案部署上去. 然后发现这个服务器在安全方面有所疏忽,所以又加固了一下,SSH 部分我想起来之前用过 ...

  8. 8.Kubernetes核心技术Pod

    Kubernetes核心技术Pod Pod概述 Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象 ...

  9. .NET Core 特性(Attribute)底层原理浅谈

    简介 烂大街的资料不再赘述,简单来说就是给代码看的注释 Attribute的使用场景 Attribute不仅仅局限于C#中,在整个.NET框架中都提供了非常大的拓展点,任何地方都有Attribute的 ...

  10. 教育账号无法登录OneDrive的一种解决方法

    众所周知,微软的服务总是能出现一些奇奇怪怪的问题,比如说教育账号无法登录OneDrive,尝试使用网上的临时解决方案失败 onedrive学生账号无法登录win10 OneDrive客户端 用户可以在 ...