JAVA--字节流

字节流

  • 二进制文件只能用字节流进行复制,如视频,图片,字符流只能复制字符文件;
  • 字节强制转换为字符,根据码表,进行转换,会发生字节丢失现象复制会出现问题,字符流无法复制二进制文件;
  • 字符流能做的,字节流都能做,字节流能做的,字符流不一定能做,但是字符流方便输出,不用进行字节转换;

1.字节输入输出流

字节输出流

  • FileOutputStream
  • 构造函数
  • FileOutputStream fos = new FileOutputStream (new File);
  • FileOutputStream fos = new FileOutputStream (String s);
  • “a.txt” --> new File (“a.txt”)
FileOutputStream fos = new FileOutputStream ("a.txt");
//通过构造函数String创建,自动将String对象转换成File对象;

字节输入流

  • FileInputStream
  • 参考字节输出流;

复制文件

  • 与字符类功能类似,但只能输出Byte数组输出;
FileOutputStream fos = new FileOutputStream("D:\\递归图解.png");
FileInputStream fis = new FileInputStream("递归图解.png");

int len;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
    fos.write(bytes, 0, len);
    //以数组方式输出;
}
fos.close();
fis.close();
}

2.标准输入输出流

标准输入流

标准输入流 --> 字节输入流:用于读取键盘输入数据

  • public static final InputStream in
    • InputStream --> 引用类型;
    • in --> 参数;
  • InputStream is = System.in;
  • Scanner sc = new Scanner(System.in)

标准输出流

标准输出流 --> 字节输出流:将数据输出到命令行

  • public static PrintStream out
    • PrintStream --> OutputStream(子类) 引用类型;
    • out --> 参数;
  • OutputStream os = System.out;
  • System.out.print (“字节输出流”);

读取文件 – 命令行输出

  • outputStream
  1. outputStream os = System.out;
  2. outputStream对象,只能输出字节,bufferedReader只能输入字符,通过String line 存取,必须通过String.getBytes() --> 字符转换成字节数组;
BufferedReader br = new BufferedReader(new FileReader("Student.txt"));
//创建字符缓冲流对象
OutputStream os = System.out;
//创建字节流输出对象

String line;
while ((line = br.readLine()) != null) {
    os.write(line.getBytes());
    os.write("\r\n".getBytes());
    //String.getBytes() --> 将String对象转换成Byte对象;
}

os.close();
br.close();

3.转换类输出输入流

  • 字符流 = 字节流 + 编码
  • 将数据输出到命令行 --> 输出流
  • 将键盘数据输入到Java程序 --> 输入流

转换输出流

  1. 字节流 (OutputStream&InputStream)只能输出字节,无法直接输出字符,必须通过转换流 (OutputStramWriter&InputStramReader)进行转换输出;
  2. outputStreamWriter将outputStream<字节输出流>转换成字符输出;

读取文件 – 命令行输出

  • OutputStreamWriter
  1. 构造函数: new OutputStreamWriter (new OutputStream);
  2. Writer w = new OutputStreamWriter (System.out);//向上转型;
BufferedReader br = new BufferedReader(new FileReader("Student.txt"));
Writer w = new OutputStreamWriter(System.out);
String line;
while ((line = br.readLine()) != null) {
    w.write(line);
    w.write("\r\n");
    //可直接输出字符,无需转换
}
  • 优化
  • 通过BufferedWriter创建字符缓冲输出流对象;
  1. 构造函数:BufferedWriter bw = new BufferedWriter (new Writer);
  2. BufferedWriter bw = new BufferedWriter (w);
String line;
while ((line = br.readLine()) != null) {
    bw.write(line);
    bw.newLine();
    //bufferedWriter.newLine() --> 实现换行;
}

转换输入流

  • InputStream<标准字节输入流>: 只能以字节为单位输入;
  • InputStreamReader<转换字节输入流>: 属于字符输入流,
  • 优化 可以创建BufferedReader对象 (new ButteredReader(new Reader())),reader为字符输入流的超类,能创建所有子类进行向上转型调用;

键盘输入 – 输出到文件

  1. InputStream<标准字节输入流>
InputStream is = System.in;
//  输入流:键盘输入信息
BufferedWriter bw = new BufferedWriter(new FileWriter("file_1.txt",true));
//  输出流: java程序 --> 文本
int len;
byte[] bs = new byte[1024];
while ((len = is.read(bs)) != -1) {
    bw.write(new String(bs,0,len));
    bw.flush();
}

is.close();
bw.close();
  1. InputStreamReader<转换输入流>
InputStream is = System.in;
//  输入流:键盘输入信息
Reader r = new InputStreamReader(is);
BufferedWriter bw = new BufferedWriter(new FileWriter("file_1.txt",true));
//  输出流: java程序 --> 文本

char[] chs = new char[1024];
int len;
while ((len = r.read(chs)) != -1) {
    bw.write(chs,0,len);
    bw.flush();
}

r.close();
bw.close();

猜你喜欢

转载自blog.csdn.net/weixin_40107544/article/details/88615859