IO (input output)
io流用来处理设备之间的数据传输
java对数据的操作是通过流的方式
java用于操作流的对象都在IO包中
流按操作数据分为两种 字节流 和字符流
字节流能处理所有数据 ASCII 美国 标准编码表 二进制字母 相对应 中国后期扩展成GB2312——>GBK
一个中文在GBK有对应的数字 在UNICODE  对应的数字不同
UNICODE 对文字进行重新排序因为各国文字不同  数字不同
为了自己能够指定码表 并读取 就将字节流和编码表一起封装称为字符流
能读取数据的流按流向分为 输入流 和输出流

/*
  * 输入流和输出流相对于内存设备而言
  * 将外设中的数据读取到内存中 输入
  * 将内存的数据写入到外设中 输 出
  *
  * 字符流的由来
  * 其实就是 字节流读取文字字节数据后 不直接操作而是先查指定的编码表 获取对应的文字
  * 再对这个文字进行操作 简单说 字节流+编码表
  *
  * 字节流的抽象基类
  *  InputStream OutputStream
  * 字符流的抽象基类
  * Reader(输入流) Writer
  * 由这四个类派生出来的子类名称几乎都是以其父类名作为子类名的后缀
  * 子类名的前缀就是该对象的功能
  * 比如 InputStream 的子类FileInputStream
  * Reader 的子类 FileReader
  */
 public class IODemo01 {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");//注意加上双引号获取系统属性


public static void main(String[] args) throws IOException {
/*
* 将一些文字存储到硬盘一个文件中
* 如果要操作文字数据 建议优先考虑字符流
* 而且要将数据从内存写到硬盘上  要使用字符流中的输出流 Writer
* 硬盘的数据基本体现是文件 希望找到一个可以操作文件的Writer
*
* 找到了FileWriter 没有空参 因为要写到指定位置
*
*/
//创建一个可以往文件中写入字符数据的字符输出流对象
//既然是往一个文件中写入文字数据 那么在创建对象时 就必须明确该文件 用于存储数据的目的地
//如果文件不存在则会自动创建
//如果文件存在 则会被覆盖. (干掉它 再创建一个)
//如果构造函数中加入true  可以实现对文件的学续写
FileWriter fw = new  FileWriter ("demo.txt",true); //可能没有位置 乱输
/*
* 调用Writer 对象中的write(String)方法 写入数据
* 其实数据写入到了临时存储缓冲区中
*
*/
fw.write("ssr"+LINE_SEPARATOR+"ss");
/*
* 进行刷新 将数据直接写入到目的地中
* 使用的是windows 的资源 通过windows 创建 输入 关闭 用windows的写入方式
*/
 // fw.flush();
/*
* 为了节约windows的资源
* 关闭流 关闭资源 不然越来越卡
* 在关闭前会先调用flush刷新缓存中的数据到 目的地 相当于 编写完后问你保存么?
*/
fw.close();
 // fw.write("s"); //流关闭了不能再写入
}
 }
public class IODemo02 {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) {
FileWriter fw = null; // 在try 外面创建引用变量 在try 里面初始化 一般流都这样处理
try {
fw = new FileWriter("k:\\demo.txt");


fw.write("11" + LINE_SEPARATOR + "22");// 写入失败 会抛异常


} catch (IOException e) {


e.printStackTrace();
} finally {
if (fw != null) {// 要先判断 不等于空再关闭 不然出现 空指针异常
try {
fw.close();// 对象没有创建出来finally执行就出现空指针异常
} catch (IOException e) {


throw new RuntimeException("关闭失败"); // 要告诉对方坏了
} // 会由windows 抛出异常告诉你
}
}
}
 }
/*
  * 读取一个文本文件 将读取到的字符打印到控制台
  * 找到了FileReader
  */
 public class ReaderDemo01 {
public static void main(String[] args) throws IOException {
//1、创建读取字符数据的流对象
/*
* 在创建读取流对象时 必须要明确被读取的文件 一定要确定该文件是确定的
* 没文件 读什么?
* 用一个读取流关联一个已存在文件
*/
FileReader fr = new FileReader("demo.txt");


//用Reader中的read 读取文件  文件读到最后硬盘内是#但是为了易读且 字符取值范围是0~65535 所以返回-1 告诉你读完了
 // int ch = fr.read();//读二进制 硬盘里面存二进制
 // System.out.println((char)ch);//转化类型
int ch = 0;
while((ch=fr.read())!=-1){
System.out.println(ch);
}
fr.close();

}
 }
public static void main(String[] args) throws IOException {


FileReader fr = new FileReader("demo.txt");
/*
* 使用read(char[]) 读取文本文件数据
*
* 先创建字符数组
*/
char[] buf = new char[3];// 默认大小1024


int len = 0;
while ((len = fr.read(buf)) != -1) {// 先先通过read 把文件中的数据读入到字符数组中才能进行遍历
System.out.println(new String(buf, 0, len));// 不然根本就不能存放数据后读取
}


// int num = fr.read(buf); //将读到的字符存储到数组中
//
// System.out.println(num+":"+new
// String(buf));//String里面传入buf即一个数组后打印这个数组的内容
//
// int num1 = fr.read(buf);//通过int read 之后把fr的3个字符放到buf中用String打印数组
// System.out.println(num1+":"+new String(buf));
// int num2 = fr.read(buf);
// System.out.println(num2+":"+new String(buf));
// System.out.println(num1+":"+new String(buf));
fr.close();


}

Java StringBuilder 邮件换行 java writer怎么换行_System