关于java:字节流-IO流

39次阅读

共计 4548 个字符,预计需要花费 12 分钟才能阅读完成。

字节流

IO 流概述和分类


读得懂的是字符流,读不懂就是字节流

字节流写数据

在 java.io 包下,要导包
InputStream 示意所有输出字节流的超类,OutputStream 示意所有输出字节流的超类,子类名称都是以其父类名作为子类名的后缀

//FileOutputStream(String name), 创立文件输入流以指定的名称写入文件
// 创立字节输入流对象
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter 抛出异样 FileNotFoundException
/*
创立字节输入流对象做了三件事件
    调用零碎性能创立了文件 
    创立了字节输入流对象
    让字节输入流对象指向创立好的文件
*/

//write (int b) 将指定的字节写入此文件输入流
fos.write(b:97);// 抛出异样 IOException 下面那个异样是这个的子类
// 下面输入的是字符 也就是 ASCII 码值为 97 的字符,即 a
fos.write(b:57);// 输入字符 9
fos.write(b:55);// 输入字符 7

//void close(); 敞开此文件输入流闭关开释与此流相关联的任何系统资源
fos.close();

所有和 IO 操作的最初都要开释资源

字节流写数据 3 种形式

// 创立文件输入流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter 抛出异样 FileNotFoundException
// 下面就是将输出的那个字符串门路封装成了一个新的 File 对象

///File file 创立文件输入流以写入由指定的 File 对象示意的文件
File file = new File(pathname:"myByteStream\\fos.txt");
FileOutputStream fos2 = new FileOutputStream(file);
// 也就是
FileOutputStream fos3 = new FileOutputStream(new File(pathname:"myByteStream\\fos.txt"));

// 写数据形式
//int b  上面输入 abcde
fos.write(b:97);
fos.write(b:98);
fos.write(b:99);
fos.write(b:100);

//byte[] b 将字节从指定的字节数组写入此文件输入流
// 先定义一个字节数组
byte[] bys = {97,98,99,100,101};//ASCII 码值 还是转化成对应的字符 输入 abcde
fos.write(bys);
// 也能够通过 String 类的一个办法取得字节数组 getBytes(); 返回字符串对应的字节数组
byte[] bys = "abcde".getBytes();// 通过字符串失去一个字节数组
fos.write(bys);// 输入一样


///byte[] b,int off,int len 从指定的字节数组开始,从偏移量 off 开始写入此文件输入流
fos.write(bys,off:0,bys.length);// 输入一样
fos.write(bys,off:1,len:3);// 从索引 1 地位开始写三个 也就是写入 bcd

// 开释资源
fos.close();

字节流写数据的两个小问题

换行
// 创立文件输入流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt");//alt enter 抛出异样 FileNotFoundException
// 写数据
for(int i = 0;i<10;i++){fos.write("Hello".getBytes());
    fos.write("\r\n".getBytes());//windows 零碎 \r\n 时换行 用记事本关上能力换行 linux \n 换行 mac \r 换行
}

// 开释资源
fos.close();

追加写入
// 追加写入
FileOutputStream(String name,Boolean append);
// 如果第二个参数 append 为 true,则字节将写入文件的开端而不是结尾 true 就是追加写入


// 创立文件输入流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\fos.txt",append:true);//alt enter 抛出异样 FileNotFoundException
// 写数据
for(int i = 0;i<10;i++){fos.write("Hello".getBytes());
    fos.write("\r\n".getBytes());//windows 零碎 \r\n 时换行 用记事本关上能力换行 linux \n 换行 mac \r 换行
}

// 开释资源
fos.close();

字节流写数据加异样解决


// 退出 finally 来实现开释资源
// 创立文件输入流以指定的名称写入文件
FileOutputStream fos = null;
try{fos = new FileOutputStream(name:"myByteStream\\fos.txt");
    fos.write("Hello".getBytes());
}catch(IOException e){e.printStackTrace();
}finally{if(fos != null){// 不判断的花如果门路不存在执行 finally 那就会产生一个空指针
        try{fos.close();
        }catch(IOException e){e.printStackTrace();
        }
    } 
}

字节流读数据(一次读一个字节数据)

把文件 fos.txt 中的内容读取进去在控制台输入

// 创立文件输入流以指定的名称写入文件
FileInputStream fis = new FileInputStream(name:"myByteStream\\fis.txt");//alt enter 抛出异样 IOException 

// 调用字节输出流对象的读数据办法
//int read(); 从该输出流读取一个字节的数据
// 读取数据 如果文件达到开端,那么返回值是 -1
// 换行能够本人读取进去


// 读取数据
int by = fis.read();
while(by != -1){System.out.print(by);
    System.out.print((char)by);// 将 ASCii 码值强制转化为字符串
    by = fis.read();// 输入后面那个而后读取下一个 再进行判断}

// 优化下面的循环
//fis.read() 读数据
//by = fis.read() 把读取到的数据赋值给 by
//by != -1 判断读取到的数据是否是 -1
int by;
while((by = fis.read()) != -1){System.out.print(by);
    System.out.print((char)by);// 将 ASCii 码值强制转化为字符串
}

// 开释资源
fis.close();

案例 复制文本文件

把 ”E:\itcast\ 窗里窗外.txt” 复制到模块目录下的 ” 窗里窗外.txt”

// 依据数据源创立字节流输出对象
FileInputStream fis = new FileInputStream(name:"E:\\itcast\\ 窗里窗外.txt");//alt enter 抛出异样 IOException 
// 依据目的地创立字节输入流对象
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\ 窗里窗外.txt");//alt enter 抛出异样 IOException 

// 读写数据 复制文本文件 一次读取一个 一次写入一个
int by;
while((by = fis.read()) != -1){fos.write(by);
}

// 开释资源
fis.close();
fos.close();

字节流读数据(一次读一个字节数组数据)

把文件 fos.txt 中的内容读取进去在控制台输入

// 创立字节输出流对象
FileInputStream fis = new FileInputStream(name:"myByteStream\\fis.txt");//alt enter 抛出异样 IOException 

// 调用字节输出流对象的读数据办法 一次读一个字节数组
//int read(byte[] b); 从该输出流读取最多 b.length 个字节的数据到一个字节数组
byte[] bys = new byte[5];// 创立一个字节数组容器

// 理论读取长度是 -1,阐明曾经到了开端


// 第一次读取数据
int len = fis.read(bys);
sout(len);// 输入 5
//String(byte[] bytes)
sout(new String(bys));// 输入 Hello

// 第一次读取数据
int len = fis.read(bys);
sout(len);// 输入 5
sout(new String(bys));// 输入 wor

/*
Hello\r\n
world\r\n
输入 第一次 Hello
     第二次 \r\nwor 在控制台输入 \r\n 就变成了换行空格
     第三次 ld\r\nr 因为最初只剩下四个 所以只有后面四个地位的内容换了,第五个没换还保留原来第五个的内容也就是 r 输入变成 ld 换行 r
*/
// 开释资源
fis.close();


所以说 len 返回的不是字节数组的长度,而是理论咱们读取的数据的个数

sout(new String(bys,offset:0,len));// 读了几个数据就转换几个数据 

优化用循环改良

byte[] bys = new byte[1024];// 个别是 1024 及其整数倍
int len;
while((len = fis.read(bys))!= -1){sout(new String(bys,offset:0,len));// 读了几个数据就转换几个数据
}
// 开释资源
fis.close();

案例 复制图片

把 ”E:\itcast\mn.jpg” 复制到模块目录下的 ”mn.jpg”

// 依据数据源创立字节流输出对象
FileInputStream fis = new FileInputStream(name:"E:\\itcast\\mn.jpg");//alt enter 抛出异样 IOException 
// 依据目的地创立字节输入流对象
FileOutputStream fos = new FileOutputStream(name:"myByteStream\\mn.jpg");//alt enter 抛出异样 IOException 

// 读写数据 复制图片 一次读取一个字节数组 一次写入一个字节数组
byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys))!= -1){fos.write(bys,offset:0,len);
}

// 开释资源
fis.close();
fos.close();

正文完
 0