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.这说明对输入是没有限制的。