文章目录
概念:
i: input输入
o: out输出
流:数据(字符,字节)
字节输出流
outputStream字节输出流
fileoutputstream 文件字节输出流
Fileoutputstream(String name) //文件路径 指定文件写入输出文件流
Fileoutputstream(File file)//目的文件 创建一个指定file对象表示的文件中写入数据的文件输出
构造方法作用:
- 创建一个Fileoutputstream对象,
2**.根据传递的文件路径 创建一个空的文件**
3.把Fileoutputstream对象指向创建好的文件
写入数据的原理(内存–>硬盘)
java–> jvm -->os(操作系统)–>os调用写数据的方法–>把数据写入文件夹
字节输出流的使用步骤
1.创建一个Fileoutputstream对象,构造方法中传递写入数据目的地
2.调用Fileoutputstream对象中的writre,把数据写入文件夹
3.释放资源(清理内存)
基本原理
eg1(一个字节):
eg2(多个字节):
eg3:字符串
1.转换为字符数组
2.写入字符数组
eg:追加写/续写
append:追加写开关 true–不覆盖原文件;false–创建新文件覆盖原文件
字节输入流
子类方法:
int read()从输入中读取下一个字节
int read(byte[] b)读取字节数组
void close()关输入
作用:把硬盘数据读取到内存中
构造方法参数:
FileIntputstream(String name) //文件路径
FileIntputstream(File file)//目的文件
构造方法作用:
- 创建一个FileIntputstream对象,
2.把FileIntputstream对象指向要读取的文件
使用步骤
1.创建FileIntputstream对象,读取数据源
2.使用FileIntputstream对象中的方法read,读取文件
3.释放资源
eg1:单个读取,
读取文件
重复的过程,使用循环优化,当读取到-1的时候结束循环
eg2:多个字节读取
demo文件复制:
1.创建字节输入流,
2.创建一个字节输出流
3.用字节输入流对象read读取文件
4.使用字节输出流的write,输出到文件夹
5.释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class demotext {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream(".//d.txt");
FileOutputStream fos=new FileOutputStream(".//c.txt");
/*单个字节
int len=0;
while ((len=fis.read())!=-1)
{
fos.write(len);
}*/
//多个字节
byte[] bytes =new byte[1024];
int len=0;
while ((len=fis.read(bytes))!=-1)
{
fos.write(bytes,0,len);
}
//释放资源
fis.close();
fos.close();
}
}
字符输入流
字节流:每次读取一个字节 ,gbk 2个字节,utf-8 3个字节,每次读中文 就会只读取1/3中文 就会报乱码
字符流:可以一次读取一个字符包括中文
子类方法:
int read()从输入中读取下一个字节
int read(char[] cbuf)读取字节数组
void close()关输入
作用:把硬盘数据读取到内存中
构造方法参数:
FileReader(String name) //文件路径
FileReader(File file)//目的文件
构造方法作用:
- 创建一个FileReader对象,
2.把FileReader对象指向要读取的文件
使用步骤
1.创建FileReader对象,读取数据源
2.使用FileReader对象中的方法read,读取文件
3.释放资源
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class demotext {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader(".//d.txt");
/*
单个字符
int len=0;
while ((len=fr.read())!=-1)
{
System.out.println((char)len);
}
*/
//多个字符
char[] cs =new char[1024];
int len=0;
while ((len=fr.read(cs))!=-1)
{
System.out.println(new String(cs,0,len));
}
fr.close();
}
}
字符输出流
使用步骤
1.创建FileWriter对象,读取数据源
2.writer方法,把数据写到内存中(字符转换为字节)
3.flush方法,把缓存区的数据刷新到文件夹中
4.释放资源。(也会刷新缓冲区,释放资源,但是流对象不能再使用)
/*
//文件的复制
1.创建字节输入流,
2.创建一个字节输出流
3.用字节输入流对象read读取文件
4.使用字节输出流的write,输出到文件夹
5.释放资源
*/
import java.io.*;
public class demotext {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter(".//k.txt",true); //1.创建对象, //续写,不覆盖
/*
//单个个字符
fw.write(97); //2.写资源
fw.flush();//3.刷新缓冲区
fw.close(); //4.关的时候也会刷新缓冲区
*/
/*
//多个字符
char[] cs ={'松','哥','6','6'};
fw.write(cs);
// fw.write(cs,1,3); //写1-3位的字符
fw.flush();
fw.close();
*/
//字符串
fw.write("松哥666"+"\n");
fw.flush();
fw.close();
}
}
Properties集
Properties类持久的属性集,可保存在流中或从流中加载
Properties唯一和IO流结合的集合
properties是双列集合,key和value都是String
store方法,集合数据存入硬盘
load方法,读取数据到集合
Property集合存储遍历
setProperty(String key,String value)调用hashtable的put方法
Setset=prop.stringPropertyNames(); 返回属性的健集,其中健值对应的是字符串
prop.getProperty(key);通过key找到value值
使用步骤
1.创建Properties对象
2.使用setProperty往集合添加数据
3.返回属性的健集,
4.获取健值
import java.util.Properties;
import java.util.Set;
public class demo6 {
public static void main(String[] args) {
//1.创建Properties对象
Properties prop=new Properties();
//2.使用setProperty往集合添加数据
prop.setProperty("松哥","666");
prop.setProperty("龙哥","777");
prop.setProperty("谦哥","888");
// Set<String> .stringPropertyNames() 3.返回属性的健集,
Set<String>set=prop.stringPropertyNames();
for (String key: set) {
//4.获取健值
String value=prop.getProperty(key);
System.out.println(value);
}
}
}
store方法
void store(OutputStream out,String comments) 字节输出流
void store(Writer writer,String comments) 字符输出流
comments:注释,不能采用中文,默认unicode
使用步骤:
1.创建Properties对象
2.创建字节/字符输出流对象,绑定输出地
3.使用properties的strore方法,把数据写入硬盘
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Properties;
import java.util.Set;
public class demo6 {
public static void main(String[] args) throws IOException {
//1.创建Properties对象
Properties prop=new Properties();
//2.使用setProperty往集合添加数据
prop.setProperty("松哥","666");
prop.setProperty("龙哥","777");
prop.setProperty("谦哥","888");
//3.创建输出流
FileWriter writer=new FileWriter(".//e.txt");
//4.用Properties方法中的store方法写入硬盘
prop.store(writer,"data");
writer.close();
}
}
load方法
void load(InputStream in) 字节输入流
void load(Reader reader) 字符输入流
注
1.健与值默认=,空格,
2.可以使用#注释
3.健值默认字符串,不需要加引号
使用步骤
1.创建Properties对象
2.创建输入流
3.用load方法保存健值对的文件
4.遍历集合
5.关流
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Properties;
import java.util.Set;
public class demo6 {
public static void main(String[] args) throws IOException {
//1.创建Properties对象
Properties prop=new Properties();
//2.创建输入流
FileReader Reader=new FileReader(".//e.txt");
//3.读取输入流的健值对文件
prop.load(Reader);
//4.遍历
Set<String> set =prop.stringPropertyNames();
for (String key:set) {
String value=prop.getProperty(key);
System.out.println(value);
}
//5.关流
Reader.close();
}
}
缓冲流
不用缓存 一个一个a,传完了传b
用缓存 ,a,c,b,d放入缓存区,然后一下发给用户
字节输出缓冲流
构造方法:
BufferedOutputStream(Outputstream out)
BufferedOutputStream(Outputstream out,int size)
Outputstream:字节输出流
size缓存区大小
使用步骤
1.创建字节输出流
2.创建缓存流对象
3.调用write方法写数据
4.释放资源
import java.io.*;
public class demo7{
public static void main(String[] args) throws IOException {
//1.创建字节输出流
FileOutputStream fs=new FileOutputStream(".//f.txt");
//2.创建缓存流对象
BufferedOutputStream bos=new BufferedOutputStream(fs);
//3.调用write方法写数据
bos.write("松哥666".getBytes());
//4.释放资源
bos.close();
}
}
字节输入缓存流
构造方法:
BufferedInputStream(Inputstream In)
BufferedInputStream(Inputstream In,int size)
Inputstream:字节输出流
size缓存区大小
1.创建字节输入流
2.创建缓存流对象
3.调用read方法读数据
4.释放资源
import java.io.*;
public class demo7{
public static void main(String[] args) throws IOException {
//1.创建字节输出流
FileInputStream fis=new FileInputStream(".//f.txt");
//2.创建缓存流对象
BufferedInputStream bis=new BufferedInputStream(fis);
//3.调用read方法读数据
byte[] bytes=new byte[1024];
int len=0;
while((len= bis.read(bytes))!=-1)
{
System.out.println(new String(bytes,0,len));
}
//4.释放资源
bis.close();
}
}
字符输出缓冲流
构造方法:
BufferedWriter(Writer out)
BufferedWriter(Writer out,int size)
Outputstream:字节输出流
size缓存区大小
void newline()行的分隔符
使用步骤
1.创建字符输出流,创建缓冲流对象
2.调用write方法写数据
3.刷新缓存区
4.释放资源
import java.io.*;
public class demo7{
public static void main(String[] args) throws IOException {
//1.创建字节输出流
FileWriter fw=new FileWriter(".//f.txt");
//2.创建缓存流对象
BufferedWriter bw=new BufferedWriter(fw);
//3.调用read方法读数据
for (int i = 0; i < 10; i++) {
bw.write("松哥666");
bw.newLine();
}
//4.释放资源
bw.flush();
bw.close();
}
}
字符缓冲输入流
构造方法:
BufferedReader(Reader out)
BufferedReader(Reader out,int size)
Reader:字节输入流
size缓存区大小
void readLine()行的分隔符
使用步骤
1.创建字符输入流,创建缓冲流对象
2.调用read方法写数据
3.刷新缓存区
4.释放资源
import javax.annotation.processing.Filer;
import java.io.*;
public class demo7{
public static void main(String[] args) throws IOException {
//1.创建字节输出流
FileReader fr=new FileReader(".//f.txt");
//2.创建缓存流对象
BufferedReader br=new BufferedReader(fr);
//3.调用read方法读数据
String line;
while ((line=br.readLine())!=null)
{
System.out.println(line);
}
//4.释放资源
br.close();
}
}
demo对文本排序
1.创建一个HashMap集合,存 序号-文本
2.创建字符缓冲输入流,字符缓冲输出流
3.字符缓冲输入流读取每行文本
4.把文本进行切割-properties集
5.切割好的排序
6.获得每个键值对遍历集合
7.把键值对拼接为文本
8.字符缓冲输出流输出到页面
9.释放资源
import javax.annotation.processing.Filer;
import java.io.*;
import java.util.HashMap;
public class demo7{
public static void main(String[] args) throws IOException {
//1.创建hashmap
HashMap<String,String>map=new HashMap<>();
//2.创建字节输出流
FileReader fr=new FileReader(".//f.txt");
BufferedReader br=new BufferedReader(fr);
FileWriter fw=new FileWriter(".//f.txt");
BufferedWriter bw=new BufferedWriter(fw);
//3.字符缓冲输入流读取每行文本
String line;
while ((line=br.readLine())!=null)
{
//4.把文本进行切割-properties集
String []arr=line.split("\\.");
//5.切割好的排序
map.put(arr[0],arr[1]);
}
//6.获得每个键值对遍历集合
for (String key:map.keySet()
) {
String value=map.get(key);
// 7.把键值对拼接为文本
line=key+"."+value;
//8.字符缓冲输出流输出到页面
bw.write(line);
bw.newLine();
}
//4.释放资源
br.close();
bw.close();
}
}
转换流
可以查询指定码表
原因:FileReader只能读取utf-8不能读取gbk码表
OutputStreamWriter
OutputStreamWriter(OutputStream out) //默认编码
OutputStreamWriter(OutputStream out,String charsetname) //指定编码
InputStreamReader
InputStreamReader(InputStream In) //默认编码
InputStreamReader(InputStream In,String charsetname) //指定编码
转码demo
1.创建InputStreamReader对象传入GBK
2.创建OutputStreamWriter对象UTF-8
3.InputStreamReader对象读取文件
4.OutputStreamWriter对象写入文件
5.释放资源
import java.io.*;
public class demo8 {
public static void main(String[] args) throws IOException {
InputStreamReader isr=new InputStreamReader(new FileInputStream(".//g.txt"),"GBK");
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(".//h.txt"),"Utf-8");
int len=0;
while ((len=isr.read())!=-1)
{
osw.write(len);
}
osw.close();
isr.close();
}
}
序列化流
把对象以流的方式写入硬盘
类object要实现标记行接口 Serializable
ObjectOutputStream流
步骤:
//1.创建序列流
//2.用writeobject方法
//3.释放资源
public class person implements Serializable {
private String name;
private int age;
public person() {
}
public person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.io.*;
public class demo8 {
public static void main(String[] args) throws IOException {
//1.创建序列流
ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream(".//k.txt"));
//2.用writeobject方法
oos.writeObject(new person("松哥",18));
//3.释放资源
oos.close();
}
}
ObjectInputStream流
反序列的前提
1.类必须实现 Serializable接口
2.必须存在对应的class文件
步骤:
//1.创建序列流
//2.用readobject方法
//3.释放资源
//4.打印对象
import java.io.*;
public class demo8 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建序列流
ObjectInputStream ois =new ObjectInputStream(new FileInputStream(".//k.txt"));
//2.用readobject方法
Object o=ois.readObject();
//3.释放资源
ois.close();
//打印对象
System.out.println(o);
person p=(person)o;
System.out.println(p.getName()+p.getAge());
}
}
瞬态关键字
static :静态 --不能被序列化的(不能被修改,写入的)
transient: 瞬态关键字 --也是不能被序列化的(不能被修改,写入的)