当前位置: 代码迷 >> 综合 >> JavaIO 输入输出流
  详细解决方案

JavaIO 输入输出流

热度:70   发布时间:2023-11-19 14:01:06.0

JavaIO 输入输出流

?File类

在Java的iO包中,java.io.File,使用该类的构造函数就可以创建文件对象,将硬盘中的一个具体的文件以Java对象的形式来表示。

方法 描述
public File(String pathname) 根据路径创建对象
public String getName() 获取文件名
public String getParent() 获取文件所在目录
public File getParentFile() 获取文件所在目录对应的File对象
public String getPath() 获取文件路径
public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
public long length() 返回由此抽象路径名表示的文件的长度。
public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
public boolean delete() 删除此抽象路径名表示的文件或目录。
public boolean mkdir() 创建此抽象路径名指定的目录。
public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。

?注意:

  1. 方法定义时的异常如果直接继承自Exception,事迹调用的时候需要手动处理(捕获异常/丢给虚拟机去处理)。
  2. 方法定义时的异常如果继承自RuntimeException,调用的时候不需要处理。
  3. 创建File对象必须传绝对路径,不可以是相对路径,File他是读取硬盘里面的东西,跟读取配置文件是两回事,读取配置文件可以使用相对路径。

IO流

?按照方向分,可以分为输入流和输出流
?按照单位分,可以分为字节流和字符流。
?按照功能分,可以分为节点流和处理流。

字节流

字节流有输入字节流和输出字节流
InputStream、OutputStreama
1 byte = 8位二进制数 01010101
?InputStream常用方法

方法 描述
int read() 以字节为单位读取数据
int read(byte b[]) 将数据存入byte类型的数据中,返回数组长度
int read(byte b[],int off,int len) 将数据存入byte数组的指定区间内,返回数组长度
byte[] readAllBytes() 将所有数据存入byte数组并返回
int available() 返回当前数据流未读取的数据个数
void close() 关闭数据流

?注意:
InputStream是抽象类,不能被实例化,如果要实例化必须使用抽象类的子类,FileInputStream。
要处理一下文件不存在的异常

package com.oyrf.io;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class TestIO1 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\test.txt");if (file.exists()){
    //创建流InputStream inputStream = new FileInputStream(file);int asknum = 0;while ((asknum = inputStream.read())!=-1){
    System.out.println(asknum);}//关闭流inputStream.close();}}
}
package com.oyrf.io;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class TestIO2 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\test.txt");if (file.exists()){
    //创建数组byte[] info = new byte[10];//创建流InputStream inputStream = new FileInputStream(file);int length = inputStream.read(info);//读取流System.out.println(length);//关闭流inputStream.close();}}
}

注意:此处有一个容易犯的错误,不可以这样写,因为没存到内存中,取出来的数据要存到内存中,错误如下图。

package com.oyrf.io;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class TestIO2 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\test.txt");if (file.exists()){
    //创建数组byte[] info = new byte[10];//创建流InputStream inputStream = new FileInputStream(file);//读取流System.out.println(inputStream.read(info));//关闭流inputStream.close();}}
}

?OutputStream常用方法

方法 描述
void write(int b) 以字节为单位输出数据
void write(byte b[]) 将byte数组中的数据输出
void write(byte b[],int off,int len) 将byte数组中指定区间的数据输出
void close() 关闭数据流
void flush() 将缓冲流中的数据同步到输出流中

?注意:输入流的话文件是必须要存在的,但是输出流的话文件可以不存在,会自动帮你创建。

package com.oyrf.io;import java.io.FileOutputStream;
import java.io.OutputStream;public class TestIO4 {
    public static void main(String[] args) throws Exception{
    OutputStream outputStream = new FileOutputStream("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");outputStream.write(1234);outputStream.close();}
}

?注意:这里写入的不是1234,而是1234对应的ASCII编码,因为这里使用的是字节流传输。

package com.oyrf.io;import java.io.FileOutputStream;
import java.io.OutputStream;public class TestIO5 {
    public static void main(String[] args) throws Exception {
    OutputStream outputStream = new FileOutputStream("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");byte[] bytes = {
    100,100,100};outputStream.write(bytes);outputStream.close();}
}
package com.oyrf.io;import java.io.FileOutputStream;
import java.io.OutputStream;public class TestIO5 {
    public static void main(String[] args) throws Exception {
    OutputStream outputStream = new FileOutputStream("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");byte[] bytes = {
    11,22,33,44,55,66,77,88,99,100};outputStream.write(bytes,3,3);outputStream.close();}
}

?注意:新数据其实会覆盖掉旧数据。

字节流

字节流是单位时间内处理一个字节的数据(输入+输出)
字符流是单位时间内处理一个字符的数据(输入+输出)
字符流:

  • 输入字符流 Reader
  • 输出字符流 Writer

Reader

是一个抽象类

  • 方向:输入+输出
  • 单位:字节+字符
  • 功能:节点流(字节流)+处理流(对节点流进行处理,生成其他类型的流)
    InputStream(字节输入流) ---->Reader(字符输入流)
    InputStreamReader的功能是将字节输入流转换为字符输入流

英?、数字、符号
1 个字节 = 1 个字符
a 1 个字符、1 个字节
汉字
1 个字符 = 3 个字节
好 1个字符、3 个字节

package com.oyrf.io;import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.Reader;public class TestIO6 {
    public static void main(String[] args) throws Exception{
    //字符流Reader reader = new FileReader("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");int info = 0;System.out.println("***********字符流***********");while ((info =reader.read())!=-1){
    System.out.println(info);}//字节流InputStream inputStream = new FileInputStream("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");System.out.println("***********字节流***********");while ((info = inputStream.read())!=-1){
    System.out.println(info);}}
}

???注意:如果文件中的内容是英文,那是没有区别的,但是如果文件的内容是中文,那就会有区别,原因就是上面所说的。

package com.oyrf.io;import java.io.FileReader;
import java.io.Reader;public class TestIO7 {
    public static void main(String[] args) throws Exception {
    Reader reader = new FileReader("E:\\javaIO\\src\\com\\oyrf\\io\\target.txt");char infos[] = new char[8];int length = reader.read(infos);System.out.println("字符数组的长度是" + length);System.out.println("便利字符数组");for (char info : infos) {
    System.out.println(info);}}
}

?这里就和字节无关了,因为他是以字符的形式输出
read() 返回的是 int ,直接将字符转成字节(1-1,1-3)
read(char[] chars) 返回的是 char 数组,直接就返回字符,不会转
成字节的。

处理流

package com.oyrf.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;public class TestIO9 {
    public static void main(String[] args) throws  Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy.txt");//基础管道InputStream inputStream = new FileInputStream(file);//处理流InputStreamReader inputStreamReader = new InputStreamReader(inputStream);char chars[] = new char[20];int len = inputStreamReader.read(chars);inputStreamReader.close();String result = new String(chars,0,len);System.out.println(chars);System.out.println(result);}
}
package com.oyrf.io;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class TestIO10 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy.txt");OutputStream outputStream = new FileOutputStream(file);OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);char[] chars = {
    '恭','喜','发','财','万','事','如','意'};outputStreamWriter.write(chars);outputStreamWriter.append(chars[0]);outputStreamWriter.flush();outputStreamWriter.close();}
}

缓冲流

?论是字节流还是字符流,使?的时候都会频繁访问硬盘,对硬盘
是?种损伤,同时效率不?,如何解决?
可以使?缓冲流,缓冲流?带缓冲区,可以?次性从硬盘中读取部
分数据存?缓冲区,再写?内存,这样就可以有效减少对硬盘的直
接访问。

缓冲流属于处理流,如何来区分节点流和处理流?
1、节点流使?的时候可以直接对接到?件对象 File
2、处理流使?的时候不可以直接对接到?件对象 File,必须要建?
在字节流的基础上才能创建。

缓冲流?可以分为字节缓冲流和字符缓冲流,按照?向再细分,?
可以分为字节输?缓冲流和字节输出缓冲流,以及字符输?缓冲流
和字符输出缓冲流。
?字节输入缓冲流

package com.oyrf.io;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;public class TestIO11 {
    public static void main(String[] args) throws Exception {
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy.txt");InputStream inputStream = new FileInputStream(file);//创建缓冲流BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
/* int temp = 0;while((temp=bufferedInputStream.read())!=-1){System.out.println(temp);}*/byte[] bytes = new byte[30];int length = bufferedInputStream.read(bytes);System.out.println(length);for (byte abyte :bytes){
    System.out.println(abyte);}bufferedInputStream.close();inputStream.close();}
}

?字符输入缓冲流

package com.oyrf.io;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;public class TestIO12 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy.txt");//1、创建字符流(节点流)Reader reader = new FileReader(file);//2、创建缓冲流(处理流BufferedReader bufferedReader = new BufferedReader(reader);String str = null;int num = 0;System.out.println("start");while ((str=bufferedReader.readLine())!=null){
    System.out.println(str);num++;}System.out.println("一共读了"+num+"次");bufferedReader.close();reader.close();}
}

?字节输出缓冲流

package com.oyrf.io;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;public class TestIO13 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy2.txt");OutputStream outputStream = new FileOutputStream(file);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);String str = "恭喜发财!!!!!!!!!";byte[] Strbyte = str.getBytes(StandardCharsets.UTF_8);bufferedOutputStream.write(Strbyte);bufferedOutputStream.close();outputStream.close();}
}

?字符输出缓冲流

package com.oyrf.io;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;public class TestIO14 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\copy2.txt");String str = "新年祝词一、喜悦伴着汗水,成功伴着艰辛,遗憾激励奋斗,我们不知不觉地走进了2022年,这是信息中心成立后的第五个年头了,在新年来临之际,首先我代表信息中心祝各位新年快乐,万事如意!\n" +"新年祝词二、祝您好事连连,好梦圆圆!拜新年\n" +"贺新春!迎新年!祝你今年中大奖。万事顺!合家欢!愿君如意福满年。拜新年\n" +"加薪买房购小车,娶妻生子成家室!接财神\n" +"一片绿叶,饱含着它对根的情谊;一句贺词,浓缩了我对您的祝愿。又是一个美好的开始――新年岁首,祝成功和快乐永远伴随着您。拜新年\n" +"发财无限,使劲赚钱!接财神\n" +"新年祝福无限,发财跨越2022!接财神";Writer writer = new FileWriter(file);BufferedWriter bufferedWriter = new BufferedWriter(writer);bufferedWriter.write(str);bufferedWriter.flush();bufferedWriter.close();writer.close();}
}

序列化和反序列化

序列化就是将内存中的对象输出到硬盘?件中保存。
反序列化就是相反的操作,从?件中读取数据并还原成内存中的对
象。

?序列化

  1. 实体类需要实现序列化接?,Serializable
package com.oyrf.entity;import java.io.Serializable;public class User implements Serializable {
    String username;int password;int age;public User(String username, int password, int age) {
    this.username = username;this.password = password;this.age = age;}public String getUsername() {
    return username;}public void setUsername(String username) {
    this.username = username;}public int getPassword() {
    return password;}public void setPassword(int password) {
    this.password = password;}public int getAge() {
    return age;}public void setAge(int age) {
    this.age = age;}@Overridepublic String toString() {
    return "User{" +"username='" + username + '\'' +", password=" + password +", age=" + age +'}';}
}
  1. 实体类对象进?序列化处理,通过数据流写?到?件中,ObjectOutputStream。
package com.oyrf.io;import com.oyrf.entity.User;import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;public class TestIO15 {
    public static void main(String[] args) throws Exception{
    User user = new User("Box",123,22);File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\obj.txt");OutputStream outputStream = new FileOutputStream(file);ObjectOutputStream objectOutputStream  = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(user);objectOutputStream.flush();objectOutputStream.close();outputStream.close();}
}

?反序列化

package com.oyrf.io;import com.oyrf.entity.User;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;public class TestIO16 {
    public static void main(String[] args) throws Exception{
    File file = new File("E:\\javaIO\\src\\com\\oyrf\\io\\obj.txt");InputStream inputStream = new FileInputStream(file);ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);User user = (User) objectInputStream.readObject();System.out.println(user);objectInputStream.close();inputStream.close();}
}

IO 流的应?

IO 流就是完成?件传输(上传?件:发朋友圈、换头像,?件下
载:CSDN 下载源代码、?档)
字符 a 你好
?本类型的数据(txt、word、Excel、MD)可以使?字符去读取
(当然也可以?字节)

package com.oyrf.io;
import java.io.*;
public class TestIO17 {
    public static void main(String[] args) throws
Exception {
    Reader reader = new
FileReader("E:\\javaIO\\src\\com\\oyrf\\io\\test.txt);BufferedReader bufferedReader = new
BufferedReader(reader);Writer writer = new
FileWriter("E:\\javaIO\\src\\com\\oyrf\\io\\test2.txt");BufferedWriter bufferedWriter = new
BufferedWriter(writer);String str = "";int num = 0;while ((str =
bufferedReader.readLine())!=null){
    bufferedWriter.write(str);num++;}System.out.println("传输完毕,共读取
了"+num+"次");bufferedWriter.flush();bufferedWriter.close();writer.close();bufferedReader.close();reader.close();}
}

??本类型的数据(图?、?频、视频)不能?字符去读取,只能
?字节去读。

package com.oyrf.io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Test {
    public static void main(String[] args) throws
Exception {
    //1、通过输?流将?件读?InputStream inputStream = new
FileInputStream("E:\\javaIO\\src\\com\\oyrf\\io\\1.jpg");//2、通过输出流将?件写?OutputStream outputStream = new
FileOutputStream("E:\\javaIO\\src\\com\\oyrf\\io\\2.jpg");int temp = 0;int num = 0;long start = System.currentTimeMillis();while((temp = inputStream.read())!=-1){
    num++;outputStream.write(temp);}long end = System.currentTimeMillis();System.out.println("传输完毕,共耗时"+(end-start));outputStream.flush();outputStream.close();inputStream.close();}
}
  相关解决方案