Java输入输出处理

article/2025/9/12 14:54:37

活动地址:CSDN21天学习挑战赛
在这里插入图片描述
🍁博客主页:👉@不会压弯的小飞侠
欢迎关注:👉点赞👍收藏留言
系列专栏:👉21天挑战回顾java
知足上进,不负野心。
🔥欢迎大佬指正,一起学习!一起加油!

在这里插入图片描述

目录

  • 一、File类
    • 1.File类的构造方法
    • 2.File类的创建
    • 3.File类判断和获取
    • 4.File类的删除
  • 二、IO流
    • 1.io流的概述和分类
    • 2.字节流
      • 1.字节流写数据
      • 2.字节流写数据的三种方式
      • 3.换行和追加
      • 4.字节流读数据(一次只能读一个字节)
      • 5.字节流复制文本文件
      • 6.字节流读数据(一次读一个字节数组)(复制图片操作一样)
      • 7.字节缓冲流
    • 3.字符流
      • 1.字符串中编码解码问题
      • 2.字符流中编码解码问题
      • 3.字符流写数据的5种方式
      • 4.字符流读数据的2中方式
      • 5.字符缓冲流
      • 6.字符缓冲流特有功能


一、File类

1.File类的构造方法

方法名说明
File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
File(String parent, String child)从父路径名字符串和子路径名字符串创建新的File实例
File(File parent, String child)从父抽象路径名和子路径名字符串创建新的File实例

案例分析:

package com.file;
import java.io.File;
public class Test1 {public static void main(String[] args) {File f1=new File("F://Test//java.txt");System.out.println(f1);  //F:\Test\java.txtFile f2=new File("F://Test","java.txt");System.out.println(f2);  //F:\Test\java.txtFile f3=new File("F://Test");File f4=new File(f3,"java.txt");System.out.println(f4);  //F:\Test\java.txt}
}

2.File类的创建

方法名说明
public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
public boolean mkdir()创建由此抽象路径名命名的目录
public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录

案例分析:

package com.file;
import java.io.File;
import java.io.IOException;
public class Test2 {public static void main(String[] args) throws IOException {//在F盘的Test目录下创建一个test.txt文件File f1=new File("F://Test//test.txt");System.out.println(f1.createNewFile());  //true//在F盘的Test目录下创建一个Spring目录File f2=new File("F://Test//Spring");System.out.println(f2.mkdir());  //true//在F盘的Test目录下创建多个目录File f3=new File("F://Test//MyBatis//SpringMVC");System.out.println(f3.mkdirs());   //true}
}

3.File类判断和获取

方法名说明
public boolean isDirectory()测试此抽象路径名表示的File是否为目录
public boolean isFile()测试此抽象路径名表示的File是否为文件
public boolean exists()测试此抽象路径名表示的File是否存在
public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
public String getPath()将此抽象路径名转换为路径名字符串
public String getName()返回由此抽象路径名表示的文件或目录的名称
public String[] list()返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
public File[]listFiles()返回此抽象路径名表示的目录中的文件和目录的File对象数组

案例分析:

package com.file;import java.io.File;public class Test3 {public static void main(String[] args) {File f=new File("F:\\Test\\java.txt");System.out.println(f.isDirectory());  //falseSystem.out.println(f.isFile());  //trueSystem.out.println(f.exists());   //trueSystem.out.println(f.getAbsoluteFile());   //F:\Test\java.txtSystem.out.println(f.getPath());    //F:\Test\java.txtSystem.out.println(f.getName());   //java.txtFile f1=new File("F:\\Test");String[] list = f1.list();for (String s : list) {System.out.println(s); /*
a
b
java.txt
MyBatis
Spring
test.txt
TestOne
小飞侠
小马哥*/}File[] files = f1.listFiles();for (File file : files) {System.out.println(file);
/*
F:\Test\a
F:\Test\b
F:\Test\java.txt
F:\Test\MyBatis
F:\Test\Spring
F:\Test\test.txt
F:\Test\TestOne
F:\Test\小飞侠
F:\Test\小马哥            */}}
}

4.File类的删除

方法名说明
public boolean delete()删除由此抽象路径名表示的文件或目录
  • 绝对路径和相对路径的区别
    • 绝对路径: 完整的路径名,不需要任何其他信息就可以定位它所表示的文件。
      • 例如: E:\\study\\text.txt
    • 相对路径: 使用取自其他路径名的信息进行解释。
      • 例: study\\text.txt

案例分析:

package com.file;import java.io.File;
import java.io.IOException;public class Test4 {public static void main(String[] args) throws IOException {//在当前模块下创建one.txt文件File f1=new File("E:\\JavaSE\\Test\\File\\one.txt");  //trueSystem.out.println(f1.createNewFile());//删除当前模块下创建one.txt文件System.out.println(f1.delete());   true//在当前模块下创建one目录File f2=new File("E:\\JavaSE\\Test\\File\\one");System.out.println(f2.mkdir());   true//删除当前模块下创建one目录System.out.println(f2.delete());   true}
}

二、IO流

1.io流的概述和分类

  • IO:输入/输出(Input/Output)

    • 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
  • IO流就是用来处理设备间数据传输问题的

    • 常见的应用:文件复制;文件上传;文件下载
  • IO流分类:

    • 按照数据的流向
      • 输入流:读数据
      • 输出流:写数据
  • 按照数据类型来分

    • 字节流
      • 字节输入流;字节输出流
    • 字符流
      • 字符输入流;字符输出流
  • 一般来说,IO流的分类是按照数据类型来分的

2.字节流

1.字节流写数据

  • 字节流抽象基类
    • lnputStream: 这个抽象类是表示字节输入流的所有类的超类
    • OutputStream: 这个抽象类是表示字节输出流的所有类的超类
    • 子类名特点: 子类名称都是以其父类名作为子类名的后缀
  • FileOutputStream: 文件输出流用于将数据写入File
    • FileOutputStream(Stringname): 创建文件输出流以指定的名称写入文件

案例分析:

package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test1 {public static void main(String[] args) throws IOException {//创建字节输出流对象FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");//将字节写入此文件输出流f.write(97);   //a//释放资源f.close();}
}

2.字节流写数据的三种方式

方法名说明
void write(int b)将指定的字节写入此文件输出流,一次写一个字节数据
void write(byte[] b)将b.length字节从指定的字节数组写入此文件输出流,一次写一个字节数组数据
void write(byte[] b, int off, int len)将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流,一次写一个字节数组的部分数据

案例分析:

package com.outPutstream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test2 {public static void main(String[] args) throws IOException {//创建字节输出流对象FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");//将字节写入此文件输出流/* f.write(97);f.write(98);f.write(99);f.write(100); */  //abcd//将指定的字节数组写入此文件输出流byte[] bytes={97,98,99,100};//f.write(bytes); //abcdf.write(bytes,1,2);   //bc//释放资源f.close();}
}

3.换行和追加

  • 字节流写数据实现换行
  • 写完数据后,加换行符
    • windows:\n
    • linux:\n
    • mac:\r
  • 字节流写数据实现追加写入
    • public FileOutputStream(Stringname,boolean append)
    • 创建文件输出流以指定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头

案例分析:

package com.outPutstream;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Test3 {public static void main(String[] args) throws IOException {FileOutputStream f = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt",true);for (int i = 0; i <5 ; i++) {f.write("hello".getBytes());f.write("\r\n".getBytes());}f.close();}
}
//执行三次的结果
/*
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello*/

4.字节流读数据(一次只能读一个字节)

  • FilelnputStream:从文件系统中的文件获取输入字节
    • FilelnputStream(String name):通过打开与实际文件的连接来创建一个FilelnputStream,该文件由文件系统中的路径名name命名
  • 使用字节输入流读数据的步骤:
    • 创建字节输入流对象
    • 调用字节输入流对象的读数据方法
    • 释放资源

案例分析:

package com.FileInputStream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test1 {public static void main(String[] args) throws IOException {//创建字节输入流对象FileInputStream f = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");//读取数据/*int by = f.read();System.out.println(by);  //97System.out.println((char)by);  //a*///一次只能读取一个字节int by = f.read();while (by != -1){System.out.print((char) by);  //abcby=f.read();}//释放资源f.close();}
}

5.字节流复制文本文件

案例:

package com.FileInputStream;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Test2 {public static void main(String[] args) throws IOException {FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");FileOutputStream f2 = new FileOutputStream("E:\\JavaSE\\Test\\File\\outputStream.txt");int by = f1.read();while (by !=-1){f2.write((char)by);by=f1.read();}}
}

6.字节流读数据(一次读一个字节数组)(复制图片操作一样)

案例:

package com.FileInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test3 {public static void main(String[] args) throws IOException {FileInputStream f1 = new FileInputStream("E:\\JavaSE\\Test\\File\\inputStream.txt");byte[] bytes=new byte[1024];int by;by = f1.read(bytes);while (by !=-1){System.out.println(new String(bytes,0,by));by=f1.read(bytes);}}
}
/*
Java
JavaWeb
Python
Spring
Mybatis*/

7.字节缓冲流

案例:

package com.BufferStream;import java.io.*;public class Test1 {public static void main(String[] args) throws IOException {BufferedOutputStream b1 = new BufferedOutputStream(new FileOutputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));b1.write("Hello".getBytes());b1.write("\r\t".getBytes());b1.write("World".getBytes());b1.close();BufferedInputStream b2 = new BufferedInputStream(new FileInputStream("E:\\JavaSE\\Test\\File\\buffer.txt"));int by = b2.read();while (by !=-1){System.out.print((char)by);by=b2.read();}b2.close();}
}

3.字符流

1.字符串中编码解码问题

  • 编码:
    • bytegetBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
    • bytel]getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • 解码
    • String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
    • String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

案例分析:

package com.zifu;import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class Test1 {public static void main(String[] args) throws UnsupportedEncodingException {/*String s1="小马哥";byte[] bytes = s1.getBytes();System.out.println(Arrays.toString(bytes));  //[-27, -80, -113, -23, -87, -84, -27, -109, -91]//String s=new String(bytes);  //小马哥String s=new String(bytes,"UTF-8");  //小马哥System.out.println(s);*/String s2="小飞侠";byte[] bytes =s2.getBytes("GBK");System.out.println(Arrays.toString(bytes));  //[-48, -95, -73, -55, -49, -64]String s=new String(bytes,"GBK");System.out.println(s);  //小飞侠}
}

2.字符流中编码解码问题

  • InputStreamReader:是从字节流到字符流的桥梁
    • 它读取字节,并使用指定的编码将其解码为字符
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
  • OutputStreamlriter:是从字符流到字节流的桥梁
    • 是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

案例分析:

package com.zifu;import java.io.*;public class Test2 {public static void main(String[] args) throws Exception {OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");o.write("小飞侠");o.close();InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"),"GBK");int by = i.read();while (by !=-1){System.out.print((char)by);  //小飞侠by=i.read();}}
}

3.字符流写数据的5种方式

方法名说明
void write(int c)写一个字符
void write(char[]cbuf)写入一个字符数组
void write(char[]cbuf, int off, int len)写入字符数组的一部分
void write(String str)写一个字符串
void write(String str, int off, int len)写一个字符串的一部分

案例分析:

package com.zifu;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;public class Test3 {public static void main(String[] args) throws Exception {OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("E:\\JavaSE\\Test\\File\\java.txt"));//写一个字符o.write("97");  //97o.write("a");  //a//刷新流o.flush();//写一个字符数组char[] chars={'a','b','c','d','e'};  //abcde//o.write(chars);//写一个字符数组的一部分o.write(chars,0,chars.length);  //abcdeo.write(chars,1,3);  //bcd//写一个字符串//o.write("xyz");  //xyz//写一个字符串的一部分o.write("asdfghj",1,5);  //sdfgho.close();}
}

4.字符流读数据的2中方式

方法名说明
int read()一次读一个字符数据
int read(char[] cbuf)一次读一个字符数组数据

案例分析:

package com.zifu;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;public class Test4 {public static void main(String[] args) throws IOException {InputStreamReader i = new InputStreamReader(new FileInputStream("E:\\JavaSE\\Test\\File\\java.txt"));//一次读一个字符数据int by = i.read();while (by !=-1){System.out.print((char)by);  //aabcdebcdsdfghby=i.read();}//一次读一个字符数组char[] chars=new char[1024];int c = i.read(chars);while (c!=-1){System.out.println(new String(chars,0,c));c=i.read(chars);
/*
aab
cde
bcds
dfgh            */}}
}

5.字符缓冲流

  • 字符缓冲流:
    • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲 区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
    • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途
  • 构造方法:
    • BufferedWriter(Writer out)
    • BufferedReader(Reader in)

案例分析:

package com.zifu;import java.io.*;public class Test5 {public static void main(String[] args) throws IOException {/*BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));w.write("Hello");w.write("\r\n");w.write("World");*/BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));int by = r.read();while (by!=-1){System.out.print((char)by);
/*
Hello
World                                           */by=r.read();}//w.close();r.close();}
}

6.字符缓冲流特有功能

  • BufferedWriter:
    • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
  • BufferedReader:
    • public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

案例分析:

package com.zifu;import java.io.*;public class Test6 {public static void main(String[] args) throws IOException {BufferedWriter w = new BufferedWriter(new FileWriter("E:\\JavaSE\\Test\\File\\java.txt"));for (int i = 0; i <5 ; i++) {w.write("Java"+i);
/*
Java0
Java1
Java2
Java3
Java4*///换行w.newLine();w.flush();}w.close();BufferedReader r = new BufferedReader(new FileReader("E:\\JavaSE\\Test\\File\\java.txt"));/*String s = r.readLine();while (s!=null){System.out.println(s);s=r.readLine();}*/String s;while ((s=r.readLine())!=null){System.out.println(s);}}
}
/*
Java0
Java1
Java2
Java3
Java4*/

http://chatgpt.dhexx.cn/article/wMqv9Zc7.shtml

相关文章

java 输入输出总结(牛客、笔试、机试)

因为踩过坑&#xff0c;所以特别整理了一下&#xff0c;发现其实不少小伙伴同样都是这样&#xff0c;特别简单小结一下&#xff0c;java网上笔试的时候OJ的一些要求的实例 1 单行输入 // 本题为考试单行多行输入输出规范示例&#xff0c;无需提交&#xff0c;不计分。 import j…

java输入输出的方法

java输入输出 目录 一、控制台输入输出 二、文件读写 一、控制台输入输出 java控制台的输入输出主要依赖于scanner类&#xff0c;使用Scanner scannernew Scanner(System.in)获取了控制台输入的字段&#xff0c;其中system.in就表示这个对象读取的是控制台。 public static …

java读取输出流_Java输入输出流

1什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Ja…

Java 输入输出流学习总结

文章目录 前言&#xff1a;为什么要有输入输出流一、Java 的标准输入输出标准输入 System.in标准输出 System.out程序 exp8_3&#xff1a;简单的输入输出 二、输入输出流框架三、输入输出流类的应用课本程序 exp8.4改写 exp8.4(1)改写 exp_8.4(2) 四、RandomAccessFile 类输入输…

java 输入输出流

java I/O流 在java中所有数据都是使用流读写的。流是一组有序的数据序列&#xff0c;将数据从一个地方带到另一个地方。根据数据流向的不同&#xff0c;可以分为输入&#xff08;Input&#xff09;流和输出&#xff08;Output&#xff09;流两种。 为什么要使用输入输出流 例…

Java(2)-Java IO输入输出流

一.什么是IO Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读…

Java——输入输出

本篇主要介绍Java的输入与输出&#xff0c;当然&#xff0c;这里说的是控制台下的输入与输出&#xff0c;窗口程序的设计将会再后续篇章中有详细说明。   Java的输出很简单&#xff0c;调用System.out.println()即可打印输出你想要输出的内容。我们之前也已经看到过。调用pr…

C语言之static关键字详解

目录 前言&#xff1a; 一、几个概念 1.变量 2.局部变量和全局变量 3.变量的作用域 4.变量的生命周期 二、static关键字的作用 三、static关键字修饰局部变量 四、static关键字修饰全局变量 五、static关键字修饰函数 写在最后&#xff1a; 前言&#xff1a; static&am…

static关键字你真的懂了吗?

文章目录 static关键字1、Java中的static1.1 static关键字的定义和性质1.2 实例变量与静态变量1.2.1 实例变量1.2.2 静态变量 1.3 静态代码块1.4 *实例语句块 / 代码块1.5 static总结1.5.1 对java语句的解读1.5.2 什么时候定义为静态的&#xff1f; 2、C/C中的static2.1 局部变…

C语言extern和static关键字详解

C语言extern和static关键字详解 文章目录 1 前言2 作用域2.1 代码块作用域2.2 文件作用域 3 存储类型4 链接属性5 extern和static关键字5.1 extern关键字5.2 static关键字 1 前言 在讲extern和static关键字前&#xff0c;先讲几点相关的基础知识——作用域、存储类型、链接属性…

什么是static关键字

什么是static关键字 static关键字我们经常接触&#xff0c;不过我们一直没有讨论过它到底是什么&#xff0c;有什么具体的作用&#xff0c;那static关键字是什么呢&#xff0c;有啥用呢&#xff1f; static是静态的意思&#xff0c;是一个修饰符&#xff0c;就像是一个形容词&…

static关键字(java)

一、static的用途 1.static修饰的变量和方法是属于类的&#xff1b; 2.static修饰的变量和对象&#xff0c;方法存储在方法区的静态常量池中&#xff1b;是共享的&#xff1b; 3.可以在没有创建任何对象的前提下&#xff0c;仅仅通过类本身来调用static方法 4.static修饰的…

static关键字的用法

static关键字用法 目录 一.概述二.使用动机三.使用方法 static关键字修饰类static关键字修饰方法static关键字修饰变量static关键字修饰代码块 一. 概述 > static是一个静态修饰符关键字&#xff0c;表示静态的意思&#xff0c; ①方便在没有创建对象的情况下进行调用。可…

static 关键字用法总结

一、static 关键字的含义 static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块&#xff0c;修饰成员变量表示全局静态成员变量&#xff0c;修饰方法表示静态方法。(注意&#xff1a;不能修饰普通类&#xff0c;除了内部类&#xff0c;这是为什么&#…

java static关键字的作用是什么_static关键字有什么作用

今天主要学习下Java语言中的static关键字。 static关键字的含义及使用场景 static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)class A …

static关键字的作用

目录 C语言中static关键字的作用 1.static关键字修饰局部变量 2.static关键字修饰全局变量 3.static关键字修饰函数 在C中static关键的作用 1.静态成员变量 2.静态成员函数 C语言中static关键字的作用 1.static关键字修饰局部变量 概念&#xff1a; static修饰局部变量就…

静态关键词:static

static关键字的作用 static是静态的意思&#xff0c;可以修饰成员变量&#xff0c;表示给成员变量只在内存中存储一份&#xff0c;可以被共享访问、修改 成员变量可以分为2类1、静态成员变量&#xff08;有static修饰&#xff0c;属于类&#xff0c;内存中加载一次&#xff…

C# -- static 关键字

一、static关键字 static 关键字&#xff0c;用于修饰类&#xff0c;字段&#xff0c;属性&#xff0c;方法&#xff0c;构造方法等。被 static 修饰的类称之为“静态类”&#xff1b; 被 static 修饰的成员称之为“静态成员”&#xff0c;被修饰过的成员分别称为&#xff1a;…

static关键字详解

1.概述&#xff1a; static&#xff1a;就是多个对象共享同一份数据 一个类的不同对象有些共享的数据&#xff0c;这样我们就可以使用static来修饰 一旦使用了static关键字&#xff0c;那么这样的内容不再属于对象&#xff0c;而是属于类的&#xff0c;所以凡是本类的对象&…

在 C/C++中 static 关键字详解

static 关键字详解 C/C 中的 static1. 静态局部变量2. 静态全局变量全局变量 与 extren 3. static 修饰函数 C的 static 成员静态成员变量const修饰的成员除外 静态成员函数 总结&#xff1a; static是 C/C中的关键字之一&#xff0c;是常见的函数与变量&#xff08;C中还包括类…