A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Kevin.Kang 高级黑马   /  2015-7-24 14:47  /  978 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Kevin.Kang 于 2015-7-27 16:53 编辑

IO流分类:(默认情况按照数据类型分)
        流向:(以java程序为参照物)
                输入流:读取数据
                输出流:写入数据
        数据类型:
                字节流
                        字节输入流:
                                读取数据:InputStream
                        字节输出流:
                                写入数据:OutputStream
                字符流
                        字符输入流:
                                读取数据:Reader
                        字符输出流:
                                写入数据:Writer

用系统自带的笔记本打开,读得懂的可以用字符流,读不懂就只能用字节流。



11 个回复

倒序浏览
  1. package com.kxg.IO;

  2. import java.io.FileOutputStream;
  3. import java.io.IOException;

  4. /*
  5. * 需求:往一个.txt文件里面写入hello,worle
  6. *
  7. * 往文件里面写入数据用OutputStreamhen
  8. * 因为OutputStreamhen是抽象类,所以要用它的子类FileOutputStream
  9. */
  10. public class FileInputStreamDemo {
  11.         public static void main(String[] args) throws IOException {
  12. //                创建字节流对象
  13.                 FileOutputStream fos = new FileOutputStream("a.txt");
  14.                
  15. //                调用write()方法
  16.                 fos.write("hello,world".getBytes());
  17.                
  18. //                释放资源
  19.                 fos.close();
  20.         }
  21. }
复制代码
创建字节流对象一共做了三件事:
        1.如果a.txt文件不存在,就创建一个a.txt文件
        2.创建fos对象
        3.把fos对象指向a.txt文件

write()方法:
        public void write(byte[] b)throws IOException
        public void write(byte[] b,int off,int len)throws IOException
        public abstract void write(int b)throws IOException
        write()方法需要传入的是字节数组,
        把需要传入的字符串转为字节数组传入就行。

close():释放资源
        让流对象变成垃圾,可以被垃圾回收器回收
        通知系统释放跟该文件相关的资源

回复 使用道具 举报
本帖最后由 Kevin.Kang 于 2015-7-24 16:46 编辑

Write()方法:
  1. package com.kxg.IO;

  2. import java.io.FileOutputStream;
  3. import java.io.IOException;

  4. /*
  5. * write()方法:
  6. *                 public abstract void write(int b):写一个字节
  7. *                 public void write(byte[] b):写一个字节数组
  8. *                 public void write(byte[] b,int off,int len):写一个字节数组的一部分
  9. */
  10. public class WriteDemo {
  11.         public static void main(String[] args) throws IOException {
  12.                 FileOutputStream fos = new FileOutputStream("a.txt");

  13.                 fos.write(97);// 97底层二进制数据,通过记事本打开,记事本找到97对应的字符值就是a
  14.                 fos.write("hello,java".getBytes());

  15.                 byte[] by = { 97, 98, 99, 100 };
  16.                 fos.write(by, 0, 2);// 包前不包后,包含0不包含2

  17.                 fos.close();
  18.         }
  19. }
复制代码




回复 使用道具 举报
本帖最后由 Kevin.Kang 于 2015-8-28 11:30 编辑

数据换行和追加写入:
  1. package com.kxg.IO;

  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.Scanner;

  5. /*
  6. * 需求:数据换行以及追加写入
  7. */
  8. public class WriteDemo2 {
  9.         public static void main(String[] args) throws IOException {

  10.                 // 构造方法的可以实现追加写入
  11.                 FileOutputStream fos = new FileOutputStream("a.txt", true);

  12.                 Scanner sc = new Scanner(System.in);
  13.                 System.out.println("输入内容:");
  14.                 String s = sc.nextLine();
  15.                 fos.write(s.getBytes());
  16.                 fos.write("\r\n".getBytes());

  17.                 fos.close();
  18.         }
  19. }
复制代码


数据换行:
        不同的系统识别不同的换行符号
        windows:\r\n
        linux:\n
        MAC:\R
        常见的高级记事本所有的都可以识别。


数据追加写入:
        利用构造方法可以实现数据追加写入,每运行一次就写入一次。


回复 使用道具 举报
读取数据:
  1. package com.kxg.IO;

  2. import java.io.FileInputStream;
  3. import java.io.IOException;

  4. /*
  5. * 读取数据:
  6. *         字节输入流
  7. *                 创建字节输入流对象
  8. *                 用read()方法,把结果显示在控制台
  9. *                 释放资源
  10. *
  11. * read()方法:
  12. *                 public int read():一次读一个字节
  13. *                 public int read(byte[] b):一次对一个字节数组
  14. *                 public int read(byte[] b,int off,int len):一次对一个字节数组的一部分
  15. */
  16. public class ReadDemo {
  17.         public static void main(String[] args) throws IOException {
  18.                 FileInputStream fis = new FileInputStream("a.txt");
  19.                
  20. //                第一次读取
  21.                 // int i = fis.read();
  22.                 // System.out.println(i);
  23.                 // System.out.println((char) i);//返回的是int类型的值,需要强制转换为char
  24.                 //
  25. //                第二次读取
  26.                 // i = fis.read();
  27.                 // System.out.println(i);
  28.                 // System.out.println((char) i);
  29.                 // System.out.println("===================");

  30.                 // while循环改进
  31.                 int by = 0;// 初始化变量
  32.                 // 读取到最后再往后读就是-1,不等于-1的时候全打印出来
  33.                 while ((by = fis.read()) != -1) {
  34.                         System.out.print((char) by);
  35.                 }

  36.                 // 释放资源
  37.                 fis.close();
  38.         }
  39. }
复制代码



回复 使用道具 举报
本帖最后由 Kevin.Kang 于 2015-7-24 17:49 编辑

复制内容到新文件中去:
  1. package com.kxg.IO;

  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;

  5. /*
  6. * 需求:把指定文件内容复制到指定文件里面去。
  7. *
  8. * 数据源:
  9. *         a.txt        --读取        --FileInputStream
  10. *
  11. * 目的地:
  12. *         b.txt        --写入        --FileOutputStream
  13. */
  14. public class CopyDemo2 {
  15.         public static void main(String[] args) throws IOException {
  16.                 // 封装数据源
  17.                 FileInputStream fis = new FileInputStream("a.txt");
  18.                 FileInputStream fis2 = new FileInputStream("D:\\Test\\a.txt");

  19.                 // 封装目的地
  20.                 FileOutputStream fos = new FileOutputStream("b.txt");
  21.                 FileOutputStream fos2 = new FileOutputStream("D:\\Test\\Test2\\b.txt");

  22.                 int i = 0;
  23.                 while ((i = fis.read()) != -1) {
  24.                         fos.write(i);
  25.                 }
  26.                 while ((i = fis2.read()) != -1) {
  27.                         fos2.write(i);
  28.                 }

  29.                 fis.close();
  30.                 fos.close();
  31.                 fis2.close();
  32.                 fos2.close();
  33.         }
  34. }
复制代码




回复 使用道具 举报
汉字的存储:
  1. package com.kxg.IO;

  2. import java.util.Arrays;

  3. /*
  4. * 计算机中汉字存储:
  5. *         一个汉字分为两个字节
  6. *                 第一个字节肯定是负数
  7. *                 第二个字节常见是负数,可能是正数,然并卵。
  8. */
  9. public class HanZiDemo {
  10.         public static void main(String[] args) {
  11.                 String s = "汉字";
  12.                 byte[] by = s.getBytes();
  13.                 System.out.println(Arrays.toString(by));
  14.         }
  15. }
复制代码



回复 使用道具 举报
本帖最后由 Kevin.Kang 于 2015-7-24 18:25 编辑

读取一个字节数组:
  1. package com.kxg.IO;

  2. import java.io.FileInputStream;
  3. import java.io.IOException;

  4. /*
  5. * 一次读取一个字节数组:
  6. *                 int read(byte[] b)        返回值为读取了几个字节
  7. */
  8. public class CopyDemo3 {
  9.         public static void main(String[] args) throws IOException {
  10.                 // 封装数据源
  11.                 FileInputStream fis = new FileInputStream("a.txt");

  12.                 // 定义一个字节数组
  13.                 byte[] by = new byte[5];// 一般为1024或者它的倍数

  14.                 // 第一次读取
  15.                 // int i = fis.read(by);
  16.                 // System.out.println(Arrays.toString(by));// 字节数组转为字符数组
  17.                 // System.out.println(new String(by));// 字节数组转为字符串
  18.                 // 每一次读取都会替换上一次相同索引的字节,换行符也会被读取。

  19.                 // 第二次读取
  20.                 // i = fis.read(by);
  21.                 // System.out.println(new String(by));

  22.                 int i = 0;
  23.                 while ((i = fis.read(by)) != -1) {
  24.                         System.out.println(new String(by));
  25.                 }
  26.                 // 释放资源
  27.                 fis.close();
  28.         }
  29. }
复制代码




回复 使用道具 举报
一次读取一个字节数组复制内容:
  1. package com.kxg.IO;

  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;

  5. /*
  6. * 需求:一次读取一个字节数组复制文件
  7. *                
  8. */
  9. public class CopyDemo4 {
  10.         public static void main(String[] args) throws IOException {
  11.                 // 封装数据源
  12.                 FileInputStream fis = new FileInputStream("a.txt");
  13.                 FileInputStream fis2 = new FileInputStream("D:\\Test\\a.txt");

  14.                 // 封装目的地
  15.                 FileOutputStream fos = new FileOutputStream("b.txt");
  16.                 FileOutputStream fos2 = new FileOutputStream("D:\\Test\\Test2\\b.txt");

  17.                 byte[] by = new byte[1024];
  18.                 int i = 0;
  19.                 while ((i = fis.read(by)) != -1) {
  20.                         fos.write(by, 0, i);
  21.                 }
  22.                 while ((i = fis2.read(by)) != -1) {
  23.                         fos2.write(by, 0, i);
  24.                 }

  25.                 fis.close();
  26.                 fos.close();
  27.                 fis2.close();
  28.                 fos2.close();
  29.         }
  30. }
复制代码



回复 使用道具 举报
不错,赞一个
回复 使用道具 举报
不错,学习了
回复 使用道具 举报
字节缓冲区流:
  1. package com.kxg.Buffer;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. /*
  8. * 缓冲区类(高效类):
  9. *
  10. *         BufferedInputStream类:读
  11. *                 public BufferedInputStream(InputStream in):
  12. *         BufferedOuputStream类:写
  13. *                 public BufferedOutputStream(OutputStream out):
  14. * 构造方法参数问题:
  15. *                 字节缓冲区流仅仅提供缓冲区,为高效而设计,真正做读写操作的还是基本的流对象实现。
  16. */

  17. public class BufferDemo {
  18.         public static void main(String[] args) throws IOException {
  19.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
  20.                                 "a.txt"));
  21.                 BufferedOutputStream bos = new BufferedOutputStream(
  22.                                 new FileOutputStream("b.txt"));

  23.                 // int i;
  24.                 // while ((i = bis.read()) != -1) {
  25.                 // bos.write(i);
  26.                 // }
  27.                
  28.                 byte[] by = new byte[1024];
  29.                 int len=0;
  30.                 while ((len = bis.read(by)) != -1) {
  31.                         bos.write(by);
  32.                 }

  33.                 bis.close();
  34.                 bos.close();
  35.         }
  36. }
复制代码




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马