admin 管理员组文章数量: 887007
io流讲解
文章目录
- io流
- 概念
- 类
- FileInputStream---字节输入流
- FileOutputStream---字节输出流
- 字节输入输出的综合使用---复制文件
- FileReader---字符输入流
- FileWriter---字符输出流
- 节点流和处理流
- BufferedReader和BufferedWriter
- BufferedReader
- BufferedWriter
- BufferedInputStream和BufferedOutputStream
- 序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
- 标准输入流与表准输出流
- 标准输入流(System.in)
- 标准输出流(System.out)
- 转换流
- PrintStream字节打印流和PintWriter字符打印流
- Properties类
- 使用io流时可能遇到的问题
- 文件访问路径问题
- 读写冲突问题
io流
概念
- 文件:保存数据的地方
- 文件流:文件在程序中是以流的形式来操作的
类
FileInputStream—字节输入流
public static void tes1() throws IOException {//字节输入流//创建字节输入流对象FileInputStream file=new FileInputStream("D:\\QQ\\3054897093\\FileRecv\\数据结构\\图书.txt");int result;//接受读取的数据/** read()方法每次读取一个字节,没有数据返回-1* read(char[] c)每次读取字节数组大小的数据,不够则读取剩余的数据*/while((result=file.read())!=-1){System.out.print((char)result);//将读取到的数据转换为字符输出}byte[] c=new byte[100];while((result=file.read(c))!=-1){//输出读取到的字节数组,但是由于汉字是三个字节组成的,所以这种读取方法读取汉字会发生乱码System.out.println(new String(c,0,result));}file.close();//关闭流
}
FileOutputStream—字节输出流
public static void tes2() throws IOException {//字节输出流//创建字节输出流对象,文件不存在就会指定位置创建一个文件FileOutputStream file=new FileOutputStream("D:\\图书.txt",true);String s="Hello,word!";/** new FileOutputStream(String s),这种方式写入的内容是从头开始的,也就是多次写入是会覆盖之前写入的内容的* new FileOutputStream(String s,true),追加写入* write()可写入单个字节* write(byte(),0,4)也可写入一个字节数组,或写入数组的某一部分,但是下标不能越界*/file.write(s.getBytes());// file.write(s.getBytes(),0,11);file.close();//关闭流
}
字节输入输出的综合使用—复制文件
public static void tes3() throws IOException {//综合使用,文件复制,文件可以是文字,图像,音频等//创建文件输入流FileInputStream fileInputStream=new FileInputStream("D:\\笔记\\java图片\\1.png");//创建文件输出流FileOutputStream fileOutputStream=new FileOutputStream("D:\\2.png");byte[] bytes=new byte[1024];//创建字节数组int index;//定义索引,记录每次查询到的字节数量while((index=fileInputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,index);}fileInputStream.close();//关闭流fileOutputStream.close();//关闭流
}
FileReader—字符输入流
public static void te8() throws IOException {//字符输入流FileReader fileReader=new FileReader("D:\\QQ\\3054897093\\FileRecv\\数据结构\\图书.txt");char[] x=new char[150];int index;//while((index=fileReader.read(x))!=-1){// System.out.print(new String(x,0,index));//}while((index=fileReader.read())!=-1){System.out.print((char)index);}fileReader.close();
}
FileWriter—字符输出流
此类操作完之后数据并没有立即写入文件,而是在内存(缓存区)中,需要执行flush()方法或者close()方法,将数据写到文件中,如果不执行这两个方法,则文件中仍不会有数据!!!
节点流和处理流
- 节点流:可以从一个特定的数据源读写数据,如FileReader、FileWriter
- 处理流:也叫包装流,是“连接”已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
- 在包装流中有Reader属性,可以封装一个节点流
BufferedReader和BufferedWriter
是按字符读取数据的,不能读取字节文件,如音频,视频,word文档,pdf等
BufferedReader
public static void te9() throws IOException {//字符处理流BufferedReader file=new BufferedReader(new FileReader("D:\\QQ\\3054897093\\FileRecv\\数据结构\\图书.txt"));String s;while((s=file.readLine())!=null){//整行读取System.out.println(s);}file.close();
}
BufferedWriter
public static void tes4() throws IOException {//字符处理流//处理流追加写入还是在字节流创建时设置BufferedWriter file=new BufferedWriter(new FileWriter("D:\\图书.txt",true));String s="Hello,word!";file.write(s);file.newLine();file.close();
}
BufferedInputStream和BufferedOutputStream
public static void tes5() throws IOException {//字节处理流//与字节流使用类似,只是BufferedOutputStream必须要有close()或者flush()操作,否则数据不会写入文件BufferedInputStream bi=new BufferedInputStream(new FileInputStream("D:\\壁纸\\19BEADA9C73466F375DB69BC16AE5170.mp4"));BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("D:\\2.mp4"));byte[] bytes=new byte[1024];int index;while((index=bi.read(bytes))!=-1){bo.write(bytes,0,index);}bo.close();bi.close();
}
序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
- 读写顺序要一致
- 要求序列化或反序列化对象实现Serializable
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
- 序列化对象时,默认将里面所有的属性都进行序列化,但除了static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经实现了序列化
标准输入流与表准输出流
标准输入流(System.in)
- 是System类中的一个属性,编译类型为inputstream类,运行类型为BInputStream类
- System类中的 public final static InputStream in = null;
标准输出流(System.out)
- System类中的 public final static PrintStream out = null;
- 编译类型和运行类型都为PrintStream类
转换流
public static void tes6() throws IOException {//转换流是字符流String filepath="D:\\图书.txt";String filepath1="D:\\图书1.txt";//可以在传入字节流时指定编码格式InputStreamReader isr=new InputStreamReader(new FileInputStream(filepath),"GBK");OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(filepath1),"UTF-8");char[] bytes=new char[10];int index;while((index=isr.read(bytes))!=-1){osw.write(bytes,0,index);System.out.print(new String(bytes,0,index));}osw.close();isr.close();
}
public static void tes7() throws IOException {//转换流是字符流,但仍是字节流,一般会转换为处理流以提高效率String filepath="D:\\图书.txt";String filepath1="D:\\图书1.txt";//可以在传入字节流时指定编码格式BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(filepath),"GBK"));BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filepath1), StandardCharsets.UTF_8));String s;while((s=br.readLine())!=null){bw.write(s);bw.newLine();}bw.close();br.close();
}
- InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)
- OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
- 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
- 可以在使用时指定编码格式(比如utf-8, gbk , gb2312, IS08859-1等)
PrintStream字节打印流和PintWriter字符打印流
public static void tes8() throws IOException {//默认输出位置为控制台PrintStream out=System.out;out.print("123");out.close();//修改默认输出位置为指定文件System.setOut(new PrintStream("D:\\图书2.txt"));System.out.print("hello 苏相甲!");
}
Properties类
public static void tes9() throws IOException {//Properties类---读取文件String filepath="src\\suan\\Study\\jdbc.properties";Properties properties=new Properties();properties.load(new FileReader(filepath));properties.list(System.out);System.out.println();String user = properties.getProperty("user");String mima = properties.getProperty("mima");System.out.println(user);System.out.println(mima);
}
public static void test1() throws IOException {//Properties类---读取文件String filepath="src\\suan\\Study\\jdbc1.properties";Properties properties=new Properties();properties.setProperty("zhanghao","123456");properties.setProperty("mima","123456111");properties.setProperty("ip","123.456.786.541");//创建文件,后面的null值是增加的注解说明,可以添加,若不想添加,填null即可properties.store(new FileWriter(filepath),null);
}
tes9输出信息
– listing properties –
mima=qweewqasddsa
user=654456321123
ip=123.321.123.456
654456321123
qweewqasddsa
- load: 加载配置文件的键值对到Properties对象
- list:将数据显示到指定设备
- getProperty(key):根据键获取值
- setProperty(key,value):设置键值对到Properties对象
- store:将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码
使用io流时可能遇到的问题
文件访问路径问题
在io流中读取文件,若不加相对路径和绝对路径的话(即只使用文件名来定位文件),则默认在jvm所在的路径查找文件(即项目根目录)。
如,在IDEA中通过以下方式读取abc.txt文件,则该文件必须在根目录下,否则会报java.io.FileNotFoundException异常。
File file = new File("abc.txt");
读写冲突问题
在使用io流时,应避免同时使用输入流和输出流对同一个文件进行操作,因为这样会产生读写冲突,很可能会使文件的内容为空!!!!
本文标签: io流讲解
版权声明:本文标题:io流讲解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732352681h1533533.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论