java-流
1. 如何处理文件中的内容?
通过java提供输入输出流;来处理文件中的内容数据。
2. 什么是流?
电流:负电荷的正向移动轨迹
水流:水的移动轨迹。
Java中的流:数据的移动轨迹。
3. 什么是输入输出流?
按照数据的流向:
输入流:数据从本程序之外的地方[文件]引入到本程序中时所形成的移动轨迹就是输入流。
【读取数据】
输出流:数据从本程序中流向本程序之外的地方[文件]所形成的移动轨迹就是输出流。
【写出数据】
4. 流的另一个分类
按照每一次读写数据的量:
- 字节流:每一次可以读/写,一个字节,8位2进制数据的量,由于所有的数据都可以转换成字节,因此字节流可以处理任何类型的数据【文本,图片,视频,音频…】
- 字符流:每一次可以读/写,一个字符,16位2进制数据的量,只能处理文本型数据【word文档,记事本文件】,不能处理图片,视频,音频这些类型的文件。
5. 字节流:
按照数据的流向:
字节输出流【写出数据】
在java中表示字节输出流使用OutputStream类
OutputStream类是一个抽象类,不能通过new的方式创建对象,需要借助子类来创建对象。
OutputStream抽象类是字节输出流的顶级父类。
FileOutputStream类是OutputStream抽象类的子类。
FileOutputStream类能通过new的方式创建对象。
java.io. FileOutputStream
public class FileOutputStream extends OutputStream
构造方法摘要 | |
---|---|
FileOutputStream(File file)通过File对象创建一个字节输出流。 参数:File file–指定数据输出位置 | |
FileOutputStream(File file, boolean append) 通过File对象创建一个可以追加内容的字节输出流。 参数1:File file–指定数据输出位置 参数2:boolean append–指定是否追加 | |
FileOutputStream(String name) 通过String对象创建一个字节输出流。 参数:String name–指定数据输出位置 | |
FileOutputStream(String name, boolean append) 通过String对象创建一个可以追加内容的字节输出流。 参数1:String name–指定数据输出位置 参数2:boolean append–指定是否追加 |
package com.Kweilin_Fang.test1;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class FileOutputTestClass {
public static void main(String[] args) throws FileNotFoundException {
//字节输出流
//OutPutStream--抽象类
//FileOutPutStream--构造方法
//创建文件对象,执行字节输出流制定输出位置
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest1.txt");
FileOutputStream fileout1=new FileOutputStream(file1);
File file2=new File("G:"+File.separator+"testfile"+File.separator+"mytest1.txt");
FileOutputStream fileout2=new FileOutputStream(file2,true);
String path="G:"+File.separator+"testfile"+File.separator+"mytest1.txt";
FileOutputStream fileout3=new FileOutputStream(path);
String path1="G:"+File.separator+"testfile"+File.separator+"mytest1.txt";
FileOutputStream fileout4=new FileOutputStream(path1,true);
//上转型对象创建字节流数处对象
File file3=new File("G:"+File.separator+"testfile"+File.separator+"mytest1.txt");
OutputStream fileout5=new FileOutputStream(file3);
OutputStream fileout6=new FileOutputStream(file3,true);
String path2="G:"+File.separator+"testfile"+File.separator+"mytest1.txt";
OutputStream fileout7=new FileOutputStream(path2);
OutputStream fileout8=new FileOutputStream(path2,true);
}
}
通过输出流对象写出数据:
void | write(byte[] b)将字节数组中的所有数据全部写出到字节输出流中。 |
---|---|
void | write(byte[] b, int off, int len) 将字节数组中的从off开始len个数据写出到字节输出流中。。 |
void | write(int b) 将一个字节的数据写出到字节输出流中。 |
void | close() 关闭字节输出流 |
package com.Kweilin_Fang.test1;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class FileOutputTestClass2 {
public static void main(String[] args) throws IOException {
//字节输出流
//OutPutStream--抽象类
//FileOutPutStream--构造方法
//创建文件对象,执行字节输出流制定输出位置
/**
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest1.txt");
FileOutputStream out1=new FileOutputStream(file1);
//准备写出的数据
String infoString="hello你好";
byte data[]=infoString.getBytes();
out1.write(data);
out1.close();
*/
/**
//第二种方法
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest2.txt");
FileOutputStream out1=new FileOutputStream(file1,true);
String infoString="hello你好";
byte data[]=infoString.getBytes();
out1.write(data,0,5);
out1.close();
*/
/**
//第三个写方法 写出一个字符
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest3.txt");
OutputStream out=new FileOutputStream(file1,true);
out.write(97);
out.close();
*/
//拓展写出一串数据 循环方法
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest4.txt");
OutputStream out=new FileOutputStream(file1,true);
String info="hello world";
byte by[]=info.getBytes();
for (byte b : by) {
out.write(b);
}
out.close();
}
}
6.字节输入流【读取数据】
在java我们使用InputStream类表示一个字节输入流。
InputStream类是一个抽象类,不能通过new的方式创建对象,需要借助子类来创建对象。
InputStream抽象类是字节输入流的顶级父类。
FileInputStream类是InputStream抽象类的子类。
FileInputStream类能通过new的方式创建对象。
构造方法摘要 | |
---|---|
FileInputStream(File file) 通过File对象创建一个字节输入流对象。 File file—指定输入位置 | |
FileInputStream(String name) 通过String对象创建一个字节输入流对象。 String name—指定输入位置 |
package com.Kweilin_Fang.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class FileInputStreamClass {
public static void main(String[] args) throws FileNotFoundException {
// 字节输入流
//InputStream抽象类
//构造方法
File file=new File("G:"+File.separator+"testfile"+File.separator+"myfile1.txt");
FileInputStream filein1=new FileInputStream(file);
String path="G:"+File.separator+"testfile"+File.separator+"myfile1.txt";
FileInputStream filein2=new FileInputStream(path);
//上转型对象建立字节流输入对象
File file1=new File("G:"+File.separator+"testfile"+File.separator+"myfile1.txt");
InputStream filein11=new FileInputStream(file1);
String path1="G:"+File.separator+"testfile"+File.separator+"myfile1.txt";
InputStream filein22=new FileInputStream(path1);
}
}
通过字节输入流读取数据:
int | read()从此输入流中读取一个数据字节。 返回值下一个数据字节,如果已到达文件末尾,则返回 -1。 |
---|---|
int | read(byte[] b) 将数据读取到字节数组中。 返回值是读取的字节总数,如果到达文件末尾返回-1。 |
int | read(byte[] b, int off, int len)将数据读取到的数据保存在字节组的off位置和len个数据 返回值是读取的字节总数,如果到达文件末尾返回-1。 |
void | close() 关闭字节输入流 |
package com.Kweilin_Fang.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FileInputStreamClass2 {
public static void main(String[] args) throws Exception {
// 字节输入流读取数据操作动作
/**
//int read(byte[] b) 将数据读取到字节数组中。 返回值是读取的字节总数,如果到达文件末尾返回-1。
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest4.txt");
FileInputStream in1=new FileInputStream(file1);
//创建一个保存读取的字节数组,不浪费空间可以使用文件对象的字节长度的犯法
byte data[]=new byte[(int) file1.length()];
int len=in1.read(data);
//将保存的字节数据转换成String,输出
String info=new String(data,0,len);
System.out.println("读取道德数据是=="+info);
in1.close();
*/
/**
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest4.txt");
FileInputStream in1=new FileInputStream(file1);
byte data[]=new byte[(int) file1.length()];
int len=in1.read(data,4,4);
//将保存的字节数据转换成String,输出
for (byte b : data) {
System.out.println(b);
}
String info=new String(data,0,data.length);
System.out.println("读取到的数据是=="+info);
in1.close();
*/
/**
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest4.txt");
InputStream in1=new FileInputStream(file1);
int data=in1.read();
System.out.println("读取的一个字节数据=="+data);
in1.close();
*/
File file1=new File("G:"+File.separator+"testfile"+File.separator+"mytest4.txt");
InputStream in1=new FileInputStream(file1);
//准备保存数据的字节数组
byte []data=new byte[(int)file1.length()];
//保存读取来的字节数据对应的整数数量
int temp=0;
//定义保存数组下标的变量
int len=0;
while ((temp=in1.read())!=-1) {
data[len]=(byte)temp;
len++;
}
//将保存的字节数据转换成String输出
String info=new String(data,0,data.length);
System.out.println("读取到的字节数据是=="+info);
in1.close();
}
}
案例:
将指定位置照片转义至另外一个文件夹
package com.Kweilin_Fang.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class CopyImgClass {
public static void main(String[] args) throws Exception {
//读取图片位置
File file1=new File("G:"+File.separator+"文件夹名称"
+File.separator+"文件夹名称"+File.separator+"无标题.png");
//读取存放图片的位置
File file2=new File("G:"+File.separator+"testfile"+File.separator+"无标题.png");
//字节输入流
InputStream in1=new FileInputStream(file1);
OutputStream out1=new FileOutputStream(file2);
//创建一个保存读取的字节数组,不浪费空间可以使用文件对象的字节长度的方法
byte byimg[]=new byte[(int) file1.length()];
int len=in1.read(byimg);
out1.write(byimg);
in1.close();
out1.close();
}
}