java中iO流

简介: java中iO流

io包

1.FileInputStream字节输入流(读取)

默认:源文件字符—》程序十进制

read()方法:一次只能读取一个字节,当读取到文件末尾,返回值为-1

close()方法:关闭流释放资源–》Java程序占用的系统资源被释放

注意:Windows平台使用\作为路径分隔符,在Java字符串中需要用\表示一个\。Linux平台使用/作为路径分隔符

//1.创建字节输入流对象
FileInputStream fis = new FileInputStream("D:\\abc.txt");
//2.读取文件中的数据
int f = fis.read();
//一次只能读取一个字节,当读取到文件末尾,返回值为-1,鼠标点击read()方法,查看返回数据类型,
//输出的是字符对应的十进制数,参考ASCII码,转换为字符类型,需要强制转换
System.out.println((char)f);

while循环输出文件所有内容

int f;
//不确定循环次数,使用while
//在循环中不断地调用read方法,并把读取到的数据给f复制,只要没有读取到-1,说明没有达到文件末尾
while((f = fis.read()) != -1) {
  System.out.println((char)f);
}
fis.close();//关闭流释放资源

说明:在程序还在执行的状态下,若不关闭流,Java占用的系统文件(如abc.txt),将不能被操作(删除、重命名等)


2.FileOutputStream字节输出流

默认:程序十进制—》写出字符

特点

  • 输出流写出数据,若不存在指定文件,将自动创建
  • 输出流写出数据,如果关联的文件已经存在,会将原本内容覆盖;若不想覆盖原本内容,可以在构造方法的位置加上true开关即可实现追加。

    write()方法:写出数据(十进制)

   2.1单个字节写出

//1.创建字节输出对象,写到write.txt文件中,若不存在指定文件,将自动创建
FileOutputStream fos = new FileOutputStream("D:\\write.txt");
//2.写出数据
fos.write(97);
//3.关闭流释放资源
fos.close();

文件中写入的是a


2.2当我们不知道字符对应的字节数时,采用getBytes()方法

byte[] bytes = "hello".getBytes();
//输出字符对应的所有字节
System.out.println(Arrays.toString(bytes));
//将字符写到文件中
fos.write(bytes);

Java程序输出[104, 101, 108, 108, 111]

文件中是hello

追加不覆盖原本内容

FileOutputStream fos = new FileOutputStream("D:\\write.txt",true);


3.文件的拷贝copy()

步骤

  • 1.创建输入流和输出流对象
    输入流对象关联要拷贝的数据源文件
    输出流对象关联要拷贝的数据目的文件
  • 2.在读取的过程中,将数据写到目标文件中
  • 3.关闭流释放资源
  • 注意:建议IO流的异常使用try……catch进行处理,加上finally代码块,将关闭流释放资源的代码,放在finally当中

1.不建议使用这个,费时(一个一个的拷贝)

public class CopyTest {
  public static void main(String[] args) throws IOException{
    //1.创建字节输入流和输出流对象
    FileInputStream fis = new FileInputStream("D:\\abc.txt");
    FileOutputStream fos = new FileOutputStream("D:\\copy.txt");
    //2.在读取的过程中,将数据写到目标文件中
    int i;
    while((i=fis.read())!=-1) {
      fos.write(i);
    }
    //关闭流
    fos.close();
    fis.close();
  }
}

输出文件全部内容

FileInputStream fis = new FileInputStream("D:\\abc.txt");
//将字符存放到容器中
byte[] bytes = new byte[1024];
int len = fis.read(bytes);
//将数组转换成String类型,三个参数,1个表示数组名,1个从哪一位开始(起始0),1个从哪个结束(数组长度)
System.out.println(new String(bytes,0,len));
//字符长度
System.out.println(len);

运行:

abcd

4

2.使用一个容器数组来实现拷贝(一次性拷贝过去)

//开始时间,获取当前时间
long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("D:\\abc.txt");
FileOutputStream fos = new FileOutputStream("D:\\copy.txt");
//将字符存放到容器
byte[] bytes = new byte[1024];
int len;
while((len=fis.read(bytes))!=-1) {
  fos.write(bytes);
}
fis.close();
fos.close();
long end = System.currentTimeMillis();
//开始到结束耗时(毫秒)
System.out.println(end-start);


4.字节缓冲流

  • BufferedInputStream字节缓冲输入流
  • BufferedOutputStream字节缓冲输出流

特点

提高IO流的读写效率,内置了字节数组

//1.创建字节输入输出缓冲流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\abc.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\copy.txt",true));
//2.读写操作
int i;
while((i=bis.read())!=-1) {
  //写出
  bos.write(i);
}
//3.关闭流
bis.close();
bos.close();

5.字符流

字符流只能操作纯文本文件

GBK:一个(中文)字符占两个字节

UTF-8:一个字符占三个字节

共同点:英文和英文状态下的字符都占一个字节

中文对应的是负数,英文对应正数


作用:解决中文乱码

5.1字符输入流FileReader

//1.创建字符输入流
FileReader fr = new FileReader("D:\\char.txt");
//2.读取一个字符
int i;
while((i=fr.read()) != -1) {
  System.out.print((char)i);
}
//3.关闭流
fr.close();

5.2字符输出流FileWtite

FileWriter fw = new FileWriter("D:\\write.txt");
//写出一个字符
fw.write("a");
char[] c = {'b','c'};
//写出数组所有元素
fw.write(c);
//写出字符数组内部分元素b
fw.write(c, 0, 1);
fw.write("真不戳");
//写出字符的指定一部分
fw.write("干得漂亮", 0, 1);
//关闭流
fw.close();

结果:

abcb真不戳干


6.字符缓冲流

优点:自动换行

  • BufferedReader---->readLine()一次读取一行字符串,结束标记null
  • BufferedWriter---->newLine()写出回车换行,此方法有跨平台性(windows)
//1.创建字符缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("D:\\char.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\copy.txt"));
//2.读写操作
String line;
while((line=br.readLine())!= null) {
  bw.write(line);
}
//3.关闭流
br.close();

转换流

指定编码

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),"gbk");


7.File类的常用方法

Java中的file类可以将文件或文件夹的路径,封装成对象。

相对路径:相对于当前目录下文件或文件夹

绝对路径:从盘符的根目录开始,一直指向到某个具体的文件


**7.1exists()**判断文件是否存在

File file = new File("a.txt");
//exists()返回boolean类型,true表示存在该文件
System.out.println(file.exists());

**7.2creatNewFile()**创建文件

返回boolean类型,true表示创建成功

File file = new File("a.txt");
System.out.println(file.createNewFile());

7.3delete删除文件

返回boolean类型,true表示删除成功

7.4getName获取文件名称

File file = new File("D:\\write.txt");
File f2 = new File("a.txt");
//getName()获取文件或文件夹名称
System.out.println(file.getName());
//getPath()获取对象构造方法中封装的路径
System.out.println(f2.getPath());
//getAbsolutePath()获取绝对路径
System.out.println(f2.getAbsolutePath());
//getParent()获取构造方法中封装的父级路径
System.out.println(file.getParent());

eclipse:选中代码块,alt+shift+m装到方法中

运行:

write.txt

a.txt

G:\work\j\practices\a.txt

D:\


8.对象序列化

对象需要实现Serializable接口

Stu类

package io;
import java.io.Serializable;
public class Stu implements Serializable{
  private String name,id;
  public Stu() {
    super();
    // TODO Auto-generated constructor stub
  }
  public Stu(String name, String id) {
    super();
    this.name = name;
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  @Override
  public String toString() {
    return "name=" + name + ", id=" + id ;
  }
}

测试类

public static void main(String[] args) throws Exception {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
    Object object = ois.readObject();
    System.out.println(object);
  }
  public static void writeObj() throws IOException{
    //1.创建对象输出流,用于将对象写出到文件中
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
    Stu stu =  new Stu("张三", "11");
    //2.使用对象输出流写出对象
    oos.writeObject(stu);
    //3.关闭流
    oos.close();
  }
目录
相关文章
|
5月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
2月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
64 9
|
3月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
108 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
4月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
3月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
54 1
|
3月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
131 1
|
4月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
281 12
|
3月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
79 0
|
3月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
47 0
|
4月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践