文档章节

文件流的输入输出

chenruibing
 chenruibing
发布于 2015/06/14 20:00
字数 2077
阅读 29
收藏 0
点赞 0
评论 0

字节流的文件读取和字符流的文件读取基本上是一摸一样的。。。

缓冲区的操作是在内存中操作的。。。把硬盘数据弄到缓冲区中,然后从缓冲区里面取就可以。


字节流的输入输出

/*
异常的三种抛出方式,一种是用捕获异常的方式,在本函数抛出,一种是用间接法调用函数,
中间那个函数要捕获,最后那个函数要抛出,抛出给中间的函数捕获,一种是本函数直接抛出异常,但是他的所有父函数都要
抛出异常知道遇到捕获或者遇到主函数,由主函数抛给操作系统。。。

字节流的文件读取和字符流的文件读取基本上是一摸一样的。。。

缓冲区的操作是在内存中操作的。。。把硬盘数据弄到缓冲区中,然后从缓冲区里面取就可以。

*/
import java.io.*;
public class anli
{
	public static void main (String[] args)throws IOException//第三种方法的抛出异常
	{
		//fileoutputstream();  //普通的输入
		//filearray();   //按照字节数组的输入
		long beggin = System.currentTimeMillis();  //获取当前时间的方法,时间要用long来存放,这样子才能减少溢出的情况发生
		availabledemo(); //字节流特有的获取文件长度方法
		long end = System.currentTimeMillis();
		sop(end-beggin);
	}
	//这种方式会读取数据更快,但是可能有内存溢出的危险。
	public static void availabledemo()throws IOException
	{
		FileInputStream fi = new FileInputStream ("anli.java");
		int number = fi.available();     //available是字节流特有的操作,可以得出文件的长度,一次性读取数据而不需要用while循环。
									//但是available很容易就发生内存溢出。。。虚拟机启动了,默认是64兆的
		byte[] bt = new byte[number];    
		int length = 0;   
		while ((length = fi.read(bt))!=-1)  
		{
			sop(new String(bt,0,length));   
		}
	}
	public static void filearray()throws IOException
	{
		FileInputStream fi = new FileInputStream ("anli.java");
		byte[] bt = new byte[1024];    //使用的是字节数组
		int length = 0;   //返回个数要考虑换行符,换行符占据两个字节。。。\r\n
		while ((length = fi.read(bt))!=-1)  //除了读取行的是返回null,其他的一般都是返回-1
		{
			sop(new String(bt,0,length));   //String构造器的使用
		}
	}
	public static void fileoutputstream()throws IOException
	{
		FileOutputStream fs = new FileOutputStream ("demo.txt",true);
		fs.write("aafgg".getBytes());  //字节流的输入方式唯一的区别就是,输入的参数是字节,这里调用的是String的getBytes的方法。。。
		fs.close();
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}


字符流的输入输出

字符缓存流的输入输出


package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception {    //要嘛就跑出异常,要嘛就用try对每个操作捕获异常
		FileWriter fw = new FileWriter("demo.txt",true);  //加上true,使文件不会被覆盖
		FileReader fr = new FileReader("string.txt");
		BufferedWriter bfw = new BufferedWriter(fw);
		BufferedReader bfr = new BufferedReader(fr);
		String str1 = null;
		while((str1 = bfr.readLine())!=null){
			bfw.write(str1);
			bfw.newLine(); //要加上换行,因为readline()是不会读取换行的
			bfw.flush();
		}
		bfw.close();
		bfr.close();
		
		//第一种读取数据的方法,是一个一个读取的,效率不高,缓冲区是第二种读取数据的方法,效率高
		FileReader fr1 = new FileReader("string.txt");
		int term;
		while((term = fr1.read())!=-1){
			print((char)term);   //read的返回值一直都是整形
		}
		fr1.close();
		
		
		
		//第三种读取数据的方法  是通过数组的
		FileReader fr2 = new FileReader("string.txt");   //对文件操作的流
		char[] array = new char[1024];  //数据作为参数传递进去之后,数据就存放在数组里面
		int term1;   //返回值就是数据的长度
		while((term1 = fr2.read(array))!=-1){
			print(new String(array,0,term1));
		}
		fr2.close();


		FileReader fr3 = new FileReader("string.txt");
		LineNumberReader lnr = new LineNumberReader(fr3);
		lnr.setLineNumber(6);
		String str3 = null;
		while((str3 = lnr.readLine())!=null){
			print(lnr.getLineNumber()+"******"+str3);   //在输出的时候对每一行都获取当前行数
			System.out.println();  //readline()不获取换行,所以输出的数据都会在同一行上
		}
		
	}
	static public void print(Object obj){
		System.out.print(obj);
	}
}


标准输入输出流(System.in   System.out)的使用

当录入一行数据后就对该行数据打印

package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		InputStream is = System.in;
		InputStreamReader isr = new InputStreamReader(is);  //字节流通向字符流
		BufferedReader bfr = new BufferedReader(isr);   //记得这里是bufferedreader  这里很不理解
		
		BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
		String str = null;
		while((str = bfr.readLine())!= null){
			if("over".equals(str))break;
			bfw.write(str.toUpperCase());
			bfw.newLine();
			bfw.flush();
			//print(str.toUpperCase());
		}
		bfr.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
重新分配标准输入输出流
package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		System.setIn(new FileInputStream("string.txt")); //重新分配标准输出设备
		System.setOut(new PrintStream("demo.txt")); //重新分配标准输出设备
		InputStream is = System.in;
		InputStreamReader isr = new InputStreamReader(is);  //字节流通向字符流
		BufferedReader bfr = new BufferedReader(isr);   //记得这里是bufferedreader  这里很不理解
		
		BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
		String str = null;
		while((str = bfr.readLine())!= null){
			if("over".equals(str))break;
			bfw.write(str.toUpperCase());
			bfw.newLine();
			bfw.flush();
			//print(str.toUpperCase());
		}
		bfr.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}

把流中的数据加载到集合中,并把集合中的修改操作同步到流中


package hanshi.net;
import java.util.*;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		Properties prop = new Properties();
		FileInputStream fis = new FileInputStream("string.txt");
		prop.load(fis);             //把流中的数据加载到集合中
		prop.list(System.out);   //把集合中的数据全部包装后输出到参数指定的位置
		
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
对多个流进行合成  也可以用于文件或者视频等的合成和分割,可用于加密解密


package hanshi.net;
import java.util.*;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		Vector<FileInputStream> al = new Vector<FileInputStream>();   //合成的是vector集合里面所存放的集合
		al.add(new FileInputStream(new File("string.txt")));
		al.add(new FileInputStream(new File("demo.txt")));


		File file = new File("file.txt");
		if(!file.exists())file.createNewFile();      //如果指定的文件不存在则自己创建一个文件
		FileOutputStream fi = new FileOutputStream(file);


		Enumeration<FileInputStream> em = al.elements();         //关键部分就只有这两行
		SequenceInputStream sis = new SequenceInputStream(em);



		byte[] by = new byte[1024];
		int len = 0;
		while((len = sis.read(by))!=-1){
			fi.write(by,0,len);
		}
		fi.close();
		sis.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
操作对象的对象流,保留对象的数据以便下次可以再次使用


package hanshi.net;
import java.io.*;
class Person implements Serializable{     //实现序列号接口  让对象变成了唯一性
	int age;
	String name;
	static String sex = "nv";         //静态不参与到合成序列号
	Person(int age,String name){
		this.age = age;
		this.name = name;
	}
	public String toString(){
		return (age+"***"+name+"***"+sex);
	}
}
public class count {
	public static void main(String[] args)throws Exception { 
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("string.txt"));
		oos.writeObject(new Person(12,"chenruibing"));
		oos.close();
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("string.txt"));
		Person person = (Person)ois.readObject();  //返回值一定是object,所以要强制类型转换
		print(person);
		
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
操作数据的数据流


package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("string.txt"));
		dos.writeUTF("您好");
		dos.writeUTF("我也好");
		dos.close();
		DataInputStream dis = new DataInputStream(new FileInputStream("string.txt"));
		
		print(dis.readUTF());
		print(dis.readUTF());
		dis.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}



package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("string.txt"),"UTF-8");
		osw.write("我叫陈锐炳");
		osw.close();
		InputStreamReader isr = new InputStreamReader(new FileInputStream("string.txt"),"GBK");
		char[] c = new char[10];
		int len = 0;
		while((len = isr.read(c))!=-1){
			print(new String(c,0,len));
		}
		//print(isr.read());
		isr.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}


PrintStream流

Date date = new Date();
PrintStream ps = new PrintStream ("demo.txt");
ps.println(date.toString());    //把内容写入ps指定的文件



流的小应用

当录入一行数据后就对该行数据打印(字节流的方式)


package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		InputStream is = System.in;
		StringBuilder sb = new StringBuilder();
		int term;
		while(true){
			term = is.read();
			if(term == '\t')continue;
			if(term =='\n'){
				String s = sb.toString();
				if("over".equals(s))break;
				print(s.toUpperCase());
				sb.delete(0, sb.length());
			}
			else{
				sb.append((char)term);
			}
		}
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
当录入一行数据后就对该行数据打印

        字节流转成字符缓存流的方式,可以使用整行读取的方式,这也是转变的原因,就是为了使用其他流字符流具有而字节流没有的功能


package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		InputStream is = System.in;
		InputStreamReader isr = new InputStreamReader(is);  //字节流通向字符流
		BufferedReader bfr = new BufferedReader(isr);
		String str = null;
		while((str = bfr.readLine())!= null){
			if("over".equals(str))break;
			print(str.toUpperCase());
		}
		bfr.close();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}
对指定目录进行所有文件和文件夹的遍历并且删除自己指定的文件


package hanshi.net;
import java.io.*;
public class count {
	public static void main(String[] args)throws Exception { 
		File[] file = File.listRoots();  //列出可用的文件系统根
		for(File f : file){
			print(f);
		}
		File file1 = new File("H:\\");
		showdir(file1);
	}
	public static void showdir(File f){    //遍历指定目录下的所有文件和目录
		File[] files = f.listFiles();
		for(int i=0; i<files.length;i++){
			if(files[i].isDirectory()){
				showdir(files[i]);
			}
			else{
				if(files[i].length()==0){
					print(files[i]);
					files[i].delete();
				}
			}
		}
		if(f.length()==0)
			f.delete();
	}
	static public void print(Object obj){
		System.out.println(obj);
	}
}



© 著作权归作者所有

共有 人打赏支持
chenruibing
粉丝 12
博文 203
码字总数 109101
作品 0
潮州
C++输入和输出流(一)——标准输入输出

目录 目录 前言 IO流的概念和流类库的结构 总结 前言 对于C++的输入输出,总是会遇到一些小细节,然后会有一些疑惑。在学习了C++输入输出流后,未知的更多,但是有了整体的一个概念! 学习!...

simonforfuture
01/07
0
0
C++输入和输出流(二)——文件输入输出

目录 前言 C++输入和输出流(一)——标准输入输出记录了和的一些使用总结。本文记录文件输入输出的一些代码,理论太多了,其实看完代码,大概就可以使用了。 文件I/O 文件输入流:ifstream 文...

simonforfuture
01/07
0
0
最新版ffmpeg源码分析一:框架

(ffmpeg v0.9) 框架最新版的ffmpeg中发现了一个新的东西:avconv,而且ffmpeg.c与avconv.c一个模样,一研究才发现是libav下把ffmpeg改名为avconv了. 到底libav与ffmpeg现在是什么个关系?我...

晨曦之光
2012/03/12
0
0
JavaSE的输入流、输出流

首先是四大基本抽象流,具体如下: 字节流 字符流 输入流 InputStream Reader 输出流 OutputStream Writer 以上四个流都是抽象流)(但不是抽象类),通常我们使用的都是它们的子类(注意是通...

天蚕宝衣
2016/06/07
43
0
java Stream的理解

流是 Java 中最重要的基本概念之一。文件读写、网络收发、进程通信,几乎所有需要输入输出的地方,都要用到流。 流是做什么用的呢?就是做输入输出用的。为什么输入输出要用“流”这种方式呢...

双鱼一分之一
2016/11/04
7
0
C++中输入输出流及文件流操作笔记

1、流的控制 iomanip 在使用格式化I/O时应包含此头文件。 stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2、类继承关系 ios是抽象基类,由它派生出istream类和o...

沙米笔记
2016/06/26
1K
7
浅谈 JAVA中的IO流

流的分类 java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输...

旋转木马-千里马
2016/01/20
28
0
JAVA 字符流与字节流的区别

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicod...

owensliu
2014/03/25
0
1
java文件输入输出

在java程序中,对于数据的输入/输出操作以流(Stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据,I/O流提供一条通道程序,可以使...

开源中国段子手
2015/11/23
120
0
FFMPEG 入门

ffmpegX.png 前言 FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。 本...

音视频直播技术专家
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java的反射机制理解

一、概念说明 java的反射机制,是在运行状态下,可以动态获取任意一个类的属性和方法;可以动态调用一个对象任意方法; 二、反射相关类 java.lang.Class; //类 java.lang.re...

盼望明天
6分钟前
0
0
nginx反向代理-多端口映射

代码解释 1.1 http:www.baidu.test.com默认是80,访问“/”利用反向代理,然后访问本地8083; 1.2 8083代表本地的前端工程访问地址,前端需要访问后台数据,”/”,继续代理到后台地址9803; ...

lilugirl
7分钟前
0
0
Jfinal使用log4j2打印日志

1,添加maven配置 <properties><log4j2.version>2.11.0</log4j2.version><slf4j.version>1.7.25</slf4j.version></properties> <!--slf4j及log4j2日志 --><dependency> ......

iborder
8分钟前
0
0
如何在Rancher 2.0上快速部署Datadog

Datadog是一种流行的托管监控解决方案,用于聚合和分析分布式系统的指标和事件。从基础架构集成到协作仪表板,Datadog为用户提供了一个简洁的单一窗格视图,用户可以快速查看对其最重要的信息...

RancherLabs
11分钟前
0
0
Java示例演示Functor 和monad

This article was initially an appendix in our Reactive Programming with RxJavabook. However introduction to monads, albeit very much related to reactive programming, didn't suit......

Quan全
29分钟前
0
0
微信官方jssdk Demo

1.html部分 <!DOCTYPE html><!-- saved from url=(0028){sh:$selfUrl} --><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8"......

koloor
33分钟前
1
0
数据库命名规范

https://www.cnblogs.com/pangguoming/p/7126512.html 摘要:当前研发工作中经常出现因数据库表、数据库表字段格式不规则而影响开发进度的问题,在后续开发使用原来数据库表时,也会因为数据...

塔塔米
33分钟前
0
0
java https 请求工具类-通用

package com.ra.common.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintW......

轻量级赤影
34分钟前
0
0
MFC界面套包BCG Pro Edition for MFC正式发布v27.3|附下载

BCGControlBar Professional Edition for MFC是MFC的一个扩展库,您可以用来构建类似于Microsoft Office 2000/XP/2003/2007/2010/2013 和 Microsoft Visual Studio-like(打印、用户定制工具......

Miss_Hello_World
34分钟前
0
0
Spring Cloud云服务 - HongHu架构common-service 项目构建过程

上一篇我们介绍了《整合spring cloud云服务架构 - HongHu云架构common-service代码结构分析》,本节我们将对common-service整个项目进行剖析,将整个构建的流程给记录下来,让更多的关注者来...

itcloud
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部