JAVA(IO流-字符流)day 7.30

ok了家人们今天继续学习IO流,

.字符集

使用字节流输出中文可能有乱码。

因为每次读取的字节没有完全读取一个字的字节。

.字符流

2.1 字符输出流【Writer】(抽象类)

Writer是所有字符流的超类(父类)

字符输出流 Writer 类的常用方法
public void write(int c):写出一个字符
。
public void write(char[] cbuf):将 b.length字符从指定的字符
数组写出此输出流。

public abstract void write(char[] b, int off, int len):从指定的
字符数组写出 len字符,从偏移量 off开始输出到此输出流。
 
public void write(String str) :写出一个字符串
。
public void write(String str,int off,int len):写出一个字符串的
一部分。

public abstract void close():关闭流,释放资源,但是在关闭
之前会先刷新流。一旦关闭,就不能再写数据。

public abstract void flush():刷新流,还可以继续写数据。

2.2 FileWriter

FileWriter类是Writer的子类,默认使用UTF-8,和字节缓冲区。

FileWriter类的构造方法

FileWriter(File file):创建一个新的 FileWriter,给定要读取的File对
象。
 
FileWriter(String fileName):创建一个新的 FileWriter,给定要读
取的文件的名称。 

FileWriter(File file,boolean append): 创建一个新的 FileWriter,
追加写入。 

FileWriter(String fileName,boolean append): 创建一个新的
FileWriter,追加写入。

FileWriter fw = new FileWriter("文件路径");

fw.write(int/String);
fw.write("\r\n");//换行符

char[] chars = {内容};
fw.write(chars);

fw.close();
//续写
FileWriter fw = new FileWriter("文件路径",true);

fw.write(内容);

fw.close();
flush :刷新缓冲区,流对象可以继续使用。
//刷新流
FileWriter fw = new FileWriter("文件路径",true);

fw.write(内容);

fw.flush();

fw.wirte(内容);

fw.close();

2.3 字符输入流【Reader】(抽象类)

Reader是读取字符流的所有超类(父类)

字符输入流Reader类的常用方法

public int read():每次可以读取一个字符的数据,读取到文件末
尾,返回-1。 返回字符数据的编码值。

public int read(char[] cbuf):一次最多读取cbuf.length个字符数
据,并把读取的字符数据存储到cbuf数组中。返回实际读取到的字
符数据个数。 读取到文件末尾返回:-1

2.4  FileReader类

FileReaderReader的子类,用于读取字符文件,默认使用UTF-8和字符缓冲区。

FileReader(File file): 创建一个新的 FileReader ,给定要读取的
File对象。 

FileReader(String fileName): 创建一个新的 FileReader ,给定要
读取的文件的名称。

FileReader fr = new FileReader("文件路径");

fr.read();

int len;
while((len=fr.read())!=-1){
    System.out.println((char)len);
}

fr.close

char数组

FileReader fr = new FileReader("文件路径");

char[] chars = new char[];

int len;

while((len=fr.read())!=-1){
    String str = new String(chars,0,len)
    System.out.println(str);
}

fr.close();

.字符缓冲流

3.1 字符缓冲流概述

只具备缓冲区

字符缓冲流的构造方法

public BufferedReader(Reader in):创建一个 新的缓冲输入
流。
public BufferedWriter(Writer out): 创建一个新的缓冲输出
流。

String src = "文件路径";
String dest = "文件路径";
BufferedReader br = new BufferedReader(new FileReader(src));

BufferedWriter bw = new BufferedWriter(new FileWirter(dest));

 char[] cbuf=new char[1024];

       int len;
       while( (len=br.read(cbuf))!=-1){
           bw.write(cbuf,0,len);
      }

       //关闭流
       br.close();
       bw.close();

3.2 字符缓冲流复制纯文本文件

需求:将 斗罗大陆 .txt’ 复制到当前模块下 ‘copy.txt’
import java.io.*;

public class dm02 {
    public static void main(String[] args) throws Exception {
        String src = "java_0729\\dldl.txt";
        BufferedReader br = new BufferedReader(new FileReader(src));

        String str = "java_0729\\copy.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(str));

        char[] chars = new char[1024];
        int len;
        while ((len=br.read(chars))!=-1){
            bw.write(chars,0,len);
        }
        br.close();
        bw.close();
    }
}

3.3 字符缓冲流特有功能

BufferedReader:public String readLine(): 读取文件一行数据,
不包含换行符号 , 读到文件的末尾返回null。
BufferedWriter:public void newLine(): 写一个行分隔符,会
根据操作系统的不同,写入不同的行分隔符。
import java.io.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

public class dm03 {
    public static void main(String[] args) throws Exception {

        String src = "java_0729\\a.txt";
        BufferedReader br = new BufferedReader(new FileReader(src));

        String dest = "java_0729\\b.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(dest));

        String str = br.readLine();
        //33,23,44,55,09,98,77,31,52,10
        System.out.println(str);

        String[] strs = str.split(",");
        //[33, 23, 44, 55, 09, 98, 77, 31, 52, 10]
        System.out.println(Arrays.toString(strs));

        int[] arr = new int[strs.length];
        for (int i = 0; i < strs.length; i++) {
            String s = strs[i];
            int num = Integer.parseInt(s);
            arr[i] = num;
        }
        //排序
        Arrays.sort(arr);
        //[9, 10, 23, 31, 33, 44, 52, 55, 77, 98]
        System.out.println(Arrays.toString(arr));

        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            bw.write(arr[i]+" ");
            count++;

            if (count%5==0){
                bw.newLine();
            }
        }
        br.close();
        bw.close();
    }
}

.转换流

FileReader 类 默认是UTF-8编码表,
由于 Windows 系统的默认是 ANSI编码
可能会出 现乱码。
        
import jdk.internal.util.xml.impl.Input;

import java.io.*;

public class dm04 {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("D:/2.txt");
        InputStreamReader isr = new InputStreamReader(fis,"GBK");

        int len;
        while ((len=isr.read())!=-1){
            System.out.print((char)len);//���
            //在InputStreamReader加入"GBK"之后,输出 你好
        }
        fis.close();
        isr.close();
    }
}

4.1 InputStreamReader

InputStreamReader类是Reader的子类,字符集可以指定,也可以使用IDEA默认UTF-8的字符集。

InputStreamReader 类的构造方法
InputStreamReader(InputStream in): 创建一个使用默认字符集
的字符流。
InputStreamReader(InputStream in, String charsetName): 创
建一个指定字符集的字符流。

InputStreamReader isr01 = new InputStreamReader(new FileInputStream("关联文件"));
InputStreamReader isr02 = new InputStreamReader(new FileInputStream("关联文件") , "GBK");

4.2 OutputStreamWriter

OutputStreamWriter类是Writer的子类,它的字符集和InputStreamReader类一样,可以指定

也可以使用IDEA默认UTF-8的字符集。

OutputStreamWriter类的构造方法

OutputStreamWriter(OutputStream in): 创建一个使用默认字
符集的字符流。 idea默认的是utf8
OutputStreamWriter(OutputStream in, String charsetName):
创建一个指定字符集的字符流。

OutputStreamWriter isr = new OutputStreamWriter(new
FileOutputStream("关联文件"));
OutputStreamWriter isr2 = new OutputStreamWriter(new
FileOutputStream("关联文件") , "GBK");

4.3 转换流的作用

windows默认的字符集为gbk,idea的字符集为UTF-8,

我们在读取windows文件时,会出现乱码,

这种情况我们就可以用转换流去指定字符集,就可以读取文件内容。

public class DemoTest {
   public static void main(String[] args) throws
IOException {
       //创建输出流,指定关联文件的编码表名字
       String dest="文件路径";
       OutputStreamWriter osw=new
OutputStreamWriter(new
FileOutputStream(dest),"GBK");//指定字符集为”gbk“(默认大小写一样)
       //写入数据
       osw.write("今天晚上要上课");
       //关闭流
       osw.close();
       //创建输入流,指定关联文件的编码表名字
       String src="文件路径";
       InputStreamReader isr = new
InputStreamReader(new FileInputStream(src),"GBK");//指定字符集为”gbk“
       //读数据
       int len;
       while((len=isr.read())!=-1){
           System.out.println((char)len);
      }
       //关闭流
       isr.close();
  }
}

.对象操作流

5.1 对象操作流概述

        可以把读取的对象以字节的形式读取到文件中

对象操作输入流(ObjectInputStream)
对象操作输出流(对象序列化流):就是将对象写到本地文件中,
或者在网络中传输对象
操作输出流(ObjectOutputStream)
对象操作输入流(对象反序列化流):把写到本地文件中的对象读
到内存中,或者接收网络中传输的对象。

5.2 ObjectOutputStream类(序列化流)

Java 对象的原始数据类型写出到文件, 实现对象的持久存储。
ObjectOutputStream 类构造方法
public ObjectOutputStream(OutputStream out) : 创建一个
指定OutputStream的ObjectOutputStream

ObjectOutputStream oos = 
                    new ObjectOutputStream(new FileOutputStream("文件地址"));

FileOutputStream fileOut = 
                    new FileOutputStream("文件地址");
ObjectOutputStream out =
                    new ObjectOutputStream(fileOut);
ObjectOutputStream 类序列化操作
必须实现 .Serializable 接口,它是一个(标记)接口
不实现的话就会报异常  j ava.io.NotSerializableException
public final void writeObject (Object obj) : 将指定的对象写
出。

5.3 ObjectInputStream类(反序列化流)

ObjectInputStream 类的概述
将序列化之后的文件写为对象(恢复为对象)
ObjectInputStream 类构造方法
public ObjectInputStream(InputStream in) : 创建一个指定
InputStream的

ObjectInputStream ois = 
                      new ObjectInputStream(new FileInputStream("文件路径"));
ObjectInputStream 类反序列化操作
public final Object readObject () : 读取一个对象。

ObjectInputStream ois = 
                      new ObjectInputStream(new FileInputStream("文件路径"));

        User user = (User)ois.readObject();



5.4 序列化集合

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;


public class dm10 {
    public static void main(String[] args) throws Exception {
        String dest = "文件路径";
        ObjectInputStream ois =
                new ObjectInputStream(new FileInputStream(dest));



        ArrayList<User> list  = (ArrayList<User>) ois.readObject();
        for (User user : list) {
            System.out.println(user.getName()+"..."+user.getAge()+"..."+user.getAddress());
        }
        ois.close();
    }
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class dm09 {
    public static void main(String[] args) throws Exception {


        String src = "文件路径";
        ObjectOutputStream oos =
                new ObjectOutputStream(new FileOutputStream(src));

        ArrayList<User> list = new ArrayList<>();

        User user01 = new User();
        user01.setName("张三");
        user01.setAge(23);
        user01.setAddress("北京");

        User user02 = new User();
        user02.setName("李四");
        user02.setAge(24);
        user02.setAddress("上海");
        list.add(user01);
        list.add(user02);

        oos.writeObject(list);
        oos.close();
    }
}

5.5 序列化和反序列化注意事项

private static final long serialVersionUID = 42L;  

ok了家人们明天见。

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是求解多元多项式回归的 MATLAB 代码: ```matlab % 输入数据 x1 = [36.4 37.2 37.2 36.2 31.5 28.9 27.2 26.7 26.1 26.1 25.4 25.3 25.4]'; x2 = [50.0 52.0 49.0 51.0 68.0 74.0 83.0 82.0 88.0 88.0 90.0 88.0 87.0]'; x3 = [982.9 982.2 981.8 981.6 982.3 982.6 983.4 983.5 984.0 983.6 984.4 984.5 984.4]'; y = [-7.30 -7.36 -7.35 -7.33 -7.31 -7.30 -7.26 -7.22 -7.21 -7.23 -7.18 -7.17 -7.14]'; % 构建设计矩阵X X = [ones(size(x1)) x1 x2 x3 x1.^2 x1.*x2 x1.*x3 x2.^2 x2.*x3 x3.^2]; % 求解回归系数 beta = X \ y; % 构建预测模型 model = @(x1,x2,x3) beta(1) + beta(2)*x1 + beta(3)*x2 + beta(4)*x3 ... + beta(5)*x1.^2 + beta(6)*x1.*x2 + beta(7)*x1.*x3 ... + beta(8)*x2.^2 + beta(9)*x2.*x3 + beta(10)*x3.^2; % 预测并绘制拟合图 x1fit = min(x1):0.1:max(x1); x2fit = min(x2):0.1:max(x2); x3fit = min(x3):0.1:max(x3); [X1FIT,X2FIT,X3FIT] = meshgrid(x1fit,x2fit,x3fit); YFIT = model(X1FIT,X2FIT,X3FIT); figure; plot3(x1,x2,x3,'o',x1fit,x2fit,x3fit,'*'); hold on; mesh(X1FIT,X2FIT,X3FIT,YFIT); xlabel('x1'); ylabel('x2'); zlabel('x3'); title('拟合图'); % 绘制残差图 YFIT = model(x1,x2,x3); figure; plot(YFIT - y,'o'); xlabel('样本编号'); ylabel('残差'); title('残差图'); ``` 运行上述代码后,会先绘制拟合图,然后绘制残差图。拟合图中,蓝色的点表示原始数据,红色的点表示拟合值,可以看到拟合值与原始数据比较接近;残差图中,横轴表示样本编号,纵轴表示残差,残差的分布应该比较均匀,没有明显的规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值