java_IO流(黑马程序员)

------- android培训、java培训、期待与您交流! ----------


io流其实就是把输入输出操作封装为了对象;

当你操作字符时,用到的是Reader,Writer;你操作字节时,用到的是inputStream,outputStream;

所以,其实在你读数据的时候,会把字节都装到流对象中;然后再根据你的需要去操作;

1FileWriter是文件的写流;

主要方法:创建流对象FileWriter fw=new FileWriter(filename);//filename为目的文件

文件的写fw。write(String str);

当文件写在流里时,你需要吧文件写到硬盘中; fw。flush();是刷新流;或者fw。close();刷新并关闭流;

下面是demo:

public static void FileWtiterdemo()
	{
		FileWriter fw=null;
		try {
			fw = new FileWriter("e:\\demo.txt");//可以有两个参数,第二个为true时为文件的续写!
			fw.write("hello java!");
			fw.write(2);//注意这里的int其实为字符的ascII值!
			fw.write("\r\n");//在windows中的回车符号位\r\n
			fw.write('i');
			fw.append(" love java!");
			fw.flush();//刷新缓冲区!
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally//标准io异常的处理,主要是为避免空指针引用异常
		{
			if(fw!=null){
					try {
						fw.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
			}
		}
	}


2FileReader是文件的读取流

主要方法:创建对象FileReader fr=fr。FileReader(filename);

文件的读取mychar=fr。read();当你读取后返回一个int型的字符;(char)mychar强转就可以;

另一种重载做法是int num=fr。read(buf);buf为一个char【】所以你必须先建立一个char【】 buf=new char[5];

然后就是你读取的字符会到了buf中;

;流的关闭fr.close();

下面是read的两种方法:

public static void FileReaderdemo1()
	{
		FileReader fr=null;
		try {
			 fr = new FileReader("e:\\demo.txt");
			 char[] buf = new char[20];	//显然这种读取方式更加快捷!
			 int num=0;
			 while((num=fr.read(buf))!=-1)//注意的是这些都是java返回-1为结束标记!
			 {
				 System.out.print(new String(buf,0,num));
			 }
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally
		{
			if(fr!=null){
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}	
		}	
	}
	public static void FileReaderdemo2()
	{
		FileReader fr=null;
		try {
			 fr = new FileReader("e:\\demo.txt");
			 int mychar=0;
			 while((mychar=fr.read())!=-1)
			 {
				 System.out.print((char)mychar);
			 }
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally
		{
			if(fr!=null){
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}	
		}
	}

3什么是装饰设计模式?

装饰设计模式是用来扩充,扩展原有类功能;把原类的应用传入装饰类;然后对原类进行包装和重做;

就好比你有一个房间,但是你看他不好看了;想换一种风格;怎么办?可以继承,换一套房子;然后呢;好吧,我知道你就会成为一个房奴了;

我想你不会那样做!呵呵,可行的做法是:装修一下!给家里换一套风格;

这就是装饰设计模式;

谈到这里就可以想到BufferedWriter与BufferedReader了;怎么用呢?
FileReader fr=null;   
BufferedReader bufr=null;
try {
fr=new FileReader("e:\\java1\\demo.java");
bufr=new BufferedReader(fr);
}
就可以了;这是这两个类的基本用法;理解了装饰设计;就不难理解他了;当然在BufferedReader到底有什么不同呢?就多了一个readLIne();一次可以读去一行;不必再一个字一个字的读了;
  用法:

	//其实bufferedReader是一个包装类
	//LineNumberReader也是一个包装类,方法都一样,就是多了一个getLineNumber()的方法!
	//
	public static void buffereddemo()
	{
		BufferedReader bufr=null;
		try {
			 bufr= new BufferedReader(new FileReader("e:\\demo.txt"));
			 String line=null;
			 while((line=bufr.readLine())!=null)
			 {
				 System.out.println(line);//注意这里的readline不会包含行终止符。所以用println!
			 }
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally
		{
			if(bufr!=null)
			{
				try {
					bufr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	public static void myReadLine() throws IOException
	{
		myReadLine mr = new myReadLine(new FileReader("e:\\demo.txt"));
		String str = new String();
		while((str=mr.readLine())!=null)
		{
			System.out.println(str);
		}
	}
}
 class myReadLine
{
	private FileReader fr;
	public myReadLine(FileReader fr)
	{
		this.fr = fr;
	}
	public String readLine()throws IOException
	{
		StringBuilder mystr = new StringBuilder();
		int ch;
		while((ch=fr.read())!=-1)
		{
			if(ch=='\r')
				continue;
			if(ch=='\n')
				return mystr.toString();
			else 
				mystr.append((char)ch);//时刻注意ch为一个int类型,不强转会传入数字!
		}
		if(mystr.length()!=0)//这一句非常重要,不然不会返回最后一行!
			return mystr.toString();
		return null;
	}
}

5作为io流的操作:InputStream,OutputStream;是和reader,writer相对应的操作;
我们可以读取二进制的数据;所以方法都是一样的;

6很重要的的一个东东就是转换流了;
主要的对象就是inputStreamreader和outputStream了
主要用法:FileReader  fr=new InputStreamReader(new FileInputStream("***"));
FileWriter  fw=new  OutputStreamWriter(new FileOutputStream("***"));
这样就是转换流的主要改变方式;
1.他可以改变我们的字节流为字符流!这样就可以方便读写了;
2.最重要的是编码的改变;我们知道字符的编码哟很多,比如ascii码,gbk码,utf-8码。这些都有对应的编码;
我们如果想要其中之中编码的文件;就可以利用字节转换流来做;就可在 OutputStreamWriter(new FileOutputStream("***"),"utf-8");
默认的是gbk的码,这样就可以变成utf-8的码了;十分好用;
所以io是很常用的东西;我们必须知道怎么用?
1.明白源和目的;
2.知道是字节流还是字符流;
3.查找具体的对象如:用Filereader  还是reader;最主要看是否为文件操作!
4.是否要用流的转换;比如你要用键盘录入一个信息;要用到System.in对象;那么你就需要转换为字符流来读取
Reader  d=new  InputStreamReader(System.in);就可以了;
5.当然你是否要用到缓冲技术?用得到就用BufferedReader和BufferedWriter吧,里面装一个字符流对象。
而且在java中还可以改变源和目的的位置:
可以用到System.setIn(pra);System.setOut(pra);pra为参数,这样就可以把目的改为对应的对象pra了;

	//转换流是由于字符需要转向字节而产生的,所以都是在字符流中;所以InputStreamReader
	//和OutputStreamWriter;其设计是看你的需求。到底是字符转字节,用InputStreamReader
	//传入一个字符对象进去;
	//还有一个更特殊的就是制定编码表!!!只有转换流可以指定编码表!!!
	public static void InputStreamDemo() throws IOException
	{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader  br = new BufferedReader(isr);
		String line = br.readLine();
		System.out.println(line);
	}
	//System.setIn()是一个改变system的默认源的函数
	//System.setOut()是一个改变system的默认目标的函数

6在之前的io流中有对文件的操作,那么在我们的在java中有对对象的封装对象File;
File是文件对象
1创建:File   f=new File("c:\\1.java");或File   f=new File("c:\\"+"1.java");当然也可以是文件名;
这一步的作用是建立一个文件对象,并不会在硬盘上出现;
2产生:f.createNewFile();就可以成功在硬盘上创建了;
3删除:f.delete();f.deleteOnExits();可以删除文件;后者是在程序退出是删除;当然可以删看那个文件夹;
4创建文件夹:由于文件与文件夹的不同,在创建文件夹的时候,可以用到mkdir();mkdirs();有一层目录与多层的区别;
5获取属性:暂且怎么叫吧,呵呵,你可以用file对象获得相应的东西:
f.getName();//获得名称;
f.getPath();//获得路径;
f.getParent();//获得父目录;
f.getModified();//获得最后一次修改时间;
f.getLength();//获得文件长度;
6判断文件:f.existes();//是否存在;
f.isFile();//是否为文件;
f.isDirectory();//是否问目录;
当然啊,在文件的对象下会有很多static函数;
 
1比如File.listRoots();会返回一个File的数组;可以这么获得他的所有盘符;
File[] r=File.listRoots();
for(String e:r)
{
System.out.Println(e); }
2.那怎么获得文件夹或者文件呢;有f.list();会返回该f对象下的所有文件对象;当然可以过滤文件用FilenameFilter;
他是一个接口;我们来复写这个文件过滤器吧:
String  fname=f.list(new  FilenameFilter(
public boolean accept(File dir,String name)
{
return  name.endsWith(".txt");
}
)
     );
那么我们想一下怎么获得他所有的文件?包括文件夹内的?用到了递归算法;
public static void sub3(File dir)throws Exception
{
       File[]  mydir=dir.listFiles()
for(File dir2:mydir)

   if(dir2.exists()&&dir2.isDirectory())
{    System.out.println("wenjianjia:"+dir2.getName());
                        sub3(dir2);}
    else 
                  {System.out.println("    "+"zi:"+dir2.getName());}
}
  思想就是递归;我们的会用层层遍历的思想去浏览所有的文件;
这里注意!!!list()返回的是字符串String的名字;而listFiles()会返回file的对象方便我们操作;

7首先来看一下properties对象吧!
    Propertise的作用是用来对计算机的配置文件进行操作的对象!注意!他是一个对象;java中万物皆为对象!
    Propertise  info=new Properties();可以创建一个java的properties对象;
    它主要是封装了键值对的操作!key=value;
    你可以用set.property("key","value");来设置键值对;
    也可以用get.property("key");通过key的值来获取value的值;
    一般涉及集合的对象,都会有一个遍历操作对象的方法;stringPropertyNamespace();//注意string的第一个字母是小写!
    当然遍历的操作会给你一个Set集合我们用泛型设为String既可以Set<String>;
    
    你可以设一个FileinputStream的对象来传入一个流对象;也可以一个FileOutputStream流对象;
    我想java工程师一定是大牛的啦;
    所以必须有一个对象操作啦:1.load();//从一个流对象中传入一个配置文件;2.store();//把文件传入到一个配置文件;
    
    当然流对象在jdk1.6以后就支持FileReader与FileWriter对象了

8首先是关于序列化对象ObjectStream
    对象序列化的目的是把一个对象本地化存储;
    构造函数为ObjectOutputStream  oos=new ObjectOutputStream(OutputStream);//参数为一个outputStream对象;大部分还是以
    FileOutputStream为主!因为本地对象在一个文件中,当然文件的扩展名你随便写;因为里面是一个对象;
    你想获得这个本地对象的话要用到ObjectInputStream ios=new ObjectInputStream(InputStream);对象;依旧传入有一个流对象;为输出流!
    你必须有一对象才可以本地序列化!如person
    class person implements Serializable//必须继承Serializable接口!因为你的对象必须要有一个属性
    {                                   //在序列化对象中有一个public static final long serialVersionUID
         ...                            //这个UID就是每个对象所特有的东西,他是对象的对象属性及其对象的方法决定的;每个对象必定只有这一个UID
    }                                   //当然这个属性有什么用?  唯一的标记这个对象!
    你存入这个对象是用到oos.WriteObject(new person());
    取出这个对象用的是person obj=(person)ios.readObject();
    obj就是你的对象了,你就可以操作它了!
    
    Serializable接口中的serialVersionUID的作用是你存的对象可以用同一个操作修改;
    在取出这个对象时需要person强转!这就要求UID的值在内存和硬盘中的一样!
    
2.管道流PipedInputStream和PipedOutputStream
    管道流的作用:去连接管道中io流;
    建议:你应该去建立两个线程分别取封装这两个管道!在单线程可能会死锁!
    创建方法:1.PipedInputStream(PipedOutputStream());//在参数的位置去传入一个管道流!
              2.PipedInputStream(); 利用方法connect(PipedOutputStream());就可以建立连接了!
    这样建立了连接之后;用pis。read读取数据;用pos。write写出数据!
    管道流到底有什么作用呢?
    他可以建立一个连接;方便了程序中的输入与输出同时进行!
    
3.RandomAccessFile随机读写文件流
    特殊方法: .getFilePointer();//获得指针位置;
                .seek(long length);//通过length大小可以跳到指定位置!
    首先你必须要建立一个RandomAccessFile(filepath,mode);//对象中mode表示指定的mode即“r”“rw”;等
    raf.write();//要写入一个int的后八位!转化为字节!当你传入259的时候;就会出现错了!
    raf.writeint();//写32位的int整数!


------- android培训、java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值