java学习---------IO流学习---文件流inputstream outputstream

文件流有很多类

FileInputStream FileoutputStream FileReader FileWriter

BufferedInputStream BufferedOutputSteam BufferReader BufferWriter 缓冲流  它们用来加快读取时间的,

然后直接看代码了:

第一个知识点是文件的创建和目录的创建:

/*
 * File:既可以表示文件(.txt,doc,ppt,mp3,...)也可以表示文件目录(即文件夹),与平台无关
 * File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。
 * 路径:相对路径 % 绝对路径
 */
	@Test
	public void test2() throws IOException{
		//采用字符串的形式,如果文件目录不存在,先执行文件的目录创建,再执行文件的创建
		String filename = "G:\\test\\io2\\IO.txt";
		File file = new File("G:\\test\\io2\\IO.txt");
		boolean b = file.exists();
		System.out.println(b);
		if(!file.exists()){//如果文件不存在的话,那么需要去创建
			//boolean b1 = file.createNewFile();//直接执行代码,肯定有系统找不到指定路径的异常抛出
			boolean b1 =new File(filename.substring(0, filename.lastIndexOf("\\"))).mkdirs();//创建目录
			if(b1){
				boolean b2 = file.createNewFile();//创建文件
				System.out.println(b2);
			}
			
		}
	}

这里我们需要知道目录创建和文件的创建有什么不同:

函数介绍:

目录操作相关 mkDir()只能创建一级目录 mkDirs()可以创建多级目录 list() listFiles()

文件操作相关 createNewFile() 创建文件的, delete() 删除文件的

测试代码:

运行看看就知道是什么样子的,

	@Test
	public void test1() throws IOException{
		//File file = new File("helloworld.txt");
		File file = new File("G:\\test\\io\\hellowordl.txt");
		
		boolean b = file.exists();
		System.out.println(b);
		if(!file.exists()){
			//boolean b1 = file.createNewFile();//直接执行代码,肯定有系统找不到指定路径的异常抛出
			boolean b1 = file.mkdirs();//创建目录
			System.out.println(b1);
		}
		
		//System.out.println("!"+file.delete());
		
		File file1 = new File("file");
		System.out.println(file1.exists());
		
		if(!file1.exists()){
			boolean b2 = file1.mkdir();//默认路径是user.dir,也就是当前项目的路径下面
			System.out.println("@"+b2);
		}
	}

上面的代码来自尚硅谷课程代码 大家自己可以去下载

二 输入流的测试:

	/**
	 * 测试输入流,也就是从外部存储设备中读取数据到程序的内存中,称作输入操作
	 * @throws Exception 
	 */
	@Test
	public void testFileInputStream() throws Exception{
		//首先需要一个文件,可以放到参数里面
		File file = new File("file/iotest.txt");
		//接下来需要申明一个输入流操作,注意是文件输入流,它是基类InputStream的子类
		FileInputStream in = new FileInputStream(file);//存在文件没有找到的异常
		//接下来需要从输入流中把内容数据读出来,
		char temp ;//临时保存内容
		if((in.read())!=-1){
			temp =(char) in.read();//这种读法是每个字符每个字符的读取,而且这里读取的是第二个字符了,因为上面的if语句里面已经读取了一个字符了
			System.out.println(temp);
		}
	}

上面的函数使用的是read(),它只能一个字符一个字符的读,

	@Test
	public void testFileInputStream() throws Exception{
		//首先需要一个文件,可以放到参数里面
		File file = new File("file/iotest.txt");
		//接下来需要申明一个输入流操作,注意是文件输入流,它是基类InputStream的子类
		FileInputStream in = new FileInputStream(file);//存在文件没有找到的异常
		//接下来需要从输入流中把内容数据读出来,
		int i ;//临时保存内容
		while((i=in.read())!=-1){
			char temp =(char)i;//这种读法是每个字符每个字符的读取,而且这里读取的是第二个字符了,因为上面的if语句里面已经读取了一个字符了
			System.out.print(temp);
		}
	}

输出结果:就是文件里面所有的字符

最后一定要加上这一句:in.close();

这里我把它单独写出来,是因为显眼些:原因是

程序中打开的文件流io资源不属于内存里的资源,java垃圾回收机制无法回收该资源,所以需要显是关闭文件的io流

比较标准的写法:

	public void testFileInputStream1() {
		// 1.创建一个File的对象
		File file = new File("file/iotest.txt");
		// 2.将此File类的对象作为形参传递给InputStream的实现类FileInputStream的构造器中
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			// 3.通过调用流的read()方法将文件中的内容读入
			int i;
			while ((i = fis.read()) != -1) {
				System.out.print((char) i);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				// 4.关闭现有的流
				if (fis != null) {
					fis.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

三 测试输出流,也就是写操作:将内存中的数据输出到外部设备中,比如磁盘,光盘,等

	// 测试输出流:将程序的内存数据输出到外部设备上,简称写操作
	@Test
	public void testFileOutputStream() {
		File file = new File("file/outputstream.txt");
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			byte[] b = "now is outputstream test!".getBytes();//将一个字符串转换成byte数组
			fos.write(b);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券