IO定义:

  写:Output操作:将内存上的数据持久化 到设备上,这个动作称为输出;

  读:Input操作:把硬盘上的东西读取到内存,这个动作称为输入;              这两种操作称为IO流

IO流可以分为两类:字节流   字符流

字节流

  输入和输出:参照物,都是java程序来参照 

  字节时输入流类:InputStream   字节输出流类:OutputStream

  字节输入流类和字节输出流类都是抽象类,所以只能通过子类来创建实例化对象。示例:输出流

  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4.  
  5. public class Demo2 {
  6. public static void main(String[] args) throws IOException {
  7. //通过子类FileOutputStream类建立输出流对象
  8. OutputStream out=new FileOutputStream("d:\\a.txt");
  9. //调用OutputStream的write(int b)方法,写入字节数据到磁盘上的文件
  10. out.write();
  11. byte[] b={'A','B','C'};
  12. //写入字节数组write(byte[] b)
  13. out.write(b);
  14. //write(byte[] b,int off,int len)写入字节数据,从x下标开始,写入数据的个数
  15. out.write(b,,);
  16. //释放资源
  17. out.close();
  18. }
  19. }

输入流:

  1. package com.zs.Demo;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5.  
  6. public class Demo3 {
  7. public static void main(String[] args) {
  8. try {
  9. fun1();
  10. fun2();
  11. fun3();
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16.  
  17. private static void fun3() throws IOException {
  18. FileInputStream in=new FileInputStream("d:\\a.txt");
  19. byte[] b=new byte[1024];
  20. int len=0;
  21. while((len=in.read(b,0,2))!=-1){
  22. //字符数组转字符串
  23. System.out.println(new String(b,0,len));
  24. /* dA
  25. BC
  26. C*/
  27. }
  28. in.close();
  29. }
  30.  
  31. private static void fun2() throws IOException {
  32. FileInputStream in=new FileInputStream("d:\\a.txt");
  33. byte[] b=new byte[1024];
  34. int len=0;
  35. while((len=in.read(b))!=-1){
  36. //字符数组转字符串
  37. System.out.println(new String(b,0,len));//dABCC
  38. }
  39. in.close();
  40. }
  41. private static void fun1() throws IOException {
  42. FileInputStream in=new FileInputStream("d:\\a.txt");
  43. //read()从输入流中读取数据的下一个字节;当没有字节时返回-1;
  44. int len=0;
  45. while((len=in.read())!=-1){
  46. System.out.println((char)len);//d A B C C
  47. }
  48. in.close();
  49. }
  50. }

续写:

  1. public class Demo4 {
  2. public static void main(String[] args) throws IOException {
  3. File f=new File("d:\\a.txt");
  4. FileOutputStream fou=new FileOutputStream(f,true);
  5. fou.write("hello\r\n".getBytes());// \r\n回车换行,getBytes()将字符串转字节数组
  6. fou.close();
  7. }
  8. }//如果文件存在,不会覆盖,会把内容追加到文件内容后面

异常处理:

  1. package com.zs.Demo;
  2.  
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5.  
  6. public class Demo5 {
  7. public static void main(String[] args) {
  8. FileOutputStream fou=null;
  9. try {
  10. fou=new FileOutputStream("d:\\a.txt");
  11. fou.write("java".getBytes());
  12. } catch (IOException e) {
  13. System.out.println(e);
  14. throw new RuntimeException("文件写入失败");
  15. }finally {
  16. try {
  17. if (fou != null) {
  18. fou.close();
  19. }
  20. } catch (IOException e) {
  21. throw new RuntimeException("释放资源失败");
  22. }
  23. }
  24. }
  25. }

复制文件:

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4.  
  5. public class CopyFile {
  6. public static void main(String[] args) {
  7. FileInputStream fin=null;
  8. FileOutputStream fou=null;
  9. try {//在main方法中,尽量使用try语句,其他方法中用throw
  10. fin=new FileInputStream("d:\\a.txt");
  11. fou=new FileOutputStream("e:\\a.txt");
  12. //首先读取d盘下的a文件内容到内存
  13. int len=0;
  14. while((len=fin.read())!=-1){
  15. fou.write(len);
  16. }
  17. } catch (IOException e) {
  18. throw new RuntimeException("文件复制失败");
  19. }finally {
  20. if (fou!=null){
  21. try {
  22. fou.close();//先打开的后关闭,后打开的先关闭,这里先关闭输出流,
  23. } catch (IOException e) {
  24. throw new RuntimeException("输出流资源释放失败");
  25. }finally {
  26. if (fin!=null){
  27. try {
  28. fin.close();
  29. } catch (IOException e) {
  30. throw new RuntimeException("输入流资源释放失败");
  31. }
  32.  
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }

上一个方法中,一次只复制一字节的文件,当文件太大时,复制速度太慢,如下:用上面的代码复制一个视频,一字节一字节复制

  1. package com.zs.Demo2;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6.  
  7. public class CopyFile {
  8. public static void main(String[] args) {
  9. FileInputStream fin=null;
  10. FileOutputStream fou=null;
  11. try {//在main方法中,尽量使用try语句,其他方法中用throw
  12. fin=new FileInputStream("d:\\1.mp4");
  13. fou=new FileOutputStream("e:\\1.mp4");
  14. //首先读取d盘下的a文件内容到内存
  15. int len=0;
  16. long l = System.currentTimeMillis();
  17. while((len=fin.read())!=-1){
  18. fou.write(len);
  19. }
  20. long l1 = System.currentTimeMillis();
  21. System.out.println(l1-l);//158014 可以发现,复制了158秒,速度很慢
  22. } catch (IOException e) {
  23. throw new RuntimeException("文件复制失败");
  24. }finally {
  25. if (fou!=null){
  26. try {
  27. fou.close();//先打开的后关闭,后打开的先关闭,这里先关闭输出流,
  28. } catch (IOException e) {
  29. throw new RuntimeException("输出流资源释放失败");
  30. }finally {
  31. if (fin!=null){
  32. try {
  33. fin.close();
  34. } catch (IOException e) {
  35. throw new RuntimeException("输入流资源释放失败");
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }

为了提高速度,采用字节数组,

  1. package com.zs.Demo2;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6.  
  7. public class CopyFileByByte {
  8. public static void main(String[] args) {
  9. FileInputStream fin=null;
  10. FileOutputStream fou=null;
  11.  
  12. try {
  13. fin=new FileInputStream("d:\\1.mp4");
  14. fou=new FileOutputStream("e:\\1.mp4");
  15. int len=0;
  16. byte[] b=new byte[1024];//这里的意思是一次复制1kb,也可以把数组大小改变1MB(1024*1024)
  17. long l = System.currentTimeMillis();
  18. while((len=fin.read(b))!=-1){
  19. fou.write(b);
  20. }
  21. long l1 = System.currentTimeMillis();
  22. System.out.println(l1-l);//325 只要325毫秒就复制好了
  23. } catch (IOException e) {
  24. throw new RuntimeException("复制失败");
  25. }finally {
  26. if (fou!=null){
  27. try {
  28. fou.close();
  29. } catch (IOException e) {
  30. throw new RuntimeException("释放资源失败");
  31. }finally {
  32. if (fin!=null){
  33. try {
  34. fin.close();
  35. } catch (IOException e) {
  36. throw new RuntimeException("释放资源失败");
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }

  

Java学习笔记28(IO字节流)的更多相关文章

  1. java学习笔记之IO编程—字节流和字符流

    1. 流的基本概念 在java.io包里面File类是唯一一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操 ...

  2. Java学习笔记之 IO包 字节流

    IO包最重要的五个类和一个接口 File/OutputStream/InputStream(字节流)/Writer/Reader(字符流) 一个接口:Serializable   File类: 字节流 ...

  3. 【原】Java学习笔记033 - IO

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:继承关系中爷 ...

  4. Java学习笔记之——IO

    一. IO IO读写 流分类: 按照方向:输入流(读),输出流(写) 按照数据单位:字节流(传输时以字节为单位),字符流(传输时以字符为单位) 按照功能:节点流,过滤流 四个抽象类: InputStr ...

  5. java学习笔记之IO编程—打印流和BufferedReader

    1.打印流(PrintWriter) 想要通过程序实现内容输出,其核心一定是要依靠OutputStream类,但是OutputStream类有一个最大缺点,就是这个类中的输出操作功能有限,所有的数据一 ...

  6. java学习笔记之IO编程—内存流、管道流、随机流

    1.内存操作流 之前学习的IO操作输入和输出都是从文件中来的,当然,也可以将输入和输出的位置设置在内存上,这就需要用到内存操作流,java提供两类内存操作流 字节内存操作流:ByteArrayOutp ...

  7. Java学习笔记37(字节流)

    输出:程序到文件 输入:文件到程序 字节输出流:OutputStream类 作用:在java程序中写文件 这个类是抽象类,必须使用它的子类 方法: 写入: package demo; import j ...

  8. Java学习笔记-10.io流

    1.输入流,只能从中读取数据,而不能向其写出数据.输出流,只能想起写入字节数据,而不能从中读取. 2.InputStream的类型有: ByteArrayInputStream 包含一个内存缓冲区,字 ...

  9. java学习笔记之IO编程—对象序列化

    对象序列化就是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或网络传输. 并不是所有的对象都可以被序列化,如果要序列化的对象,那么对象所在的类一定要实现java.io.Serial ...

随机推荐

  1. mac终端下连接阿里云服务器

    通过ssh连接 ssh 用户名@地址 ssh root@xx.xxx.xxx.xx https://www.jianshu.com/p/f034817a7837 最后还是通过  FileZilla 连 ...

  2. JAVA OCR图片识别

    今天闲来无聊,尝试了一下OCR识别,尝试了以下三种方案: 1.直接使用业界使用最广泛的Tesseract-OCR. Tesseract项目最初由惠普实验室支持,1996年被移植到Windows上,19 ...

  3. linux常用文本编缉命令(strings/sed/awk/cut)

    一.strings strings--读出文件中的所有字符串 二.sed--文本编缉 类型 命令 命令说明 字符串替换 sed -i 's/str_reg/str_rep/' filename 将文件 ...

  4. Qt贴图实现地图标记效果

    #include "wgtmap.h" #include "ui_wgtmap.h" #include <QPainter> #define IMG ...

  5. Qt与JS(三)

    Qt不错的学习网址: http://www.cnblogs.com/findumars/p/5529526.html ----------------------------------------- ...

  6. SpringBoot配置文件的加载位置

    1.springboot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 --file:/config/ - ...

  7. SpringBoot添加webapp目录

    一.文章简述 使用IDEA工具创建的SpringBoot项目本身是没有webapp目录的.如果我们想要添加webapp目录的话,可以手动添加. 二.操作步骤 1)点击IDEA右上角的Project S ...

  8. read later

       https://groups.google.com/forum/#!msg/pylearn-users/FYtpaQKoC4c/ubitO_JUC1kJ           网上论坛 发布回复 ...

  9. Unity中物体碰撞后去掉相互之间的反弹力

    最近自制了一个的角色控制器(没有重力的角色)时发现,角色碰撞到墙壁之后会有一个小小的反弹力导致角色有一个微弱的反弹位移,这样给人一种不好的感觉.研究了一下,除了限制坐标轴( Rigidbody---C ...

  10. struts访问

    struts基本工程结构: 1. struts.xml支持语法提示;2. struts.xml配置常量, 用来覆盖struts.properties中的默认常量配置  一般情况下, 这个配置放在str ...