IO流的简单学习

IO流

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

​ 流:对数据传输的抽象说法。

​ IO流:用来处理设备间数据的传输问题 eg:文件复制、文件上传、文件下载

分类

​ 数据的流向: 输入流、输出流

​ 数据类型:字节流、字符流

字节流

abstract class InputStream 		//字节输入流的超类
abstract class OutPutStream  	//字节输出流的超类
    class FileOutputStram 		//将数据写入File或FileDescriptor的输出流

eg:

public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\java.txt");
        /*
            new时做哪些过程:
                1.调用系统功能创建文件
                2.创建字节输出流对象
                3.让字节输出流指向已创建好的对象
         */
        fileOutputStream.write(97);

        //与IO流相关的,都需要释放资源
        fileOutputStream.close();
    }

写入数据的方式(输出流)

void write(int b)						//就指定的字节写入该文件输出流、一次写一个字节数据
void write(byte[] b)					//将指定的字节数组写入此文件输出流
void write(byte[] b,int off,int len)	//从指定的字节数组开始以len字节,从off位置开始写入此输出流

eg:

public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\java.txt");

        fileOutputStream.write(97); //a


        FileOutputStream fByte = new FileOutputStream("D:\\javaByte.txt");
        byte[] bytes = {97,98,99};
        fByte.write(bytes); //abc


        FileOutputStream fBytes = new FileOutputStream("D:\\javaBytes.txt");
        byte[] bytesLen = {97,98,99,100,101};
        fBytes.write(bytesLen,1,3); //bcd


        fileOutputStream.close();
        fByte.close();
        fBytes.close();
    }

如何换行:

​ window:\r\n linux:\n mac:\r

public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\java.txt");

        for (int i = 0; i < 10; i++) {
            fileOutputStream.write("hello".getBytes());
            fileOutputStream.write("\r\n".getBytes());
        }

        fileOutputStream.close();

    }

如何追加写入:

​ 通过构造方法

FileOutputStream(String name,boolean append) //创建文件输出流以指定的名称写入文件

eg:

public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\java.txt",true);

        fileOutputStream.write("hei".getBytes());
        fileOutputStream.write("\r\n".getBytes());


        fileOutputStream.close();
    }

读数据(输入流)

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\java.txt");
//        byte[] bys = new  byte[10];
//
//        int len = fis.read(bys);
//        System.out.println(len);//10 读到的个数
//        System.out.println(new String(bys)); //hello /r/n hel

        byte[] bytes = new byte[1024]; //1024及其整数倍
        int len;
        while ((len = fis.read(bytes))!=-1) { //当fis.read(..) == -1 时 说明文件内容已读完
            System.out.println(new String(bytes,0,len));
        }
        fis.close();
    }

字节缓冲流

class BufferedOutputStream //设置这样的输出流、可以向底层写入字节、而不必每次写入都调用系统
class BufferInputStream		//更高效

构方:

BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out , int size)
BufferInputStream(InputStream in)

注:字节缓冲流 仅仅是提供缓冲区,而读写还是得依赖字节流

eg:

    public static void main(String[] args) throws IOException {
    //先进行输出流再进行输入流
//        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java.txt"));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\java.txt"));

//        bos.write("hello".getBytes());

        int by;
        while((by = bis.read())!=-1){
            System.out.print((char)by); //hello
        }


        bis.close();
//        bos.close();

    }

字符流

​ 由于字节流不便于操作中文。于是Java提供字符流。

字符流 = 字节流 + 编码表 【汉字存储时,都让第一个字节处于负数】

InputStramReader		//字符输入流
OutputStreamWriter		//字符输出流

构造方法

OutputStreamWriter(OutputStream out)						//使用默认字符编码
OutputStreamWriter(OutputStream out,String charsetName)		//使用指定的字符编码

InputStramReader(InputStramReader in)
InputStramReader(InputStramReader in,String charsetName)	

eg:

 public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D:\\java.txt");
        OutputStreamWriter ops = new OutputStreamWriter(fos);

        ops.write("学习");
        ops.close();

        FileInputStream fis = new FileInputStream("D:\\java.txt");
        InputStreamReader isr = new InputStreamReader(fis);

        int ch;
        while ((ch = isr.read())!=-1)
            System.out.print((char)ch);
        isr.close(); //学习
    }

写数据

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

eg:

public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\java.txt"));

        osw.write(97); //a

        osw.flush();    //刷新流,字符流相对于字节流有个缓冲区

        char[] chars = {'a','b','c'};
        osw.write(chars); //abc
        osw.flush();

        String str = "wow";
        osw.write(str); //wow
        osw.flush();

        osw.close();
    }

读数据

int read()				//一次读一个字符数据
int read(char[] cbuf)	//一次读一个字符数组数据

eg:

  public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java.txt"));

//        int ch;
//        while ((ch=isr.read())!=-1){
//            System.out.print((char)ch); //wow
//        }

        char[] chs = new char[1024];
        int len;
        while ((len = isr.read(chs))!= -1){
            System.out.print(new String(chs,0,len)); //wow
        }

        isr.close();
    }

字符缓冲流

BufferedReader //高效读取
BufferedWriter 
public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("D:\\java.txt");
        BufferedWriter bw = new BufferedWriter(fw);

        bw.write("hello");//hello
        bw.close();

        FileReader fr = new FileReader("D:\\java.txt");
        BufferedReader br = new BufferedReader(fr);

        char[] chars = new char[1024];
        int len;
        while((len = br.read(chars))!=-1)
            System.out.print(new String(chars)); //hello

        br.close();
    }

特有功能

BufferedWriter
	void newLine()	//写一行分隔符
BufferedReader
	public String readLint()	//读一行文字,读完了为null

eg:

public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("D:\\java.txt");
        BufferedWriter bw = new BufferedWriter(fw);

        bw.write("hello");//hello
        bw.newLine();
        bw.write("World");
        bw.close();

        FileReader fr = new FileReader("D:\\java.txt");
        BufferedReader br = new BufferedReader(fr);

        String line;
        while ((line = br.readLine())!=null)
            System.out.println(line);
        /*
            hello
            World
         */

        br.close();
    }
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。
### Java SE IO学习教程 #### 一、简介 Java 输入/输出 (I/O) 是指通过数据源读取数据或将数据写入到数据目的地的过程。Java 提供了一套丰富的类库来处理不同类型的 I/O 操作,这些操作被封装在 `java.io` 包中。 #### 二、基本概念 - **字节** 和 **字符**: 字节用于传输原始的8位字节数据;而字符则专门针对Unicode编码的文字进行处理[^1]。 - **节点** 和 **过滤(包装)**: 节点直接连接到底层资源(如文件),而过滤则是基于其他已存在的之上构建的功能增强型[^3]. #### 三、常用类介绍 ##### 文件输入输出 对于简单的文件读写任务可以使用如下两个基础类: - `FileInputStream/FileOutputStream`: 这些是最基本的形式之一,适用于任何类型的文件内容传输[^2]. - `FileReader/FileWriter`: 当只需要处理纯文本时可以选择这两个子类,它们内部实现了对字符集转换的支持[^4]. ##### 缓冲区支持 为了提高效率,在实际应用当中通常会搭配Buffered系列来进行优化: - `BufferedReader/BufferedWriter`: 可以为任意reader/writer对象提供缓存机制从而减少磁盘访问次数并加快速度. ```java // 使用带缓冲功能的字符读取文件示例 import java.io.*; public class BufferedStreamExample { public static void main(String[] args)throws IOException{ try(BufferedReader reader=new BufferedReader(new FileReader("example.txt"))){ String line; while((line=reader.readLine())!=null){ System.out.println(line); } }// 自动调用了close()方法释放资源 } } ``` ##### 数据序列化与反序列化 当涉及到复杂对象保存至外部存储介质或者网络通信场景下,则需要用到Object Stream家族成员完成此过程. - `ObjectInputStream/ObjectOutputStream`: 支持将整个对象图谱按照特定格式持久化下来以便后续恢复原貌. ```java // 序列化对象到文件的例子 import java.io.*; class Person implements Serializable{//注意这里需要实现Serializable接口才能让实例可串行化 private static final long serialVersionUID = 1L; String name; transient int age; // 加上transient修饰符表示该字段不会参与序列化进程 } public class SerializationDemo { public static void writePersonToFile(Person person, File file) throws FileNotFoundException,IOException{ try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ oos.writeObject(person); } } @SuppressWarnings("unchecked") public static <T> T readPersonFromFile(File file) throws ClassNotFoundException,FileNotFoundException,IOException{ Object result=null; try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){ result=(T)ois.readObject(); } return result; } } ``` #### 四、最佳实践建议 - 总是在finally块内关闭所有打开过的以防止内存泄漏发生. - 尽量利用try-with-resources语句简化异常管理逻辑同时确保自动清理工作得以执行. - 对于频繁发生的短小读写动作考虑引入适当大小的buffer来降低开销提升性能表现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值