Java基础之IO流 字节输入输出流

、字节流
首先明确 输入输出是相对于程序作为参照的
所以 输入流 是指 往程序中输入 即读文件
输出流 是指程序输出数据 即往文件中输入 写文件

输入流 读文件 byte那个数 1024 是字节 1024*10才为1kB

Java基础之IO流 字节输入输出流_第1张图片
while里面的话
将每次读的字节放入字节数组
该方法返回读的字节数 即长度 用len接收

Java基础之IO流 字节输入输出流_第2张图片
里面还有一个字节 转 字符串 注意方法

1、IO流概述
IO流:输入输出流(Input/Output)
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流
流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流

2、字节输出流
OutputStream类定义
public abstract class OutputStream extends Object implements Closeable, Flushable
此抽象类是表示输出字节流的所有类的超类。输出流接受输出字节并将这些字节发送到InputStream 类某个接收器要向文件中输出,使用FileOutputStream类
3、字节输入流
定义:
public abstract class InputStream extends Object implements Closeable
此抽象类是表示字节输入流的所有类的超类。
FileInputStream 从文件系统中的某个文件中获得输入字节。

package com.vince;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 字节输出输入流
 * 输出流:超类 OutputStream,对文件的输出流使用子类FileOutputStream
 * 输入流:超类InputStream,对文件的输入流使用子类FileInputStream
 * 
 * 输入输出字节流操作原理,每次只会操作一个字节,(从文件中读取或写入 )
 * 字节操作流,默认每次执行写入操作会直接把数据写入文件
 * @author vince
 * @description
 */
public class ByteStreamDemo {
	
	private static void in(){
		//0、确定目标文件
		File file = new File("c:\\test\\vince.txt");
		//1、构建 一个文件输入流对象
		try {
			InputStream in = new FileInputStream(file);
			
			byte[] bytes = new byte[10];
			StringBuilder buf = new StringBuilder();
			int len = -1;//表示每次读取的字节长度
			//把数据读入到数组中,并返回读取的字节数,当不等-1时,表示读取到数据,等于-1表示文件已经读完
			while((len = in.read(bytes))!=-1){
				//根据读取到的字节数组,再转换为字符串内容,添加到StringBilder中
				buf.append(new String(bytes,0,len));
			}
			//打印内容:
			System.out.println(buf);
			//关闭输入流
			in.close();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	
	private static void out(){
		//0、确定目标文件
		File file = new File("c:\\test\\vince.txt");
		//1、构建一个文件输出流对象
		try {
			OutputStream out = new FileOutputStream(file,true); //append 为true表示追加内容
			//2、输出的内容
			String info = "小河流水哗啦啦\r\n";// \r\n表示换行
			
			//String line = System.getProperty("line.separator");//获取换行符 用line代替上述换行符号也行
			//3、把内容写入到文件
			out.write(info.getBytes());
			//4、关闭流
			out.close();
			System.out.println("write success.");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public static void main(String[] args) {

		out();
//		in();
	}

}

buf.append(new String(bytes,0,len));

这个方法 一定要加上 0 到len 不然 只使用 buf.append(new String(bytes));这个方法的话
如果每次读10个字节
若文件有 小河流水哗啦啦 七个字 14个字节
第二次读到4个字节 两个字 但剩下的6个字节空位(第一次读到的)没有被覆盖
即第一次读到 小河流水哗
第二次虽然实际只读到 啦啦 但最后输出10个字节 啦啦流水哗
Java基础之IO流 字节输入输出流_第3张图片
对了 那个填的字节数还不能用单数 要不读出来的中文会是乱码 一个一个字节读出来 再翻译成字符串 肯定是乱码
要解决使用字符流

你可能感兴趣的:(Java)