Java基础——IO流

Posted SkyeAngel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础——IO流相关的知识,希望对你有一定的参考价值。

IO流
1.java.io.File
  1.凡是与输入输出相关的类、接口都定义在java.io下
  2.File是一个类,可以由构造器创建其对象。此对象对应着一个文件(.txt .avi .ppt .doc .mp3 .jpg)或文件目录
  3.File类对象是与平台无关的(Java的跨平台特性)
  4.File中的方法,仅涉及到如何创建,删除,重命名等(表面功夫),只要涉及到文件内容的,File是无能为力的,必须由io流来完成
  5.File类的对象常常作为io流的具体类的构造器的形参


  访问文件名:
    getName()
    getPath()
    getAbsoluteFile()
    getAbsolutePath()
    getParent()
    renameTo(File newName)//重命名
      boolean b = file1.renameTo(file2);//要求1.file1文件存在,file2文件不存在。2.file1 file2 类型相同(文件或文件目录)

  文件检测
    exists()
    canWrite()
    canRead()
    isFile()
    isDirectory()

  获取常规文件信息
    lastModified()
    length()

  文件操作相关
    createNewFile()
    delete()

  目录操作相关
    mkDir() //创建一个文件目录,只有在上层文件目录存在的情况下,才返回true
    mkDirs()//创建一个文件目录,若上层文件目录不存在,一并创建
    list() //返回当前文件夹下的内容,是String[]形式的 String[] str = file1.list();
    listFiles()//返回当前文件夹下的内容,是File[]形式的,可以继续后面对文件的操作 File[] files = file1.listFiles();

IO流
  1.流的分类
    按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)(处理的文本文件)
    按数据流的流向不同分为:输入流,输出流
    按流的角色的不同分为:节点流(直接作用于文件的),处理流

  2.IO的体系:
    抽象基类     结点流(文件流)     缓冲流(处理流的一种)
    InputStream   FileInputStream       BufferedInputStream
    OutputStream   FileOutputStream       BufferedOutputStream
    Reader     FileReader          BufferedReader
    Writer       FileWriter             BufferedWriter
 
  对于非文本文件(视频,图片,音频),只能使用字节流实现文件的复制FileInputStream、FileOutputStream
  对于文本文件,还可以只用字符流FileReader、FileWriter

FileReader、FileWriter
在使用时,只是在读取那里char[] c = new char[20];其他地方与 FileInputStream、 FileOutputStream差不多

@Test
	public void testInputFileStream1() {
		//2.创建一个FileInputStream类的对象
		FileInputStream fis = null;
		try {
			//1.创建一个File类的对象
			File file = new File("tests.txt");
			fis = new FileInputStream(file);
			//3.调用FileInputStream的方法,实现file文件的读取
			/*public int read(byte[] b)
			 *读取文件的一个字节,当执行到文件结尾时,返回-1 
			 */
			byte[] b = new byte[5];
			int len;
			while((len = fis.read(b)) != -1) {
				String str = new String(b, 0, len);//注意不是b.length,否则最后一步没有覆盖完的字符也会输出出来
				System.out.print(str);
			}
		}  catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				//4.关闭相应的流
				fis.close(); 
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
	
	//使用try-catch方式处理异常更合理:保证流关闭操作一定可以执行
	@Test
	public void testInputFileStream() {
		//2.创建一个FileInputStream类的对象
		FileInputStream fis = null;
		try {
			//1.创建一个File类的对象
			File file = new File("tests.txt");
			fis = new FileInputStream(file);
			//3.调用FileInputStream的方法,实现file文件的读取
			/*
			 *read():读取文件的一个字节,当执行到文件结尾时,返回-1 
			 */
			int b;
			while((b = fis.read()) != -1) {
				System.out.print((char)b);
			}
		}  catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				//4.关闭相应的流
				fis.close(); 
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

  

 

@Test
	public void testFileOutputStream() {
		//1.创建一个File对象,指明要写入的文件位置
		//输出的物理文件可以不存在,当执行过程中,若不存在,会自动创建。若存在,会将原有的文件覆盖
		File file = new File("Love.txt");
		//2.创建一个FileOutputStream类的对象,将file的对象作为形参传递给FileOutputStream	的构造器中
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			//3.调用FileOutputStream的方法,进行写入操作
			//fos.write("I love China!");
			fos.write(new String("I love you! I love China").getBytes());
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(fos != null) {
				try {
					//4.关闭对应的文件
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}

	}

  

//从硬盘读取一个文件,并写入到另一个位置(相当于复制)
	@Test
	public void testCopyFile() {
		
		long start = System.currentTimeMillis();
		String src = new String("C:\\Users\\hasee\\Desktop\\QQ截图20171106155140.png");
		String dest = new String("C:\\Users\\hasee\\Desktop\\4.jpg");
		copyFile(src, dest);
		long end = System.currentTimeMillis();
		System.out.println("花费的时间为: " + (end - start));
	}
	
	public void copyFile(String src, String dest){
//		File file1 = new File("Love");//注意后缀,有和没有是不同的
//		File file2 = new File("Love2.txt");
		//File file1 = new File("C:\\Users\\hasee\\Desktop\\QQ截图20171107180120.png");//注意后缀,有和没有是不同的
		File file1 = new File(src);
		File file2 = new File(dest);//两种格式都可以复制过来
		
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(file1);
			fos = new FileOutputStream(file2);
			
			byte[] b = new byte[5];
			int len;
			while((len = fis.read(b)) != -1) {
				//fos.write(b);错误的写法两种:fos.write(b, 0, b.length);
				fos.write(b, 0, len);
			}
		}catch(Exception e){
			e.printStackTrace();
		} finally {
			if(fos != null) {
				try {
					fos.close();
				}catch(IOException e) {
					e.printStackTrace();
				}finally {
					if(fis != null) {
						try {
							fis.close();
						}catch(IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}

  






















































以上是关于Java基础——IO流的主要内容,如果未能解决你的问题,请参考以下文章

Java IO流基础总结

Java : java基础 IO流

java基础之 IO 流(输入/出字符流)

Java基础总结IO流

java基础之 IO 流(RandomAccessFile类)

[Java基础]字符缓冲流