- java中数据操作会涉及流的使用,流有点像管道。
在Java中对系统中文的视频,文本,图片,音频等操作都会使用流,流不仅用于操作文件数据,还可以用来操作网络数据,所以不管处理的数据为准在本地还是网络中某一个地址都使用流来进行处理。
在java中对流的处理都在java.io包中。流的使用中,有一个关键的步骤:关闭流(close),这个操作一般是在程序执行后不需要流的使用时,执行它。 因为流是一种系统资源,不使用就关闭,这是java基本操作。不关闭会一直占用该资源,直到资源耗尽。 在系统中有文件有两种:文本文件(内是保存的是文字信息),另一种是:二进制文件(图片,视频,音频,可执行文件等)针对这两种文件,Java有提供两种操作流:
1.字节流:用于操作二进制文件获取二进制数据,专用于二进制数据处理。
2.字符流:用于操作文本文件数据或获取文本文件,对字符处理有优点。
流的使用一般还会用到(File)对象使用,不同的流有输入/输出之分:
输入流:获取数据,把数据从硬盘或网络终端读取数据到内存。
输出流:输出数据,把数据从内存输出到硬盘或网络终端。
字节流的(api) 字节输入流:(InputStream)
public abstract class InputStream extends Object implements Closeable
字节输出流:(OutputStream) :
public abstract class OutputStream extends Object implements Closeable, Flushable
(InputStream)的API方法:
int |
available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。 |
void |
close() 关闭此输入流并释放与该流关联的所有系统资源。 |
void |
mark(int readlimit) 在此输入流中标记当前的位置。 |
boolean |
markSupported() 测试此输入流是否支持 mark 和 reset 方法。 |
abstract int |
read() 从输入流中读取数据的下一个字节。 |
int |
read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
int |
read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。 |
void |
reset() 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。 |
long |
skip(long n) 跳过和丢弃此输入流中数据的 n 个字节。 |
(OutputStream方法):
void close() 关闭此输出流并释放与此流有关的所有系统资源。
void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b) 将指定的字节写入此输出流。
操作流的步骤:
1.先创建File对象,该File指向文件路径地址
2.创建流对象并传入File,指明操作数据源
3.读取获取是写入数据
4.刷新流(输出流)
5.关闭流(关闭资源)
字节输入流子类:查看API得到字节输入流的子类
FileInputStream
从文件系统中的某个文件中获取输入字节,那些文件取决于主机的文件,用于读取诸如图像数据之类的原始数据。
构造方法:
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
代码示例:
public static void main(String[] args){
//创建文件对象
File f3 = new File("E:/AAA/BBB/CCC/123123.txt");
//操作流的变量
InputStream fis = null;
try {
//创建文件输入流
fis = new FileInputStream(f3);
//保存获取数据
int c;
//读取并判断是否是有效数据
while((c = fis.read()) != -1) {
System.out.println(c);
}
}catch (FileNotFoundException e) {
System.out.println("文件没找到:"+e.getMessage());
} catch (IOException e) {
System.out.println("读取数据异常:"+e.getMessage());
}finally {
if(fis != null) {//保证fis不为null,否则会出现空指针异常
try {
fis.close();//关闭流
fis = null;
} catch (IOException e) {
System.out.println("关闭流异常:"+e.getMessage());
}
}
}
}
操作字节输入流的过程中,读取数据一般使用while循环语句,创建流对象的构造方法一般两种常用,一种是传入File对象,另一种是传入String,两种方式都是将同一个文件路径传入,使用上没有差别
在使用输入流进行读取数据时,一般使用可以将数据存入数组的read方法.
代码示例
public static void main(String[] args){ //创建文件对象 File f3 = new File("E:/AAA/BBB/CCC/123123.txt"); //操作流的变量 InputStream fis = null; try { //创建文件输入流 fis = new FileInputStream(f3); //每次预定读取数据长度 int size = 10; //存储每次读取数据 byte[] temp = new byte[size]; //实际读取的数据长度 int len = 0; //读取并判断是否是有效数据 while((len = fis.read(temp,0,size)) != -1) { System.out.println(Arrays.toString(temp)); for(int i = 0; i < len ; i++) { System.out.println(temp[i]); } } }catch (FileNotFoundException e) { System.out.println("文件没找到:"+e.getMessage()); } catch (IOException e) { System.out.println("读取数据异常:"+e.getMessage()); }finally { if(fis != null) {//保证fis不为null,否则会出现空指针异常 try { fis.close();//关闭流 fis = null; } catch (IOException e) { System.out.println("关闭流异常:"+e.getMessage()); } } } } |
字节输出流子类
FileOutPutStream
将直接数据输出到文件系统中的某个文件中。哪些文件可写入取决于主机环境。 用于读取诸如图像数据之类的原始字节流。
使用输出到文件时,文件不存在也会创建文件
构造方法
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。第二个参数控制是否复写数据还是续写数据 |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。第二个参数控制是否复写数据还是续写数据 |
代码示例
/** * 需求:1.f3文件内容写入到f4 * 2.f4文件每次写入的数据不能被覆盖 * @param args */ public static void main(String[] args){ //创建文件对象 File f3 = new File("E:/AAA/BBB/CCC/1.jpg"); //创建文件对象 File f4 = new File("E:/AAA/BBB/CCC/2.jpg"); //操作流的变量 InputStream fis = null; //操作流的变量 OutputStream fos = null; try { fis = new FileInputStream(f3); //第二个参数决定是对该文件复写还是续写,true:续写,false:复写,续写根据实际情况使用 fos = new FileOutputStream(f4,true); //每次读取的长度 int len = 0; //存放每次读取的数据 byte[] temp = new byte[10]; //读取f3文件一部分 while((len = fis.read(temp)) != -1) { //将读取的数据写入f4中 fos.write(temp,0,len); }
}catch (FileNotFoundException e) { System.out.println("文件没找到:"+e.getMessage()); } catch (IOException e) { System.out.println("读取数据异常:"+e.getMessage()); }finally { try { if(fis != null) { fis.close(); fis = null; } if(fos != null) { fos.close(); fos = null; } } catch (IOException e) { System.out.println("关闭流异常:"+e.getMessage()); } } } |
本文来自博客园,作者:CL396,转载请注明原文链接:https://www.cnblogs.com/gs520/p/9785552.html