主打的就是I/O流,顺便把File复习了

news2024/9/23 1:39:24

文章目录

  • 1. File类
    • 1.1 预备知识
    • 1.2 创建文件
    • 1.3 文件的常用方法
  • 2. IO流
    • 2.1 InputStream
    • 2.2 OutputStream
    • 2.3 Reader
    • 2.4 Writer
    • 2.5 缓冲流
    • 2.6 转换流
    • 2.7 对象流
    • 2.8 打印流

1. File类

1.1 预备知识

  1. 文件分隔符
  • Windows:D:\Soft\QQ\Plugin
  • Linux:D:/Soft/QQ/Plugin
  1. 换行
  • Windows:换行 = 回车+换行,即\r\n
  • Linux:换行 = 换行,即\n
  1. IDEA默认的当前路径

工程Project的根就是IDEA的默认当前路径

  1. IDEA文件分隔符格式
  • Windows: File file = new File(D:\test\test.txt);
  • Linux:File file = new File(D://test//test.txt);
  • 统一:File testFile = new File(“D:” + File.separator + “test” + File.separator + fileName);

1.2 创建文件

public class FileTest {
    public static void main(String[] args) throws IOException {
    
    	// 创建D:\filepath\test\test.txt
        File testFile = new File("D:\filepath\test\test.txt");
        // 获取test.txt文件的上级路径
        File fileParent = testFile.getParentFile();
		// 创建多级目录
        if (!fileParent.exists()) {
            fileParent.mkdirs();
        }
        // 创建文件
        if (!testFile.exists())
            testFile.createNewFile();
 
        System.out.println("path:"+testFile.getPath());
        System.out.println("absolutePath:"+testFile.getAbsolutePath());
        System.out.println("getFileName:"+testFile.getName());
    }
}

path:D:\filepath\test\test.txt
absolutePath:D:\filepath\test\test.txt
getFileName:test.txt

1.3 文件的常用方法

public class FileGet {
    public static void main(String[] args) {
        File f = new File("d:/aaa/bbb.java");    
        //文件绝对路径:d:\aaa\bbb.java 
        System.out.println("文件绝对路径:"+f.getAbsolutePath());
        //文件构造路径:d:\aaa\bbb.java
        System.out.println("文件构造路径:"+f.getPath());
        //文件名称:bbb.java
        System.out.println("文件名称:"+f.getName());
        //文件长度:2116字节
        System.out.println("文件长度:"+f.length()+"字节");
        //是否存在:true
        System.out.println(f.exists());
    }
}

2. IO流

2.1 InputStream

  1. 构造方法
// 1. 使用File对象创建流对象
FileInputStream fin = new FileInputStream(new File("G:\\b.txt"));
      
// 2. 使用文件名称创建流对象
FileInputStream fin = new FileInputStream("G:\\b.txt");
  1. 读取数据
    read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾为空,返回-1。
public class FISRead {
    public static void main(String[] args) throws IOException{

       	FileInputStream fis = new FileInputStream("read.txt");

        int b;
        
        while ((b = fis.read())!=-1) {
            System.out.println((char)b);
        }

        fis.close();
    }
}

从输入流读取一些字节数,并将它们存储到缓冲区b 。 实际读取的字节数作为整数返回。
3. 错误读取

public class FISRead {
    public static void main(String[] args) throws IOException{
       	FileInputStream fis = new FileInputStream("read.txt"); // read.txt文件中内容为abcde
        int len;  
        byte[] b = new byte[2];
        while (( len= fis.read(b))!=-1) {
            System.out.println(new String(b));
        }
        fis.close();
    }
}
输出结果:
ab
cd
ed

分析: 由于read.txt文件中内容为abcde,而错误数据d,是由于最后一次读取时,只读取一个字节e,数组中,上次读取的数据没有被完全替换【注意是替换,看下图】,所以要通过len ,获取有效的字节

public class FISRead {
    public static void main(String[] args) throws IOException{
      	// 使用文件名称创建流对象.
       	FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde
      	// 定义变量,作为有效个数
        int len ;
        // 定义字节数组,作为装字节数据的容器   
        byte[] b = new byte[2];
        // 循环读取
        while (( len= fis.read(b))!=-1) {
           	// 每次读取后,把数组的有效字节部分,变成字符串打印
            System.out.println(new String(b,0,len));//  len 每次读取的有效字节个数
        }
		// 关闭资源
        fis.close();
    }
}

输出结果:
ab
cd
e

2.2 OutputStream

  1. 构造方法
// 1. 使用File对象创建流对象
FileOutputStream fos = new FileOutputStream(new File("G:\\b.txt"));
      
// 2. 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("G:\\b.txt");

// 3. 使用File对象创建流对象,并开启数据追加功能
FileOutputStream fos = new FileOutputStream(new File("G:\\b.txt"), true);

// 4. 使用文件名创建流对象,并开启数据追加功能
FileOutputStream fos = new FileOutputStream("G:\\b.txt", true)
  1. 输出数据
public class IoWrite {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("fos.txt");     
      	// 1. write(int b)
      	fos.write(97);  

		//2. write(byte[] b)
      	byte[] b = "麻麻我想吃烤山药".getBytes();
      	fos.write(b);

		//3. write(byte[] b, int off, int len)
		byte[] b = "abcde".getBytes();
        fos.write(b,2,2);
        
      	fos.close();
    }
}

2.3 Reader

  1. 构造器
// 1. 使用File对象创建流对象
FileReader fr = new FileReader(new File("G:\\b.txt"));
      
// 2. 使用文件名称创建流对象
FileInputStream fos = new FileInputStream("G:\\b.txt");
  1. 读取字符
public class FRRead {
    public static void main(String[] args) throws IOException {
       	FileReader fr = new FileReader("G:\\b.txt");
        int b;
        while ((b = fr.read())!=-1) {
            System.out.println((char)b);
        }
        fr.close();
    }
}

2.4 Writer

  1. 构造方法
   	 	// 第一种:使用File对象创建流对象
        FileWriter fw = new FileWriter(new File("G:\\b.txt"));
      
        // 第二种:使用文件名称创建流对象
        FileWriter fw = new FileWriter("G:\\b.txt");

// 1. 使用File对象创建流对象
FileWriter fw = new FileWriter(new File("G:\\b.txt"));
      
// 2. 使用文件名称创建流对象
FileWriter fw = new FileWriter("G:\\b.txt");

// 3. 使用File对象创建流对象,并开启数据追加功能
FileWriter fw = new FileWriter(new File("G:\\b.txt"), true);

// 4. 使用文件名创建流对象,并开启数据追加功能
FileWriter fw = new FileWriter("G:\\b.txt", true)
  1. 写出数据
    flush :刷新缓冲区,流对象可以继续使用。
    close:刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
public class FWWrite {
    public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("fw.txt");     
      	// 写出数据
      	fw.write(97); // 写出第1个字符
      	fw.write('b'); // 写出第2个字符
      	fw.write('C'); // 写出第3个字符
      	
        fw.close();
    }
}
输出结果:
abC

2.5 缓冲流

//1. 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("b.txt"));

//2. 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));

//3. 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("b.txt"));

//4. 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

2.6 转换流

InputStreamReader字节流到字符流的桥梁,OutputStreamWriter字符流到字节流的桥梁。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。
在这里插入图片描述
在这里插入图片描述
对于OutputStreamWriter字符流到字节流的桥梁,很多人也认为是字节流到字符流的桥梁,其实不难解释。程序猿要看的是字符,计算机要存储的是字节,那我Input进来就是字节转字符,Ouput出去就是字符转字节,没毛病!

2.7 对象流

1. 何谓序列化
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。看图理解序列化

2. 序列化和反序列化的两个类
在这里插入图片描述
3. 可序列化的两个条件

  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
  • 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
public class Employee implements java.io.Serializable {
    public String name;
    public String address;
    public transient int age; // transient瞬态修饰成员,不会被序列化
    public void addressCheck() {
      	System.out.println("Address  check : " + name + " -- " + address);
    }
}
public class SerializeDemo{
   	public static void main(String [] args)   {
    	Employee e = new Employee();
    	e.name = "zhangsan";
    	e.address = "beiqinglu";
    	e.age = 20; 
    	try {
          ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.txt"));
        	out.writeObject(e);
        	out.close();
        	fileOut.close();
        } catch(IOException i)   {
            i.printStackTrace();
        }
   	}
}

2.8 打印流

  1. 字节打印流PrintStream
public class PrintStreamDemo {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new FileReader("copy.txt"));
        PrintStream ps=new PrintStream("printcopy.txt");
        String line;
        while((line=br.readLine())!=null) {
            ps.println(line);
        }
        br.close();
        ps.close();
    }
}
  1. 字符打印流PrintWriter
public class PrintWriterDemo {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new FileReader("aa.txt"));
        PrintWriter pw=new PrintWriter("printcopyaa.txt");
        String line;
        while((line=br.readLine())!=null) {
            pw.println(line);
        }
        br.close();
        pw.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC使用 redis 实现缓存

简介 SpringMVC 中也可以将缓存标签和 redis 结合起来使用,其实此时缓存没有起作用,只是通过缓存的那几个注解来操作 redis 而已;SpringMVC 中整合 redis 比较麻烦的是注意版本冲突的问题,如下是官网有关于版本的要求 https://d…

【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果

论文题目:《Improving Face Recognition from Hard Samples via Distribution Distillation Loss》 论文地址:https://arxiv.org/pdf/2002.03662v3.pdf 代码地址:https://github.com/HuangYG123/DDL 1.前言及相关工作 Large facial variatio…

秒懂算法 | 基于图神经网络的推荐算法

图神经网络(Graph Neural Networks,GNN)是近几年兴起的学科,用来作推荐算法自然效果也相当好,但是要学会基于图神经网络的推荐算法之前,需要对图神经网络自身有个了解。 图卷积网络(Graph Convolutional Networks,GCN)提出于2017年。GCN 的出现标志着图神经网络的出现。深度学习…

大家一起来找茬,新手第一次layout到底能挑出多少毛病?

有一个新手工程师在论坛上发了一篇帖子,把自己的处女PCB布线图贴出来。 如果不看其他网友的评论,你能看出多少问题呢?可以在留言区和我们互动哦~ 帖子里他还提出了自己的小见解:问一下,我觉得自动布线挺好用的啊&#…

汽车标定知识整理(一):标定简介与CCP报文协议简介

目录 一、什么是标定 二、XCP与CCP 三、CCP报文协议简介 1、CCP报文协议简介 (1)CRO:Command Receive Object ,命令接收对象(由Master -> Slave) (2)DTO:Data T…

Kotlin 39. Dependency Injection依赖注入以及Hilt在Kotlin中的使用,系列2:手动依赖注入

一起来学Kotlin:概念:26. Dependency Injection依赖注入以及Hilt在Kotlin中的使用,系列2:手动依赖注入 此系列博客中,我们将主要介绍: Dependency Injection(依赖注入) 概念介绍。…

当IDEA加载一个MAVEN新项目时,加载不成功,无法加载依赖的解决方法

当IDEA加载一个MAVEN新项目时,加载不成功,无法加载依赖的解决方法 此文为练习项目时的错误记录 当使用IDEA引入一个MAVEN新项目时,点击Reload maven按钮加载不成功,显示如下图界面: 在项目中的代码显示报红&#xff0c…

urllib之ProxyHandler代理以及CookieJar的cookie内存传递和本地保存与读取的使用详解

处理更高级操作时(Cookies处理,代理设置),需要一个强大的工具Handler,可以理解成各种处理器,有处理登录认证的、有处理Cookies的、有处理代理设置的。利用这些几乎可以做到HTTP请求中所有事情。当中urllib.request模块里的 BaseHa…

机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 作者:AOAIYI 作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞…

MySQL实战解析底层---基础架构:一条SQL查询语句是如何执行的?

目录 前言 连接器 查询缓存 分析器 优化器 执行器 前言 平时使用数据库,看到的通常都是一个整体比如,有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时: 看到的只是输入一条语句,返回…

微电影广告的内容突破方案

微电影作为新媒体时代背景的产物,深受大众的欢迎,同时,微电影广告在微电影模式环境下应运而生,以自己独特的传播优势,俘获了大量企业主的青睐,也获得了广大青年群体的喜爱。微电影广告欲确保可持续发展&…

Android App异常崩溃处理详解

异常崩溃是Android项目中一个棘手的问题,即使你做了很多的try - catch处理,也不能保证不崩溃,一旦崩溃就会出现下图的弹窗,xx应用就会停止运行这种体验对于用户来说是很差的,所以很明显我们做的app已经崩溃了。 像现在…

社科院与杜兰大学金融管理硕士项目——在这里共同改变,一起前行

人这一生,要走很长的路,才能确定前行的方向,在路上遇到很多的人,才知道与谁同行。在人生旅程中,保持怎样的姿态前行,往往与身边的人有很大关系。身边的人都很努力,你也会跟着努力上进。怀揣着在…

Synchronized,我要一层一层剥开你的心

三种应用方式 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。修饰代码块,指定加锁对象,对给定对象加锁&a…

TypeScript 使用 ES6 解构骚操作

TypeScript 使用 ES6 解构骚操作 文章目录TypeScript 使用 ES6 解构骚操作一、TypeScript 对象解构二、TypeScript 函数参数解构四、参考资料💘五、推荐博文🍗一、TypeScript 对象解构 我们都知道 ES6 的数据解构功能很强大,一行命令就能够声…

HTMLCSS常见问题解决

文章目录一、解决img图片底部空白问题1、出现问题的效果2、原理3、解决方式3.1、将图片变为盒子3.2、处理基线3.3、把上级元素的字体大小改成0像素二、解决给子元素设置margin-top父子盒子都向下移动问题1、出现问题的效果2、原理3、解决方式3.1、给父元素设置边框3.2、给父元素…

程序员多赚20k的接私活必备网站

为什么都是程序员,就有人能多赚20k?那是因为副业搞得那么溜啊! 今天分享一些程序员搞钱必备的接私活网站,让更多程序员们在工作之余能有另外一份收入。 1.程序员客栈:http://proginn.com 专为程序员服务的软件外包对…

跨境电商代购系统演示说明

首先来看什么是淘宝代购淘宝代购是近年兴起的一种购物模式,是帮国外客户购买中国商品。主要是通过万邦 科技的外贸代购系统,把淘宝、天猫等电商平台的全站商品通过API 接入到你的网站 上,瞬间就可以架设一个有数亿产品的大型网上商城&#xf…

FATE联邦学习centos成功部署

官方文档:https://fate.readthedocs.io/en/latest/deploy/standalone-deploy/#1-description。 我用的文档中的Standalone的第二种安装方式,没用docker。 安装过程 文档上写着确定版本 export version1.7.0但是你别真的用1.7.0啊! &#…

ATS认证教学

我用的版本是ATS7.11、系统版本是用最新的ios13.2.1 定义 ATS旨在分析通过UART、USB和蓝牙传输传输的iAP流量、通过USB和无线(蓝牙和Wi-Fi)传输的CarPlay流量、通过Wi-Fi传输的AirPlay 2流量以及闪电音频流量。 ATS是Apple’s Accessory Test System的…