----------android培训、java培训、java学习型技术博客、期待与您交流!------------
在此,分享一下自己学习JAVA的学习心得。有不对的地方请帮忙改正,也希望对想学java的同学有帮助!
JAVA基础
—IO流
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
二、操作字节数组:
ByteArrayInputStream:可以取出被缓存的byte数组
构造:ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。 方法:read();
ByteArrayOutputStream:类似于一个byte数组的缓存。可以向其中添加byte数组
构造:ByteArrayOutputStream():创建一个新的 byte 数组输出流。
方法:toByteArray():获取内部的所有数据。
操作字符数组
CharArrayReader
CharArrayWrite
操作字符串
StringReader
StringWriter
三、打印流:
1.字节打印流:PrintStream
1.字节打印流:PrintStream
2.字符打印流:PrintWriter
打印流的特点:
1.只能操作目的地,不能操作数据。(只能写,没有读)
2.可以操作任意类型的数据。
3.如果启动了自动刷新,能够自动刷新。
4.可以操作文件的流:
1)基本字节流:
2)缓冲区字节流:
3)基本字符流:
4)缓冲区字符流
5)打印流
6)都可以操作文件
将PrintWriter作为Writer使用:PrintWriter是Writer的子类,必然会实现Writer中的所有抽象方法;
自动刷新:
使用构造方法:
PrintWriter(OutputStream out, boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) :创建新 PrintWriter。
autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
自动刷新:
使用构造方法:
PrintWriter(OutputStream out, boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) :创建新 PrintWriter。
autoFlush - boolean 变量;如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区
Java练习代码:
练习:使用打印流复制文本:
public class Demo {
public static void main(String[] args) {
// 1.读取流
try {
BufferedReader in = new BufferedReader(new FileReader(
"printWriter_test.txt"));
// 2.输出流
PrintWriter out = new PrintWriter("copy.txt");
// 3.开始复制
String row = null;
while ((row = in.readLine()) != null) {
// out.write(row);
// out.write("\r\n");
out.println(row);// print() + newLine()
}
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
RandomAccessFile类:
1.此类的实例支持对随机访问文件的读取和写入。
2.RandomAccessFile类不属于流,是Object类的子类。
3.它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
常用方法:
1.writeXxxx()
2.readXxxx()
3.getFilePointer():获取当前的文件指针的偏移量
4.seek():设置当前文件指针的偏移量;
2.RandomAccessFile类不属于流,是Object类的子类。
3.它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
常用方法:
1.writeXxxx()
2.readXxxx()
3.getFilePointer():获取当前的文件指针的偏移量
4.seek():设置当前文件指针的偏移量;
序列化和反序列化:(重点)
1.序列化流:ObjectOutputStream:它可以将一个对象写入到文本文件中,或者通过网络传输;
2.反序列化流:ObjectInputStream:它可以将一个序列化的对象反序列化;
注意:
1.需要被序列化的对象必须实现java.io.Serializable接口;
2.Serializable接口没有任何方法。没有任何方法的接口,叫:标记接口。
3.一个类的对象被序列化后,可能会被更改,如果发生更改后,再反序列化,将会抛出java.io.InvalidClassException异常;
解决方法:需要被序列化的类中添加serialVersionUID变量;此变量如果跟序列化的对象的值相同,就认为是相同版本的。
1.序列化流:ObjectOutputStream:它可以将一个对象写入到文本文件中,或者通过网络传输;
2.反序列化流:ObjectInputStream:它可以将一个序列化的对象反序列化;
注意:
1.需要被序列化的对象必须实现java.io.Serializable接口;
2.Serializable接口没有任何方法。没有任何方法的接口,叫:标记接口。
3.一个类的对象被序列化后,可能会被更改,如果发生更改后,再反序列化,将会抛出java.io.InvalidClassException异常;
解决方法:需要被序列化的类中添加serialVersionUID变量;此变量如果跟序列化的对象的值相同,就认为是相同版本的。
Java代码:
练习:序列化反序列化
public class Demo {
public static void main(String[] args) {
// 1.序列化
// Student stu = new Student("张三",20,'男');
try {
/*
* ObjectOutputStream out = new ObjectOutputStream( new
* FileOutputStream("ObjectOutputStream.txt"));
* out.writeObject(stu); out.close(); System.out.println("输出完毕!");
*/
// 返序列化
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"ObjectOutputStream.txt"));
Object obj = in.readObject();
Student stu2 = (Student) obj;
System.out.println("读取的内容:" + stu2.getName() + "--" + stu2.getAge()
+ "--" + stu2.getSex());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Student类:
<span style="font-size:18px;">import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 可以指定sex不被序列化使用关键字:transient
private transient char sex;
//构造函数
public Student(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
<span style="white-space:pre"> </span>//无参,构造函数
public Student() {
super();
}
<span style="white-space:pre"> </span>//get和set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}</span>
properties类:
Properties类用于操作配置文件:
1.它集成自Hashtable,所以Properties就是一个Map;
2.特有的方法:Properties中的键和值都是String类型;
public Object setProperty(String key,String value)
public String getProperty(String key)
public Set<String> stringProperty
3.Properties类操作配置文件:使用此类操作配置文件是非常方便,不用自己去一行一行的去读,还得一行一行的解析;
public void load(Reader reader):读取
public void store(Writer writer,String comments):写入
public void load(Reader reader):读取
public void store(Writer writer,String comments):写入
Java代码:
练习:
public class Demo {
public static void main(String[] args) {
// 将Properties作为Map使用
Properties pro = new Properties();
// 填充集合
pro.put("it001", "张三");
pro.put("it002", "李四");
pro.put("it003", "王五");
// 遍历集合
Set keySet = pro.keySet();
for (Object obj : keySet) {
System.out.println("键:" + obj + " 值:" + pro.get(obj));
}
// 测试Properties的特有方法:
// setProperties(String key,String value):它相当于Map的put()方法
Properties pro2 = new Properties();
pro2.setProperty("it004", "章子怡");
pro2.setProperty("it005", "邓超");
pro2.setProperty("it006", "陈赫");
// 通过某个键获取值:getProperties():它相当于Map的get()方法
String v1 = pro2.getProperty("it005");
System.out.println("v1 = " + v1);
// 遍历
// stringPropertyNames():它相当于Map的keySet()方法
Set<String> keySet2 = pro2.stringPropertyNames();
for (String s : keySet2) {
System.out.println("键:" + s + " 值:" + pro2.getProperty(s));
}
}
}