黑马程序员---java学习笔记之IO

1、汉字编码表的发展:GB2312----->GBK------->GB18030

        统一编码表的发展:Unicode------->utf-8

2、java对数据的操作时基于流的方式,操作流按照操作数据分为两种:字符流和字节流,按照流方向分为输入流和输出流。

3、javaIO流中的四大抽象几类:Reader、Writer、InputStream、OutputStream。

4、字符流中FileWriter

Writer

        |------OutputStreamWriter

                |------FileWriter

以上是FileWriter 的继承体系,该类是用来操作文件的“写”。FileWriter的构造函数中没有空参的,该类对象一被初始化就需要有一个操作对象。如果没有操作对象,就根据构造函数中的参数创建一个;如果有,也创建一个新的覆盖掉原来的。另外,该类很多的方法都会抛出IOException。

public static void main(String[] args) {
		
		
		FileWriter fw = null;
		
		try{
			fw = new FileWriter("C:\\Users\\AZhan\\Desktop\\demo.txt");
			fw.write("abcdfakhdfakjsbd");
		}
		catch(IOException e)
		{
			System.out.println(e.toString());
		}
		finally
		{
			try{
				if(fw != null)
					fw.close();
			}
			catch(IOException e)
			{
				System.out.println(e.toString());
			}				
		}
	}

5、小细节

        a):流对象建立以后,它之中有一个缓冲;该缓冲是基于字节流的,其中的数据可以通过flush函数刷新到硬盘的文件中

        b):java中怎么把一个数组变成字符串,首先使用的一种方式是Arrays工具类中的toString()方法(这种方法比较保险),其次是,如果数组是规定类型的,你可以使用构造String对象的方式(如果不是unicode编码的,可能会出错)。示例如下

int[] arr = {1,2,3,4};
		
		System.out.println(Arrays.toString(arr));//打印结果是:[1, 2, 3, 4]
		
		System.out.println(new String(arr,0,arr.length));//打印结果是:乱码


6、FileWriter类中的构造函数中的FileWriter(filename String)和FileWriter(finame String, boolean append);前者在对流对象初始化时,如果指定目录下有同名文件就创建一个空文件覆盖该文件;而后者最初始化流对象时,有同名文件时,要根据第二个参数append的布尔值决定是否覆盖,是true就不覆盖,是false就覆盖。

7、对windows下文本文件操作时,回车符是'\r\n',对Linux下文件操作时,回车符是‘\n’

8、FileReader类有两种读取方式:read()和read(char[] buf),前者是单字符读取,读到文件末尾时返回-1,后者是把数据读到一个字符数组中,返回的是读取数组的个数,读到文件末尾是也返回-1.

9、字符输入流和字符输出流的综合问题,复制(未处理异常)

public static void main(String[] args)throws IOException {
		// TODO Auto-generated method stub
		
		FileReader fr = new FileReader("F:\\ArrayTool.java");
		FileWriter fw = new FileWriter("D:\\1.java");
		
		
		char[] buf = new char[1024];
		
		int num = 0;
		while( (num = fr.read(buf)) != -1 )
		{
			fw.write(buf);
			fw.flush();
		}
		fr.close();
		fw.close();
	}
10、RuntimeException异常在用户输入数据错误,而不是程序本身出错时被使用的。用户输入数据的错误,是程序员不能处理的,需要用户改正错误后再继续操作。

11、字符缓冲技术的原理是什么呢?字符缓冲技术的对象里面封装了数组,先把数据放进该数组里,然后再一次性的写出去。
12、字符缓冲输入输出流的综合示例:复制(含异常处理)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferdDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		
		try
		{
			//输入流及其缓冲流
			FileReader fr = new FileReader("F:\\javaworkplace\\workspace\\practice\\src\\com\\day18\\BufferdDemo.java");
			br = new BufferedReader(fr);
		
			//输出流及其缓冲流
			FileWriter fw = new FileWriter("C:\\demo.txt");
		
			bw = new BufferedWriter(fw);
		
			String str = null;
			while((str = br.readLine()) != null)
			{
				bw.write(str);
				bw.newLine();
				bw.flush();
			}
		}
		catch( IOException e )
		{
			throw new RuntimeException("写入数据失败");
		}
		finally
		{
			try
			{
			if( br != null )
				br.close();
			}
			catch(IOException e)
			{
				throw new RuntimeException("输入流关闭失败");
			}
			finally
			{
				try
				{
					if( bw != null )
						bw.close();
				}
				catch( IOException e )
				{
					throw new RuntimeException("输出流关闭失败");
				}
			}
		}
		

	}

}
13、BufferedReader类中的readLine方法可以读取一行的内容,但这部分内容不包括换行符。

14、装饰设计模式

当你想对已有对象的功能增强时,你可以定义一个类,把想要增强功能的类对象传递进去,基于已有的功能,提供加强的功能,那么这个定义的类就叫做装饰类。举个例子,输入流中的Reader类与Bufferedreader类,就使用了这个模式。

15、复制一张图片(无缓冲区)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyImageDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		FileInputStream fis = new FileInputStream("C:\\Users\\AZhan\\Desktop\\1234.jpg");
		FileOutputStream fos = new FileOutputStream("C:\\Users\\AZhan\\Desktop\\littlegirl.jpg");
		
		byte[] buf = new byte[1024];
		int len = 0;
		while( (len = fis.read(buf)) != -1 )
		{
			fos.write(buf,0,len);
		}
		fos.close();
		fis.close();
		
	}

}
16、复制一个MP3文件,之后并使用音乐播放器播放该MP3文件。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3Demo {


	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		FileInputStream fis = new FileInputStream("C:\\Users\\AZhan\\Desktop\\终于等到你.mp3");
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		FileOutputStream fos = new FileOutputStream("C:\\Users\\AZhan\\Desktop\\1.mp3");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		byte[] buf = new byte[1024*4];
		int len = 0;
		while( (len = bis.read(buf))!= -1 )
		{
			bos.write(buf,0,len);
			bos.flush();
		}
		bis.close();
		bos.close();
		
		Runtime.getRuntime().exec("E:\\KwDownload\\kuwo\\KWMUSIC2013\\KwMusic.exe "+
									"C:\\Users\\AZhan\\Desktop\\1.mp3");

	}

}

17、键盘输入时,使用了InputStream抽象类中的read()方法,该方法jdk对它的解释是读取下一个字节,我就想如果我键盘录入的是一个汉字(两个字节),会返回什么

public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		InputStream in = System.in;
		
		int temp = in.read();
		
		System.out.println(temp);

	}

我输入的是一个"张"字,返回的213.这说明对输入是没有限制的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值