前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java进阶-IO(3)

Java进阶-IO(3)

作者头像
reload
修改2024-03-04 14:48:39
1560
修改2024-03-04 14:48:39
举报
文章被收录于专栏:Java后端

话接上回,继续java IO的学习。上一次说完了字符流的读写数据,这次将基础部分剩余的一点内容看完。

一、流按功能分类

1、系统流
1.1 概述

系统流的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流。

代码语言:javascript
复制
System.in:标准输入流,默认设备是键盘。
System.out:标准输出流,默认设备是控制台。
System.err:标准错误流,默认设备是控制台。
1.2 示例
代码语言:javascript
复制
import java.io.IOException; // 导包

public class SystemDemo {
    public static void main(String[] args){
        byte[] byteData=new byte[100]; // 动态初始化声明一个数组
        System.out.println("请输入英文:");
        try{
            System.in.read(byteData); // 标准输入流,通过键盘读取数据
        }catch (IOException e){ // 捕获异常,IOException
            e.printStackTrace(); // 追踪异常,打印异常信息
        }
        System.out.println("您输入的内容如下:");
        for(int i=0;i<byteData.length;i++){ // 遍历
            System.out.print((char)byteData[i]); // byt字节转为char字符
        }
    }
}

运行结果

代码语言:javascript
复制
请输入英文:
admdom sldmv skemcp
您输入的内容如下:
admdom sldmv skemcp
1.2 几点注意

System.in 是 InputStream 类的一个对象,System.in.read() 访问 InputStream 类定义的 read() 方法,可以从键盘读取一个或多个字符。

System.out 本质是一个字节输出流,主要用于将指定内容输出到控制台。 System.out 和 System.error 是 PrintStream 类(一个从 OutputStream 派生的输出流,还执行低级别的 write() 方法)的对象。故除了 print() 和 println() 方法,System.out 还可以调用 write() 方法实现控制台输出(一般不用)

2、打印流

有字节打印流(PrintStream)和字符打印流(PrintWriter)。

特点:只负责输出数据,不负责读取数据,且有自己的特有方法

2.1 字节打印流(PrintStream)
代码语言:javascript
复制
PrintStream(String fileName):使用指定的文件名创建新的打印流
使用继承父类(OutputStream)的方法(write方法)写数据,查看的时候会转码;使用自己特有的方法写数据,查看的数据原样输出
2.2 字符打印流(PrintWriter)

继承父类:Writer,即可以调用父类的方法(Writer()方法重载:5个)

常用构造方法(两个)

代码语言:javascript
复制
PrintWriter(String fileName):使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新
PrintWriter(Writer out,boolean autoFlush):创建一个新的PrintWriter
- out:字符输出流
- autoFlush:一个布尔值,若为真,则println、printf或format方法将刷新输出缓冲区(即写完后不用再调用flush()方法刷新流也能在文件中显示数据)
2.3 示例(字节打印流)
代码语言:javascript
复制
import java.io.IOException;
import java.io.PrintStream;

public class PrintStreamDemo {
    public static void main(String[] args) throws IOException {
        // 创建字节打印流PrintStream对象
        PrintStream ps=new PrintStream("D:\\Ultimate JavaCode\\src\\test8\\ps");
        // 调用父类(OutputStream)方法(write方法)写数据
//        ps.write(97); // a

        // 用自己的特有方法(print(),println()...)写数据
        ps.println(97);
        ps.println(98);
        // 释放资源
        ps.close();
    }
}

字符打印流类似,不再赘述

除系统流、打印流外,还有节点流,处理流

节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。

二、字符编码

1、查看系统默认编码
代码语言:javascript
复制
public class Bianma {
    public static void main(String[] args){
        System.out.println("系统默认编码:"+System.getProperty("file.encoding"));//System.getProperty()方法
    }
}
// result
// 系统默认编码:UTF-8
2、创建文件与乱码示例
代码语言:javascript
复制
import java.io.File; // 导包
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class Bianma {
    public static void main(String[] args) throws Exception { // 抛出一个大的异常
        // 设置文件路径和文件名,采用拼接
        File f=new File("C:\\Users\\ASUS\\Desktop\\project1\\src"+File.separator+"BianmaTest.txt");
        OutputStream out=new FileOutputStream(f); // 实例化输出流
        byte b[]="你好,张三!".getBytes(StandardCharsets.UTF_8); // 设置系统默认编码UTF_8
        byte b1[]="你好,李四!".getBytes(StandardCharsets.ISO_8859_1); // 设置其他编码(会出现乱码)
        out.write(b); // 保存转码后的数据
        out.write(b1); // 追加一组数据
        out.close(); //关闭输出流
    }
}

运行结果(会生成一个BianmaTest.txt文件,打开查看内容如下,出现乱码)

代码语言:javascript
复制
你好,张三!??????

三、字符缓冲流 & 集合

1、集合到文件

需求:把ArrayList集合中的字符数据写入到文本文件。

要求:每一个字符串元素作为文件中的一行数据(newLine方法)

代码语言:javascript
复制
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
// 集合到文件
public class ArrayListDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个ArrayList对象
        ArrayList<String> arr=new ArrayList<>();
        // 往ArrayList中添加元素
        arr.add("hello");
        arr.add("javase");
        arr.add("javaee");
        // 创建字符缓冲输出流BufferedWriter对象
        BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\ASUS\\Desktop\\project1\\src\\bw.txt"));
        // 通过遍历集合将集合中的字符数据写入文件
        for(String s:arr){
            bw.write(s); // write()方法写入数据
            bw.newLine(); // newLine()方法写一行行分隔符,不能少,否则会显示在一行
            bw.flush(); // 刷新流,将数据刷入内存
        }
        // 释放资源
        bw.close();
    }
}

运行结果(会生成一个bw.txt文件,打开查看内容如下)

代码语言:javascript
复制
hello
javase
javaee

集合到文件改进版(自主练习)

代码语言:javascript
复制
步骤:
1)创建一个Student学生类(完整javabean)
2)创建ArrayList集合,泛型约束为Student类型
3)创建学生对象并将学生对象添加到集合(add()方法)
4)创建字符缓冲输出流对象BufferedWriter
5)遍历集合(增强for循环),得到每一个学生对象
6)把学生对象的数据拼接成指定的字符串(使用StringBuilder,并调用其append()方法实现拼接)
7)调用字符缓冲输出流对象的方法写数据(3步)
    bw.write(sb.toString());
    bw.newLine();
    bw.flush()
8)释放资源
    bw.close()
2、文件到集合

需求:将文本文件中的数据读取到集合中,并遍历集合。

要求:文件中每一行数据是一个集合元素(readLine方法)

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.AbstractList;
import java.util.ArrayList;
// 文件到集合
public class TxtToArrayListDemo {
    public static void main(String[] args) throws IOException {
        // 创建字符缓冲输入流对象
        BufferedReader br=new BufferedReader(new FileReader("C:\\Users\\ASUS\\Desktop\\project1\\src\\bw.txt"));
        // 创建一个ArrayList对象
        AbstractList<String> arr=new ArrayList<>();
        // 调用字符缓冲输入流对象的方法读数据
        String line;
        while((line=br.readLine())!=null){ // readLine()方法实现换行功能,直到下一行没数据时跳出循环
            arr.add(line); // 将文件中的每一行数据添加进集合
        }
        // 释放资源
        br.close();
        // 遍历集合
        for(String s:arr){
            System.out.println(s);
        }
    }
}

运行结果(输出在控制台)

代码语言:javascript
复制
hello
javase
javaee

文件到集合的改进版(类似,自主练习)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、流按功能分类
    • 1、系统流
      • 1.1 概述
      • 1.2 示例
      • 1.2 几点注意
    • 2、打印流
      • 2.1 字节打印流(PrintStream)
      • 2.2 字符打印流(PrintWriter)
      • 2.3 示例(字节打印流)
  • 二、字符编码
    • 1、查看系统默认编码
      • 2、创建文件与乱码示例
      • 三、字符缓冲流 & 集合
        • 1、集合到文件
          • 2、文件到集合
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档